@oneuptime/common 12.0.33 → 13.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.
Files changed (877) hide show
  1. package/Models/AnalyticsModels/RumSession.ts +117 -1
  2. package/Models/AnalyticsModels/RumSessionChunk.ts +13 -0
  3. package/Models/DatabaseModels/AlertCustomField.ts +77 -3
  4. package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
  5. package/Models/DatabaseModels/GlobalConfig.ts +12 -12
  6. package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
  7. package/Models/DatabaseModels/InventoryItem.ts +44 -1
  8. package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
  9. package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
  10. package/Models/DatabaseModels/NetworkDevice.ts +126 -0
  11. package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
  12. package/Models/DatabaseModels/RumApplication.ts +6 -6
  13. package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
  14. package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
  15. package/Models/DatabaseModels/TeamCustomField.ts +77 -3
  16. package/Models/DatabaseModels/TeamMember.ts +0 -9
  17. package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
  18. package/Models/DatabaseModels/TeamPermission.ts +3 -24
  19. package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
  20. package/Models/DatabaseModels/UserTelegram.ts +0 -4
  21. package/Scripts/benchmark-fanin-capacity.js +181 -0
  22. package/Server/API/TelemetryAPI.ts +1284 -164
  23. package/Server/API/UserNotificationSettingAPI.ts +55 -0
  24. package/Server/API/UserTelegramAPI.ts +48 -4
  25. package/Server/EnvironmentConfig.ts +82 -18
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.ts +91 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.ts +67 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.ts +139 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.ts +121 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.ts +25 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  32. package/Server/Infrastructure/QueueWorker.ts +20 -14
  33. package/Server/Infrastructure/Redis.ts +8 -8
  34. package/Server/Infrastructure/Semaphore.ts +2 -0
  35. package/Server/Infrastructure/Status.ts +10 -4
  36. package/Server/Middleware/TelemetryIngest.ts +453 -7
  37. package/Server/Services/AccessTokenService.ts +1 -0
  38. package/Server/Services/AlertCustomFieldService.ts +98 -0
  39. package/Server/Services/AlertService.ts +37 -0
  40. package/Server/Services/ApiKeyPermissionService.ts +461 -29
  41. package/Server/Services/CustomFieldMappingService.ts +879 -0
  42. package/Server/Services/DatabaseService.ts +65 -13
  43. package/Server/Services/GlobalConfigService.ts +194 -0
  44. package/Server/Services/IncidentCustomFieldService.ts +98 -0
  45. package/Server/Services/IncidentService.ts +35 -0
  46. package/Server/Services/InventoryItemService.ts +31 -1
  47. package/Server/Services/MetricService.ts +194 -0
  48. package/Server/Services/MonitorService.ts +32 -0
  49. package/Server/Services/MonitorTemplateService.ts +140 -19
  50. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +427 -66
  51. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +87 -2
  52. package/Server/Services/NetworkDeviceService.ts +69 -0
  53. package/Server/Services/ProjectService.ts +22 -0
  54. package/Server/Services/RoutineEmailSettingsService.ts +73 -0
  55. package/Server/Services/RumSessionReplayViewService.ts +104 -24
  56. package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
  57. package/Server/Services/ScheduledMaintenanceService.ts +32 -0
  58. package/Server/Services/TeamMemberService.ts +78 -0
  59. package/Server/Services/TeamPermissionService.ts +235 -3
  60. package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
  61. package/Server/Services/UserNotificationRuleService.ts +76 -25
  62. package/Server/Services/UserNotificationSettingService.ts +34 -6
  63. package/Server/Services/UserTelegramService.ts +326 -5
  64. package/Server/Types/Database/Permissions/ReadPermission.ts +45 -5
  65. package/Server/Types/Database/QueryHelper.ts +2 -0
  66. package/Server/Types/Database/QueryUtil.ts +56 -0
  67. package/Server/Types/Markdown.ts +93 -1
  68. package/Server/Utils/APIKey/AccessPermission.ts +5 -2
  69. package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
  70. package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
  71. package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
  72. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +82 -17
  73. package/Server/Utils/DataSource/EgressGuard.ts +177 -8
  74. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
  75. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +67 -5
  76. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +2 -2
  77. package/Server/Utils/FrontendEnvironment.ts +40 -0
  78. package/Server/Utils/LogRedaction.ts +20 -0
  79. package/Server/Utils/Logger.ts +11 -0
  80. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +394 -86
  81. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
  82. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +31 -5
  83. package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
  84. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +312 -52
  85. package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +82 -9
  86. package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +16 -7
  87. package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +29 -17
  88. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +107 -48
  89. package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
  90. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -0
  91. package/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.ts +158 -0
  92. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +27 -0
  93. package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
  94. package/Server/Utils/SSRFProtection.ts +217 -10
  95. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
  96. package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
  97. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
  98. package/Server/Utils/StartServer.ts +2 -17
  99. package/Server/Utils/TelegramVerificationToken.ts +185 -0
  100. package/Server/Utils/Telemetry/EntityRegistry.ts +11 -1
  101. package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
  102. package/Server/Utils/Telemetry/TelemetryEntity.ts +83 -9
  103. package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +38 -16
  104. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +92 -0
  105. package/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.ts +217 -0
  106. package/Server/Utils/VM/VMAPI.ts +1 -0
  107. package/Server/Utils/VM/VMRunner.ts +975 -95
  108. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
  109. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +32 -0
  110. package/Tests/App/Dashboard/AdoptedDeviceDrawer.test.tsx +374 -0
  111. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
  112. package/Tests/App/Dashboard/DashboardLabelVariables.test.tsx +580 -0
  113. package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +438 -0
  114. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +5 -2
  115. package/Tests/App/Dashboard/DeviceAttachmentCard.test.tsx +273 -0
  116. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +505 -0
  117. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
  118. package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +163 -0
  119. package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +401 -0
  120. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +232 -0
  121. package/Tests/App/Dashboard/InventoryItems.test.tsx +201 -0
  122. package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +798 -0
  123. package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +320 -0
  124. package/Tests/App/Dashboard/NetworkTopologyToolbar.test.tsx +275 -0
  125. package/Tests/App/Dashboard/OnCallCalendarFeedEmptyState.test.tsx +975 -0
  126. package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +63 -0
  127. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +626 -0
  128. package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +348 -0
  129. package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +331 -0
  130. package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +603 -0
  131. package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +324 -0
  132. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +13 -4
  133. package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
  134. package/Tests/App/StatusPage/StatusPageOidcOrigin.test.tsx +223 -0
  135. package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
  136. package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
  137. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
  138. package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
  139. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
  140. package/Tests/Models/InventoryItemStatus.test.ts +147 -0
  141. package/Tests/Models/NetworkDeviceMacAddressColumn.test.ts +294 -0
  142. package/Tests/ResponsiveVisibility.test.ts +115 -0
  143. package/Tests/ResponsiveVisibility.ts +183 -0
  144. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +129 -0
  145. package/Tests/Server/API/SessionReplayAPI.test.ts +1940 -216
  146. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +186 -0
  147. package/Tests/Server/API/UserTelegramAPISecurity.test.ts +231 -0
  148. package/Tests/Server/EnvironmentConfigFrontendSecurity.test.ts +234 -0
  149. package/Tests/Server/EnvironmentConfigValkey.test.ts +227 -0
  150. package/Tests/Server/Infrastructure/Postgres/AddMacAddressToNetworkDeviceMigration.test.ts +365 -0
  151. package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +241 -0
  152. package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
  153. package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
  154. package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
  155. package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
  156. package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +265 -0
  157. package/Tests/Server/Middleware/HttpMetricsMiddleware.test.ts +382 -0
  158. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
  159. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +525 -0
  160. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
  161. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
  162. package/Tests/Server/Services/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
  163. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
  164. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
  165. package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
  166. package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
  167. package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +291 -56
  168. package/Tests/Server/Services/DatabaseServiceSortTiebreaker.test.ts +151 -0
  169. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
  170. package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
  171. package/Tests/Server/Services/InventoryItemManualCreate.test.ts +105 -0
  172. package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +178 -0
  173. package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
  174. package/Tests/Server/Services/MonitorTemplateServiceCustomFieldSync.test.ts +502 -0
  175. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1351 -74
  176. package/Tests/Server/Services/NetworkDeviceDiscoveryScanRegistration.test.ts +520 -0
  177. package/Tests/Server/Services/NetworkDeviceMacAddressNormalization.test.ts +572 -0
  178. package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
  179. package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
  180. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
  181. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
  182. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
  183. package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
  184. package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
  185. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +141 -0
  186. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +18 -10
  187. package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
  188. package/Tests/Server/Types/Database/InventoryStatusPostgres.test.ts +368 -0
  189. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +261 -14
  190. package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroups.test.ts +169 -0
  191. package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroupsPostgres.test.ts +297 -0
  192. package/Tests/Server/Types/Markdown.test.ts +194 -1
  193. package/Tests/Server/Types/Workflow/Components/IncomingWebhookUtils.test.ts +279 -0
  194. package/Tests/Server/Types/Workflow/Components/TextToJson.test.ts +212 -0
  195. package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
  196. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
  197. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
  198. package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
  199. package/Tests/Server/Utils/CustomField/CustomFieldMappingRegistry.test.ts +436 -0
  200. package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
  201. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +214 -0
  202. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
  203. package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
  204. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +2 -2
  205. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
  206. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +10 -3
  207. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
  208. package/Tests/Server/Utils/EventLoop.test.ts +359 -0
  209. package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
  210. package/Tests/Server/Utils/JsonWebToken.test.ts +30 -0
  211. package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
  212. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
  213. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +242 -0
  214. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +590 -0
  215. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +29 -0
  216. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
  217. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +30 -6
  218. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +246 -0
  219. package/Tests/Server/Utils/Monitor/MonitorCriteriaEmailEvalLogAgreement.test.ts +280 -0
  220. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +659 -8
  221. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +570 -0
  222. package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +30 -5
  223. package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +68 -21
  224. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +36 -19
  225. package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
  226. package/Tests/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.test.ts +573 -0
  227. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +317 -0
  228. package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
  229. package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
  230. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
  231. package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
  232. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
  233. package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
  234. package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
  235. package/Tests/Server/Utils/Telemetry/ContextSpanProcessor.test.ts +281 -0
  236. package/Tests/Server/Utils/Telemetry/InventoryDuplicateIdentity.test.ts +316 -0
  237. package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
  238. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +111 -8
  239. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriterCapacity.test.ts +458 -0
  240. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +424 -0
  241. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.test.ts +528 -0
  242. package/Tests/Server/Utils/TelemetryExporterEnvironment.test.ts +56 -0
  243. package/Tests/Server/Utils/VM/VMRunnerHostBridgeLatency.test.ts +74 -0
  244. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +100 -7
  245. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +1176 -6
  246. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +220 -0
  247. package/Tests/Types/CustomField/CustomFieldValueMapping.test.ts +348 -0
  248. package/Tests/Types/Database/IncludesAnyOfGroups.test.ts +106 -0
  249. package/Tests/Types/JSONFunctions.test.ts +300 -0
  250. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
  251. package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +495 -15
  252. package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
  253. package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
  254. package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
  255. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
  256. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
  257. package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
  258. package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
  259. package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
  260. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
  261. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
  262. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
  263. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
  264. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
  265. package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
  266. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
  267. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
  268. package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
  269. package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
  270. package/Tests/Types/NetworkAutomation/AutoImportRunMerge.test.ts +235 -0
  271. package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +66 -0
  272. package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +309 -1
  273. package/Tests/Types/NotificationSetting/RoutineEmailEvents.test.ts +47 -0
  274. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +608 -0
  275. package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +434 -0
  276. package/Tests/Types/Telemetry/InventoryLiveness.test.ts +99 -0
  277. package/Tests/Types/WebsiteRequest.test.ts +285 -3
  278. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
  279. package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
  280. package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
  281. package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
  282. package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +160 -0
  283. package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
  284. package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
  285. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
  286. package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
  287. package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
  288. package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
  289. package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
  290. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
  291. package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
  292. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +28 -12
  293. package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
  294. package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
  295. package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
  296. package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
  297. package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
  298. package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
  299. package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
  300. package/Tests/UI/ReactRouterSingletonBuild.test.ts +133 -0
  301. package/Tests/UI/Rum/ChunkLoader.test.ts +1036 -2
  302. package/Tests/UI/Rum/FidelityNotices.test.ts +187 -0
  303. package/Tests/UI/Rum/InactivityMap.test.ts +341 -0
  304. package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +259 -0
  305. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +855 -0
  306. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +594 -0
  307. package/Tests/UI/Rum/ReplayCard.test.tsx +451 -0
  308. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +536 -0
  309. package/Tests/UI/Rum/ReplayEngine.test.ts +2503 -0
  310. package/Tests/UI/Rum/ReplayEngineTypes.test.ts +171 -0
  311. package/Tests/UI/Rum/ReplayHeader.test.tsx +719 -0
  312. package/Tests/UI/Rum/ReplayLink.test.tsx +119 -0
  313. package/Tests/UI/Rum/ReplayPinControl.test.tsx +408 -0
  314. package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +152 -0
  315. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +514 -0
  316. package/Tests/UI/Rum/ReplayRail.test.tsx +1296 -0
  317. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +900 -0
  318. package/Tests/UI/Rum/ReplayScrubber.test.tsx +763 -147
  319. package/Tests/UI/Rum/ReplaySignalTypes.test.ts +189 -0
  320. package/Tests/UI/Rum/ReplaySignals.test.ts +1579 -0
  321. package/Tests/UI/Rum/ReplayStage.test.tsx +396 -473
  322. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +918 -0
  323. package/Tests/UI/Rum/ReplayTimeFormat.test.ts +94 -0
  324. package/Tests/UI/Rum/ReplayTimeline.test.tsx +696 -0
  325. package/Tests/UI/Rum/ReplayUi.test.tsx +559 -0
  326. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +499 -0
  327. package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +346 -0
  328. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +545 -0
  329. package/Tests/UI/Rum/SessionReplayTable.test.tsx +991 -0
  330. package/Tests/UI/Rum/TargetedCapturePanel.test.tsx +254 -0
  331. package/Tests/UI/Telemetry/BrowserExporterIsolation.test.ts +71 -0
  332. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
  333. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -0
  334. package/Tests/UI/Utils/GlobalKeyboardShortcut.test.ts +344 -0
  335. package/Tests/Utils/API.test.ts +308 -0
  336. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +11 -1
  337. package/Tests/Utils/Dashboard/LabelVariable.test.ts +257 -0
  338. package/Tests/Utils/Dashboard/VariableUrlState.test.ts +144 -14
  339. package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
  340. package/Tests/Utils/MetricUnitUtil.test.ts +81 -0
  341. package/Tests/Utils/Monitor/DeviceMacLearningUtil.test.ts +497 -0
  342. package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +546 -0
  343. package/Tests/Utils/Monitor/MonitorTemplateCustomFieldUtil.test.ts +218 -0
  344. package/Tests/Utils/Monitor/NetworkTopologyEndpointAdoption.test.ts +1755 -0
  345. package/Tests/Utils/NetworkAutomation/AutoImportRunChain.test.ts +320 -0
  346. package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
  347. package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
  348. package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
  349. package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
  350. package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
  351. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
  352. package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
  353. package/Tests/Utils/ValueFormatter.test.ts +148 -0
  354. package/Types/BaseDatabase/IncludesAnyOfGroups.ts +77 -0
  355. package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
  356. package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
  357. package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
  358. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  359. package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +1 -0
  360. package/Types/Dashboard/DashboardVariable.ts +8 -0
  361. package/Types/Icon/IconProp.ts +1 -0
  362. package/Types/JSON.ts +4 -0
  363. package/Types/JSONFunctions.ts +205 -43
  364. package/Types/Monitor/CephAlertTemplates.ts +157 -195
  365. package/Types/Monitor/DockerAlertTemplates.ts +338 -128
  366. package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
  367. package/Types/Monitor/HostAlertTemplates.ts +302 -130
  368. package/Types/Monitor/IotAlertTemplates.ts +112 -104
  369. package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
  370. package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
  371. package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
  372. package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
  373. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
  374. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
  375. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
  376. package/Types/Monitor/RumAlertTemplates.ts +46 -7
  377. package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
  378. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
  379. package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
  380. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
  381. package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
  382. package/Types/NetworkAutomation/RuleRunResult.ts +402 -13
  383. package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
  384. package/Types/Rum/SessionReplay.ts +209 -0
  385. package/Types/Rum/SessionReplayApi.ts +722 -0
  386. package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
  387. package/Types/Rum/SessionReplayConsentMode.ts +11 -7
  388. package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
  389. package/Types/Rum/SessionReplayHealth.ts +238 -0
  390. package/Types/SerializableObjectDictionary.ts +4 -0
  391. package/Types/Telemetry/InventoryLiveness.ts +56 -0
  392. package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
  393. package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
  394. package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
  395. package/Types/WebsiteRequest.ts +85 -3
  396. package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +9 -2
  397. package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
  398. package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
  399. package/UI/Components/Charts/Line/LineChart.tsx +13 -2
  400. package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
  401. package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
  402. package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
  403. package/UI/Components/Charts/Utils/XAxis.ts +217 -0
  404. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +189 -46
  405. package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
  406. package/UI/Components/Dashboard/DashboardVariableControl.tsx +285 -0
  407. package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
  408. package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
  409. package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
  410. package/UI/Components/Header/Header.tsx +25 -9
  411. package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
  412. package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
  413. package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
  414. package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
  415. package/UI/Components/Icon/Icon.tsx +11 -0
  416. package/UI/Components/JSONTable/JSONTable.tsx +2 -2
  417. package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
  418. package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
  419. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
  420. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
  421. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
  422. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
  423. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
  424. package/UI/Components/ModelTable/Column.ts +15 -0
  425. package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
  426. package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
  427. package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
  428. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
  429. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  430. package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
  431. package/UI/Components/Table/CellClassName.ts +81 -0
  432. package/UI/Components/Table/TableRow.tsx +20 -14
  433. package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
  434. package/UI/Components/Table/Types/Column.ts +36 -0
  435. package/UI/Components/Tooltip/Tooltip.tsx +11 -1
  436. package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
  437. package/UI/Components/Workflow/NodePlacement.ts +57 -0
  438. package/UI/Components/Workflow/Workflow.tsx +47 -18
  439. package/UI/Config.ts +15 -33
  440. package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
  441. package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
  442. package/UI/Utils/Telemetry/Telemetry.ts +10 -8
  443. package/UI/esbuild-config.js +6 -0
  444. package/Utils/API.ts +129 -3
  445. package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +12 -1
  446. package/Utils/Dashboard/LabelVariable.ts +152 -0
  447. package/Utils/Dashboard/VariableUrlState.ts +27 -5
  448. package/Utils/HTTPResponseBodyReader.ts +221 -0
  449. package/Utils/MetricUnitUtil.ts +34 -0
  450. package/Utils/Monitor/DeviceMacLearningUtil.ts +177 -0
  451. package/Utils/Monitor/MetricValueFormatter.ts +342 -0
  452. package/Utils/Monitor/MonitorTemplateCustomFieldUtil.ts +124 -0
  453. package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +7 -2
  454. package/Utils/Monitor/NetworkTopologyUtil.ts +693 -0
  455. package/Utils/NetworkAutomation/AutoImportRunChain.ts +138 -0
  456. package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
  457. package/Utils/Rum/ChunkMath.ts +106 -0
  458. package/Utils/Rum/SessionReplayHealth.ts +732 -0
  459. package/Utils/Rum/SessionReplayStringMap.ts +226 -0
  460. package/Utils/Schema/ModelSchema.ts +1 -0
  461. package/Utils/StatusPage/ResourceSearch.ts +290 -0
  462. package/Utils/Telemetry/OriginAllowList.ts +355 -0
  463. package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
  464. package/Utils/ValueFormatter.ts +35 -1
  465. package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
  466. package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
  467. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
  468. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
  469. package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
  470. package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
  471. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
  472. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
  473. package/build/dist/Models/DatabaseModels/GlobalConfig.js +12 -12
  474. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  475. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
  476. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  477. package/build/dist/Models/DatabaseModels/InventoryItem.js +34 -1
  478. package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
  479. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
  480. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
  481. package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
  482. package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
  483. package/build/dist/Models/DatabaseModels/NetworkDevice.js +128 -0
  484. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  485. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
  486. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
  487. package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
  488. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  489. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
  490. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
  491. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
  492. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
  493. package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
  494. package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
  495. package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
  496. package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
  497. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
  498. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
  499. package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
  500. package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
  501. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
  502. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
  503. package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
  504. package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
  505. package/build/dist/Server/API/TelemetryAPI.js +769 -109
  506. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  507. package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
  508. package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
  509. package/build/dist/Server/API/UserTelegramAPI.js +28 -6
  510. package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
  511. package/build/dist/Server/EnvironmentConfig.js +73 -14
  512. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  513. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
  514. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
  515. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
  516. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
  517. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
  518. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
  519. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
  520. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
  521. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js +14 -0
  522. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js.map +1 -0
  523. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  524. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  525. package/build/dist/Server/Infrastructure/QueueWorker.js +19 -7
  526. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  527. package/build/dist/Server/Infrastructure/Redis.js +8 -8
  528. package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
  529. package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
  530. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  531. package/build/dist/Server/Infrastructure/Status.js +10 -4
  532. package/build/dist/Server/Infrastructure/Status.js.map +1 -1
  533. package/build/dist/Server/Middleware/TelemetryIngest.js +315 -8
  534. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  535. package/build/dist/Server/Services/AccessTokenService.js +1 -0
  536. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  537. package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
  538. package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
  539. package/build/dist/Server/Services/AlertService.js +34 -0
  540. package/build/dist/Server/Services/AlertService.js.map +1 -1
  541. package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
  542. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  543. package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
  544. package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
  545. package/build/dist/Server/Services/DatabaseService.js +58 -13
  546. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  547. package/build/dist/Server/Services/GlobalConfigService.js +133 -0
  548. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  549. package/build/dist/Server/Services/IncidentCustomFieldService.js +93 -0
  550. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  551. package/build/dist/Server/Services/IncidentService.js +32 -0
  552. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  553. package/build/dist/Server/Services/InventoryItemService.js +28 -1
  554. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  555. package/build/dist/Server/Services/MetricService.js +163 -0
  556. package/build/dist/Server/Services/MetricService.js.map +1 -1
  557. package/build/dist/Server/Services/MonitorService.js +29 -0
  558. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  559. package/build/dist/Server/Services/MonitorTemplateService.js +116 -17
  560. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  561. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +349 -64
  562. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  563. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +65 -0
  564. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  565. package/build/dist/Server/Services/NetworkDeviceService.js +54 -0
  566. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  567. package/build/dist/Server/Services/ProjectService.js +22 -0
  568. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  569. package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
  570. package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
  571. package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
  572. package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
  573. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
  574. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
  575. package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
  576. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  577. package/build/dist/Server/Services/TeamMemberService.js +62 -2
  578. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  579. package/build/dist/Server/Services/TeamPermissionService.js +166 -3
  580. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  581. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
  582. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  583. package/build/dist/Server/Services/UserNotificationRuleService.js +60 -25
  584. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  585. package/build/dist/Server/Services/UserNotificationSettingService.js +26 -6
  586. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  587. package/build/dist/Server/Services/UserTelegramService.js +257 -4
  588. package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
  589. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +29 -4
  590. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
  591. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  592. package/build/dist/Server/Types/Database/QueryUtil.js +36 -0
  593. package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
  594. package/build/dist/Server/Types/Markdown.js +75 -0
  595. package/build/dist/Server/Types/Markdown.js.map +1 -1
  596. package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
  597. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  598. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
  599. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
  600. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
  601. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
  602. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
  603. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
  604. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +53 -18
  605. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
  606. package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
  607. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  608. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +38 -5
  609. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -1
  610. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +54 -3
  611. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  612. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +2 -2
  613. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
  614. package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
  615. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
  616. package/build/dist/Server/Utils/LogRedaction.js +20 -0
  617. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  618. package/build/dist/Server/Utils/Logger.js +10 -0
  619. package/build/dist/Server/Utils/Logger.js.map +1 -1
  620. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +323 -81
  621. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  622. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
  623. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  624. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +29 -5
  625. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  626. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
  627. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  628. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +254 -48
  629. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  630. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +58 -9
  631. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
  632. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +9 -3
  633. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
  634. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +26 -12
  635. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
  636. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +74 -33
  637. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  638. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  639. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  640. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +22 -0
  641. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  642. package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js +114 -0
  643. package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js.map +1 -0
  644. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +25 -0
  645. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  646. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
  647. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
  648. package/build/dist/Server/Utils/SSRFProtection.js +136 -9
  649. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  650. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
  651. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
  652. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
  653. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
  654. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
  655. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  656. package/build/dist/Server/Utils/StartServer.js +3 -14
  657. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  658. package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
  659. package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
  660. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +9 -1
  661. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  662. package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
  663. package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
  664. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +70 -13
  665. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  666. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
  667. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
  668. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
  669. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
  670. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
  671. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
  672. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  673. package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
  674. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  675. package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js +54 -0
  676. package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js.map +1 -0
  677. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +60 -0
  678. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -0
  679. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js +20 -0
  680. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js.map +1 -0
  681. package/build/dist/Types/CustomField/CustomFieldValueMapping.js +141 -0
  682. package/build/dist/Types/CustomField/CustomFieldValueMapping.js.map +1 -0
  683. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  684. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  685. package/build/dist/Types/Dashboard/DashboardVariable.js +1 -0
  686. package/build/dist/Types/Dashboard/DashboardVariable.js.map +1 -1
  687. package/build/dist/Types/Icon/IconProp.js +1 -0
  688. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  689. package/build/dist/Types/JSON.js +1 -0
  690. package/build/dist/Types/JSON.js.map +1 -1
  691. package/build/dist/Types/JSONFunctions.js +131 -37
  692. package/build/dist/Types/JSONFunctions.js.map +1 -1
  693. package/build/dist/Types/Monitor/CephAlertTemplates.js +130 -171
  694. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  695. package/build/dist/Types/Monitor/DockerAlertTemplates.js +286 -121
  696. package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
  697. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
  698. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
  699. package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
  700. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
  701. package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
  702. package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
  703. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
  704. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  705. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
  706. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  707. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
  708. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
  709. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
  710. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
  711. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
  712. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
  713. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
  714. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  715. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
  716. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
  717. package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
  718. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  719. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
  720. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
  721. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
  722. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
  723. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
  724. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
  725. package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
  726. package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
  727. package/build/dist/Types/NetworkAutomation/RuleRunResult.js +291 -6
  728. package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
  729. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
  730. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
  731. package/build/dist/Types/Rum/SessionReplay.js +117 -0
  732. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  733. package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
  734. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
  735. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
  736. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
  737. package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
  738. package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
  739. package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
  740. package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
  741. package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
  742. package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
  743. package/build/dist/Types/SerializableObjectDictionary.js +4 -0
  744. package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
  745. package/build/dist/Types/Telemetry/InventoryLiveness.js +37 -0
  746. package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -0
  747. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
  748. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
  749. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
  750. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
  751. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
  752. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
  753. package/build/dist/Types/WebsiteRequest.js +55 -3
  754. package/build/dist/Types/WebsiteRequest.js.map +1 -1
  755. package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +7 -0
  756. package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
  757. package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
  758. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  759. package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
  760. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  761. package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
  762. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  763. package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
  764. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
  765. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  766. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
  767. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  768. package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
  769. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  770. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +89 -8
  771. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  772. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +118 -0
  773. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -0
  774. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +137 -0
  775. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -0
  776. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +112 -7
  777. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  778. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
  779. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  780. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
  781. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
  782. package/build/dist/UI/Components/Header/Header.js +2 -3
  783. package/build/dist/UI/Components/Header/Header.js.map +1 -1
  784. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
  785. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
  786. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
  787. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
  788. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
  789. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
  790. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
  791. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
  792. package/build/dist/UI/Components/Icon/Icon.js +5 -0
  793. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  794. package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
  795. package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
  796. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
  797. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
  798. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
  799. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
  800. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
  801. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
  802. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
  803. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  804. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
  805. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  806. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +38 -0
  807. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  808. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
  809. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
  810. package/build/dist/UI/Components/Table/CellClassName.js +55 -0
  811. package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
  812. package/build/dist/UI/Components/Table/TableRow.js +16 -13
  813. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  814. package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
  815. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
  816. package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
  817. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  818. package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
  819. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  820. package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
  821. package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
  822. package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
  823. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  824. package/build/dist/UI/Config.js +10 -20
  825. package/build/dist/UI/Config.js.map +1 -1
  826. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
  827. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
  828. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
  829. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
  830. package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
  831. package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
  832. package/build/dist/Utils/API.js +67 -5
  833. package/build/dist/Utils/API.js.map +1 -1
  834. package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +9 -1
  835. package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
  836. package/build/dist/Utils/Dashboard/LabelVariable.js +96 -0
  837. package/build/dist/Utils/Dashboard/LabelVariable.js.map +1 -0
  838. package/build/dist/Utils/Dashboard/VariableUrlState.js +19 -4
  839. package/build/dist/Utils/Dashboard/VariableUrlState.js.map +1 -1
  840. package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
  841. package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
  842. package/build/dist/Utils/MetricUnitUtil.js +26 -0
  843. package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
  844. package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js +112 -0
  845. package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js.map +1 -0
  846. package/build/dist/Utils/Monitor/MetricValueFormatter.js +276 -0
  847. package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -0
  848. package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js +101 -0
  849. package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js.map +1 -0
  850. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +7 -2
  851. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
  852. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +484 -0
  853. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  854. package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js +59 -0
  855. package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js.map +1 -0
  856. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
  857. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
  858. package/build/dist/Utils/Rum/ChunkMath.js +76 -0
  859. package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
  860. package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
  861. package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
  862. package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
  863. package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
  864. package/build/dist/Utils/Schema/ModelSchema.js +1 -0
  865. package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
  866. package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
  867. package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
  868. package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
  869. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
  870. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
  871. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
  872. package/build/dist/Utils/ValueFormatter.js +32 -1
  873. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  874. package/jest.config.json +2 -0
  875. package/package.json +1 -1
  876. package/test-setup.sh +9 -9
  877. package/tsconfig.json +51 -11
@@ -1,5 +1,5 @@
1
1
  import "@testing-library/jest-dom";
2
- import { act, render } from "@testing-library/react";
2
+ import { act, cleanup, render } from "@testing-library/react";
3
3
  /*
4
4
  * The Dashboard has its own copy of react, so a component imported from there
5
5
  * would otherwise call hooks on a DIFFERENT React instance than the one
@@ -7,600 +7,523 @@ import { act, render } from "@testing-library/react";
7
7
  * null".
8
8
  *
9
9
  * That is resolved in Common's jest moduleNameMapper, which pins react and
10
- * react-dom to this project's single copy for every importer. It deliberately
11
- * is NOT a jest.mock of an absolute path into
12
- * App/FeatureSet/Dashboard/node_modules: that path only exists once the
13
- * Dashboard has been installed, so it worked locally and broke the Common Test
14
- * CI job, which installs Common alone.
10
+ * react-dom to this project's single copy for every importer.
15
11
  */
16
12
  import * as React from "react";
17
- import {
18
- afterEach,
19
- beforeEach,
20
- describe,
21
- expect,
22
- it,
23
- jest,
24
- } from "@jest/globals";
25
- import {
26
- SessionReplayChunkManifestEntry,
27
- SessionReplayGap,
28
- } from "../../../Types/Rum/SessionReplay";
29
- import ChunkLoader, {
30
- SessionReplayRecordedEvent,
31
- } from "../../../../App/FeatureSet/Dashboard/src/Components/SessionReplay/ChunkLoader";
13
+ import { afterEach, describe, expect, it, jest } from "@jest/globals";
32
14
  import ReplayStage, {
33
- ReplayerLike,
15
+ REPLAY_DOCUMENT_CSP,
16
+ REPLAY_STAGE_MAX_HEIGHT_VH,
17
+ REPLAY_STAGE_MIN_HEIGHT_REM,
18
+ REPLAY_STAGE_THEATER_MAX_HEIGHT_VH,
19
+ computeContainScale,
34
20
  } from "../../../../App/FeatureSet/Dashboard/src/Components/SessionReplay/ReplayStage";
21
+ import {
22
+ ReplayEngine,
23
+ ReplayEngineDiagnostics,
24
+ ReplayEngineEvent,
25
+ ReplayEngineListener,
26
+ ReplayEngineReplayerEvent,
27
+ ReplayEngineReplayerListener,
28
+ ReplayEngineSnapshot,
29
+ ReplayerLike,
30
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/SessionReplay/Engine/ReplayEngineTypes";
35
31
 
36
32
  /*
37
- * ReplayStage is the component whose failure mode is a lie rather than a
38
- * crash: feed rrweb a chunk whose predecessor never arrived and it resolves
39
- * those mutations against stale node ids, rendering a DOM the end user never
40
- * saw. These tests drive it with a real ChunkLoader over fixture bytes and a
41
- * fake Replayer, so the feeding state machine is pinned without rrweb, a
42
- * network or a browser.
43
- *
44
- * It lives in Common for the same reason ChunkLoader.test.ts does: the logic
45
- * is Dashboard code, but nothing about it needs the Dashboard build.
33
+ * ReplayStage is now a thin React binding over the engine: everything
34
+ * about WHAT plays is pinned in ReplayEngine.test.ts. What is left to pin
35
+ * here is what needs a DOM - mounting the engine's host, contain-fit
36
+ * scaling within the height bounds, the aspect reserved before the first
37
+ * frame, the CSP meta on every rebuilt document, the phone frame, the
38
+ * touch ring and the speed-aware cursor.
46
39
  */
47
40
 
48
- const CHUNK_MS: number = 15000;
49
- const TICK_MS: number = 200;
50
-
51
- /* Deliberately nothing like a session offset: these are raw client clocks. */
52
- const CLIENT_CLOCK_BASE_MS: number = 1700000000000;
53
-
54
- function makeEntry(
55
- chunkIndex: number,
56
- options?: { hasFullSnapshot?: boolean },
57
- ): SessionReplayChunkManifestEntry {
41
+ function makeSnapshot(
42
+ overrides?: Partial<ReplayEngineSnapshot>,
43
+ ): ReplayEngineSnapshot {
58
44
  return {
59
- chunkIndex: chunkIndex,
60
- tabId: "tab-1",
61
- chunkStartOffsetMs: chunkIndex * CHUNK_MS,
62
- chunkEndOffsetMs: (chunkIndex + 1) * CHUNK_MS,
63
- eventCount: 2,
64
- hasFullSnapshot: options?.hasFullSnapshot ?? false,
65
- payloadBytes: 4096,
66
- errorCount: 0,
67
- rageClickCount: 0,
68
- deadClickCount: 0,
69
- errorClickCount: 0,
70
- refreshRageCount: 0,
71
- routeCount: 0,
45
+ phase: "paused",
46
+ intent: "paused",
47
+ buffer: "ok",
48
+ currentTimeMs: 0,
49
+ durationMs: 60000,
50
+ speed: 1,
51
+ skipInactive: false,
52
+ fedRange: null,
53
+ loadedChunkIndexes: [],
54
+ activeTabId: "tab-1",
55
+ recordedSize: null,
56
+ bufferingSinceMs: null,
57
+ lastGap: null,
58
+ lastIdleSkip: null,
59
+ error: null,
60
+ pendingSeekMs: null,
61
+ generation: 0,
62
+ notice: null,
63
+ idleBands: [],
64
+ feedAheadMs: 30000,
65
+ earliestPlayableMs: 0,
66
+ ...overrides,
72
67
  };
73
68
  }
74
69
 
75
- function eventsFor(
76
- chunkIndex: number,
77
- count: number,
78
- ): Array<SessionReplayRecordedEvent> {
79
- const events: Array<SessionReplayRecordedEvent> = [];
80
-
81
- for (let i: number = 0; i < count; i++) {
82
- events.push({
83
- type: chunkIndex === 0 && i === 0 ? 2 : 3,
84
- timestamp: CLIENT_CLOCK_BASE_MS + chunkIndex * CHUNK_MS + i,
85
- data: { chunkIndex: chunkIndex, sequence: i },
86
- });
70
+ /* The engine as the stage sees it: a store, a host element and a hook. */
71
+ class FakeEngine implements ReplayEngine {
72
+ public snapshotValue: ReplayEngineSnapshot;
73
+ public readonly host: HTMLElement;
74
+ public attachedTo: HTMLElement | null = null;
75
+ public detachCount: number = 0;
76
+ public readonly dispatched: Array<ReplayEngineEvent> = [];
77
+ private readonly listeners: Set<ReplayEngineListener> =
78
+ new Set<ReplayEngineListener>();
79
+ private readonly replayerListeners: Set<ReplayEngineReplayerListener> =
80
+ new Set<ReplayEngineReplayerListener>();
81
+
82
+ public constructor(snapshot?: Partial<ReplayEngineSnapshot>) {
83
+ this.snapshotValue = makeSnapshot(snapshot);
84
+ this.host = document.createElement("div");
85
+ this.host.className = "oneuptime-replay-host";
87
86
  }
88
87
 
89
- return events;
90
- }
91
-
92
- /* [u32 chunkIndex][u32 length][payload], little-endian, as the server writes. */
93
- function encodeFrames(
94
- frames: Array<{
95
- chunkIndex: number;
96
- events: Array<SessionReplayRecordedEvent>;
97
- }>,
98
- ): ArrayBuffer {
99
- const encoder: TextEncoder = new TextEncoder();
100
- const encoded: Array<{ chunkIndex: number; bytes: Uint8Array }> = frames.map(
101
- (frame: {
102
- chunkIndex: number;
103
- events: Array<SessionReplayRecordedEvent>;
104
- }): { chunkIndex: number; bytes: Uint8Array } => {
105
- return {
106
- chunkIndex: frame.chunkIndex,
107
- bytes: encoder.encode(JSON.stringify(frame.events)),
108
- };
109
- },
110
- );
111
-
112
- const totalBytes: number = encoded.reduce(
113
- (total: number, frame: { bytes: Uint8Array }): number => {
114
- return total + 8 + frame.bytes.length;
115
- },
116
- 0,
117
- );
88
+ public dispatch(event: ReplayEngineEvent): void {
89
+ this.dispatched.push(event);
90
+ }
118
91
 
119
- const buffer: ArrayBuffer = new ArrayBuffer(totalBytes);
120
- const view: DataView = new DataView(buffer);
121
- const bytes: Uint8Array = new Uint8Array(buffer);
122
- let offset: number = 0;
92
+ public subscribe(listener: ReplayEngineListener): () => void {
93
+ this.listeners.add(listener);
123
94
 
124
- for (const frame of encoded) {
125
- view.setUint32(offset, frame.chunkIndex, true);
126
- view.setUint32(offset + 4, frame.bytes.length, true);
127
- bytes.set(frame.bytes, offset + 8);
128
- offset += 8 + frame.bytes.length;
95
+ return (): void => {
96
+ this.listeners.delete(listener);
97
+ };
129
98
  }
130
99
 
131
- return buffer;
132
- }
100
+ public getSnapshot(): ReplayEngineSnapshot {
101
+ return this.snapshotValue;
102
+ }
133
103
 
134
- /*
135
- * Stand-in for rrweb's Replayer. Records everything the stage does to it, so
136
- * a test can assert on what WAS fed as well as on what was not.
137
- */
138
- class FakeReplayer implements ReplayerLike {
139
- public readonly iframe: HTMLIFrameElement;
140
- public readonly wrapper: HTMLElement;
141
- public readonly initialEvents: Array<SessionReplayRecordedEvent>;
142
- public readonly added: Array<SessionReplayRecordedEvent> = [];
143
- public readonly playOffsets: Array<number | undefined> = [];
144
- public readonly pauseOffsets: Array<number | undefined> = [];
145
- public readonly configs: Array<Record<string, unknown>> = [];
146
- public readonly handlers: Map<string, (payload: unknown) => void> = new Map<
147
- string,
148
- (payload: unknown) => void
149
- >();
150
- public isDestroyed: boolean = false;
151
- public currentTimeMs: number = 0;
152
-
153
- public constructor(events: Array<SessionReplayRecordedEvent>) {
154
- this.initialEvents = events;
155
- this.iframe = document.createElement("iframe");
156
- this.wrapper = document.createElement("div");
104
+ public attach(container: HTMLElement): void {
105
+ this.attachedTo = container;
106
+ container.appendChild(this.host);
157
107
  }
158
108
 
159
- public play(timeOffsetMs?: number): void {
160
- this.playOffsets.push(timeOffsetMs);
109
+ public detach(): void {
110
+ this.detachCount += 1;
111
+ this.host.parentElement?.removeChild(this.host);
112
+ this.attachedTo = null;
161
113
  }
162
114
 
163
- public pause(timeOffsetMs?: number): void {
164
- this.pauseOffsets.push(timeOffsetMs);
115
+ public dispose(): void {
116
+ this.detach();
165
117
  }
166
118
 
167
- public destroy(): void {
168
- this.isDestroyed = true;
119
+ public onReplayer(listener: ReplayEngineReplayerListener): () => void {
120
+ this.replayerListeners.add(listener);
121
+
122
+ return (): void => {
123
+ this.replayerListeners.delete(listener);
124
+ };
169
125
  }
170
126
 
171
- public addEvent(event: SessionReplayRecordedEvent): void {
172
- this.added.push(event);
127
+ public getHostElement(): HTMLElement | null {
128
+ return this.host;
173
129
  }
174
130
 
175
- public getCurrentTime(): number {
176
- return this.currentTimeMs;
131
+ public getDiagnostics(): ReplayEngineDiagnostics {
132
+ return {
133
+ watchdogFireCount: 0,
134
+ replayersCreated: 0,
135
+ replayersDestroyed: 0,
136
+ generation: 0,
137
+ anchorChunkIndex: null,
138
+ lastFedChunkIndex: null,
139
+ isHoldingLastFrame: false,
140
+ isAttached: this.attachedTo !== null,
141
+ };
177
142
  }
178
143
 
179
- public setConfig(config: Record<string, unknown>): void {
180
- this.configs.push(config);
144
+ public update(patch: Partial<ReplayEngineSnapshot>): void {
145
+ this.snapshotValue = { ...this.snapshotValue, ...patch };
146
+
147
+ for (const listener of [...this.listeners]) {
148
+ listener(this.snapshotValue);
149
+ }
181
150
  }
182
151
 
183
- public on(event: string, handler: (payload: unknown) => void): unknown {
184
- this.handlers.set(event, handler);
185
- return this;
152
+ public emitReplayer(event: ReplayEngineReplayerEvent): void {
153
+ for (const listener of [...this.replayerListeners]) {
154
+ listener(event);
155
+ }
186
156
  }
187
157
  }
188
158
 
189
- interface Harness {
190
- loader: ChunkLoader;
191
- replayers: Array<FakeReplayer>;
192
- gaps: Array<SessionReplayGap>;
193
- errors: Array<string>;
194
- playingChanges: Array<boolean>;
195
- timeUpdates: Array<number>;
196
- requests: Array<Array<number>>;
197
- }
198
-
199
- function makeHarness(options: {
200
- entries: Array<SessionReplayChunkManifestEntry>;
201
- eventsPerChunk?: number;
202
- /* Chunk indexes the server "loses" - present in the manifest, absent from the response. */
203
- omitChunkIndexes?: Array<number>;
204
- deferFetch?: boolean;
205
- }): Harness & { resolveFetch: () => void } {
206
- const replayers: Array<FakeReplayer> = [];
207
- const gaps: Array<SessionReplayGap> = [];
208
- const errors: Array<string> = [];
209
- const playingChanges: Array<boolean> = [];
210
- const timeUpdates: Array<number> = [];
211
- const requests: Array<Array<number>> = [];
212
- const pending: Array<() => void> = [];
213
-
214
- const omitted: Set<number> = new Set<number>(options.omitChunkIndexes ?? []);
215
-
216
- const loader: ChunkLoader = new ChunkLoader({
217
- sessionId: "sess-1",
218
- tabId: "tab-1",
219
- entries: options.entries,
220
- fetcher: (request: {
221
- sessionId: string;
222
- tabId: string;
223
- chunkIndexes: Array<number>;
224
- }): Promise<ArrayBuffer> => {
225
- requests.push([...request.chunkIndexes]);
226
-
227
- const buffer: ArrayBuffer = encodeFrames(
228
- request.chunkIndexes
229
- .filter((chunkIndex: number): boolean => {
230
- return !omitted.has(chunkIndex);
231
- })
232
- .map(
233
- (
234
- chunkIndex: number,
235
- ): {
236
- chunkIndex: number;
237
- events: Array<SessionReplayRecordedEvent>;
238
- } => {
239
- return {
240
- chunkIndex: chunkIndex,
241
- events: eventsFor(chunkIndex, options.eventsPerChunk ?? 2),
242
- };
243
- },
244
- ),
245
- );
246
-
247
- if (!options.deferFetch) {
248
- return Promise.resolve(buffer);
249
- }
250
-
251
- return new Promise<ArrayBuffer>((resolve: (b: ArrayBuffer) => void) => {
252
- pending.push((): void => {
253
- resolve(buffer);
254
- });
255
- });
256
- },
257
- });
159
+ /* A Replayer whose iframe is in the document, so it has a contentDocument. */
160
+ function makeReplayer(): ReplayerLike & { iframe: HTMLIFrameElement } {
161
+ const iframe: HTMLIFrameElement = document.createElement("iframe");
162
+ document.body.appendChild(iframe);
258
163
 
259
164
  return {
260
- loader: loader,
261
- replayers: replayers,
262
- gaps: gaps,
263
- errors: errors,
264
- playingChanges: playingChanges,
265
- timeUpdates: timeUpdates,
266
- requests: requests,
267
- resolveFetch: (): void => {
268
- const waiting: Array<() => void> = [...pending];
269
- pending.length = 0;
270
-
271
- for (const resolve of waiting) {
272
- resolve();
273
- }
165
+ iframe: iframe,
166
+ wrapper: document.createElement("div"),
167
+ play: (): void => {
168
+ // Not exercised by the stage.
169
+ },
170
+ pause: (): void => {
171
+ // Not exercised by the stage.
172
+ },
173
+ destroy: (): void => {
174
+ iframe.remove();
175
+ },
176
+ addEvent: (): void => {
177
+ // Not exercised by the stage.
178
+ },
179
+ getCurrentTime: (): number => {
180
+ return 0;
181
+ },
182
+ setConfig: (): void => {
183
+ // Not exercised by the stage.
184
+ },
185
+ on: (): unknown => {
186
+ return undefined;
274
187
  },
275
188
  };
276
189
  }
277
190
 
278
- function renderStage(
279
- harness: Harness,
280
- props?: { isPlaying?: boolean },
281
- ): { rerender: (isPlaying: boolean) => void } {
282
- const element: (isPlaying: boolean) => React.ReactElement = (
283
- isPlaying: boolean,
284
- ): React.ReactElement => {
285
- return (
286
- <ReplayStage
287
- loader={harness.loader}
288
- replayerFactory={(
289
- events: Array<SessionReplayRecordedEvent>,
290
- ): ReplayerLike => {
291
- const replayer: FakeReplayer = new FakeReplayer(events);
292
- harness.replayers.push(replayer);
293
- return replayer;
294
- }}
295
- isPlaying={isPlaying}
296
- speed={1}
297
- skipInactive={false}
298
- seekRequest={null}
299
- onTimeUpdate={(offsetMs: number): void => {
300
- harness.timeUpdates.push(offsetMs);
301
- }}
302
- onPlayingChange={(isNowPlaying: boolean): void => {
303
- harness.playingChanges.push(isNowPlaying);
304
- }}
305
- onGapCrossed={(gap: SessionReplayGap): void => {
306
- harness.gaps.push(gap);
307
- }}
308
- onLoadedChunkIndexesChange={(): void => {
309
- // Not asserted here; the loader's own tests cover it.
310
- }}
311
- onError={(message: string): void => {
312
- harness.errors.push(message);
313
- }}
314
- />
315
- );
316
- };
191
+ /* jsdom does no layout: give the stage box a size by hand. */
192
+ function sizeElement(
193
+ element: HTMLElement,
194
+ width: number,
195
+ height: number,
196
+ ): void {
197
+ Object.defineProperty(element, "clientWidth", {
198
+ configurable: true,
199
+ get: (): number => {
200
+ return width;
201
+ },
202
+ });
203
+ Object.defineProperty(element, "clientHeight", {
204
+ configurable: true,
205
+ get: (): number => {
206
+ return height;
207
+ },
208
+ });
209
+ }
317
210
 
318
- const result: { rerender: (ui: React.ReactElement) => void } = render(
319
- element(props?.isPlaying ?? false),
211
+ function stageElement(): HTMLElement {
212
+ const element: HTMLElement | null = document.querySelector(
213
+ '[data-testid="replay-stage"]',
320
214
  );
321
215
 
322
- return {
323
- rerender: (isPlaying: boolean): void => {
324
- result.rerender(element(isPlaying));
325
- },
326
- };
327
- }
216
+ if (!element) {
217
+ throw new Error("stage not rendered");
218
+ }
328
219
 
329
- /* Lets every queued microtask (the awaits inside the stage) run to completion. */
330
- async function flush(): Promise<void> {
331
- await act(async (): Promise<void> => {
332
- await Promise.resolve();
333
- await Promise.resolve();
334
- await Promise.resolve();
335
- await Promise.resolve();
336
- });
220
+ return element;
337
221
  }
338
222
 
339
- async function tick(times: number): Promise<void> {
340
- for (let i: number = 0; i < times; i++) {
341
- await act(async (): Promise<void> => {
342
- jest.advanceTimersByTime(TICK_MS);
343
- await Promise.resolve();
344
- await Promise.resolve();
345
- await Promise.resolve();
346
- await Promise.resolve();
347
- });
223
+ function frameElement(): HTMLElement {
224
+ const element: HTMLElement | null = document.querySelector(
225
+ '[data-testid="replay-stage-frame"]',
226
+ );
227
+
228
+ if (!element) {
229
+ throw new Error("frame not rendered");
348
230
  }
349
- }
350
231
 
351
- beforeEach(() => {
352
- jest.useFakeTimers();
353
- });
232
+ return element;
233
+ }
354
234
 
355
235
  afterEach(() => {
236
+ cleanup();
356
237
  jest.useRealTimers();
238
+ document.body.innerHTML = "";
357
239
  });
358
240
 
359
- describe("ReplayStage chunk feeding", () => {
360
- it("feeds the contiguous next chunk into the live Replayer", async () => {
361
- const harness: Harness = makeHarness({
362
- entries: [makeEntry(0, { hasFullSnapshot: true }), makeEntry(1)],
363
- });
241
+ describe("ReplayStage mounting", () => {
242
+ it("attaches the engine's host into the stage on mount and detaches on unmount", () => {
243
+ const engine: FakeEngine = new FakeEngine();
364
244
 
365
- renderStage(harness);
366
- await flush();
245
+ const { unmount } = render(<ReplayStage engine={engine} />);
367
246
 
368
- expect(harness.replayers.length).toBe(1);
247
+ expect(engine.attachedTo).not.toBeNull();
248
+ expect(stageElement().contains(engine.host)).toBe(true);
249
+ expect(stageElement()).toHaveAttribute("role", "region");
250
+ expect(stageElement()).toHaveAttribute("aria-label", "Session replay");
369
251
 
370
- await tick(2);
252
+ unmount();
371
253
 
372
- const fed: Array<unknown> = harness.replayers[0]!.added.map(
373
- (event: SessionReplayRecordedEvent): unknown => {
374
- return event.data;
375
- },
254
+ expect(engine.detachCount).toBe(1);
255
+ expect(engine.host.parentElement).toBeNull();
256
+ });
257
+
258
+ it("exposes the engine phase for the E2E hooks and marks busy phases", () => {
259
+ const engine: FakeEngine = new FakeEngine({ phase: "buffering" });
260
+
261
+ render(<ReplayStage engine={engine} />);
262
+
263
+ expect(stageElement()).toHaveAttribute("data-replay-phase", "buffering");
264
+ expect(stageElement()).toHaveAttribute("aria-busy", "true");
265
+
266
+ /* The phase word itself is announced, not only stamped as data. */
267
+ const phase: HTMLElement | null = document.querySelector(
268
+ '[data-testid="replay-phase"]',
376
269
  );
270
+ expect(phase).not.toBeNull();
271
+ expect(phase).toHaveTextContent("buffering");
272
+ expect(phase).toHaveAttribute("aria-live", "polite");
377
273
 
378
- expect(fed).toEqual([
379
- { chunkIndex: 1, sequence: 0 },
380
- { chunkIndex: 1, sequence: 1 },
381
- ]);
382
- expect(harness.gaps).toEqual([]);
383
- expect(harness.errors).toEqual([]);
274
+ act((): void => {
275
+ engine.update({ phase: "playing" });
276
+ });
277
+
278
+ expect(stageElement()).toHaveAttribute("data-replay-phase", "playing");
279
+ expect(stageElement()).toHaveAttribute("aria-busy", "false");
280
+ expect(phase).toHaveTextContent("playing");
384
281
  });
282
+ });
385
283
 
386
- it("never treats a chunk that failed to decode as fed", async () => {
284
+ describe("ReplayStage sizing", () => {
285
+ it("reserves the recorded aspect from the header viewport before the first frame", () => {
286
+ const engine: FakeEngine = new FakeEngine();
287
+
288
+ render(
289
+ <ReplayStage engine={engine} viewportWidth={1440} viewportHeight={900} />,
290
+ );
291
+
292
+ const stage: HTMLElement = stageElement();
293
+
294
+ expect(stage.style.aspectRatio).toBe("1440 / 900");
295
+ expect(stage.style.minHeight).toBe(`${REPLAY_STAGE_MIN_HEIGHT_REM}rem`);
296
+ expect(stage.style.maxHeight).toBe(`${REPLAY_STAGE_MAX_HEIGHT_VH}vh`);
297
+ });
298
+
299
+ it("raises the height bound to the whole viewport in theater", () => {
300
+ const engine: FakeEngine = new FakeEngine();
301
+
302
+ render(<ReplayStage engine={engine} isTheater={true} />);
303
+
304
+ expect(stageElement().style.maxHeight).toBe(
305
+ `${REPLAY_STAGE_THEATER_MAX_HEIGHT_VH}vh`,
306
+ );
307
+ });
308
+
309
+ it("contain-fits on the smaller of the two ratios and centres the picture", () => {
387
310
  /*
388
- * The regression this whole file exists for. Chunk 1 is in the manifest
389
- * but the response does not carry it. Advancing lastFedChunkIndex anyway
390
- * would make the next tick feed chunk 2 into a Replayer that never
391
- * received 1 - a silent jump rendered as though it were continuous
392
- * footage, which is the one failure the design forbids outright.
311
+ * The old stage scaled on width alone, capped at 1 and anchored top
312
+ * left: a phone recording sat postage-stamped in the corner and a
313
+ * tall recording overflowed the box.
393
314
  */
394
- const harness: Harness = makeHarness({
395
- entries: [
396
- makeEntry(0, { hasFullSnapshot: true }),
397
- makeEntry(1),
398
- makeEntry(2, { hasFullSnapshot: true }),
399
- makeEntry(3),
400
- ],
401
- omitChunkIndexes: [1],
315
+ const engine: FakeEngine = new FakeEngine({
316
+ recordedSize: { width: 1200, height: 900 },
402
317
  });
318
+ const scales: Array<number> = [];
403
319
 
404
- renderStage(harness);
405
- await flush();
320
+ render(
321
+ <ReplayStage
322
+ engine={engine}
323
+ onScaleChange={(scale: number): void => {
324
+ scales.push(scale);
325
+ }}
326
+ />,
327
+ );
406
328
 
407
- expect(harness.replayers.length).toBe(1);
329
+ sizeElement(stageElement(), 600, 300);
408
330
 
409
- // Discover the failure.
410
- await tick(2);
331
+ act((): void => {
332
+ window.dispatchEvent(new Event("resize"));
333
+ });
411
334
 
412
- // Nothing from chunk 2 may have reached the first Replayer.
413
- expect(harness.replayers[0]!.added).toEqual([]);
335
+ const expected: number = computeContainScale(600, 300, {
336
+ width: 1200,
337
+ height: 900,
338
+ });
414
339
 
415
- // Play out the footage we do have, which is what releases the jump.
416
- harness.replayers[0]!.currentTimeMs = CHUNK_MS;
417
- await tick(2);
340
+ expect(expected).toBeCloseTo(1 / 3, 6);
341
+ expect(engine.host.style.transform).toBe(`scale(${expected})`);
342
+ expect(engine.host.style.width).toBe("1200px");
343
+ expect(engine.host.style.height).toBe("900px");
418
344
 
419
- expect(harness.gaps).toEqual([
420
- { fromIndex: 0, toIndex: 2, missingMs: CHUNK_MS },
421
- ]);
422
- expect(harness.replayers[0]!.added).toEqual([]);
423
- expect(harness.replayers[0]!.isDestroyed).toBe(true);
345
+ const frame: HTMLElement = frameElement();
424
346
 
425
- // Playback resumed by re-anchoring on the next full snapshot, not by guessing.
426
- expect(harness.replayers.length).toBe(2);
347
+ expect(frame.style.width).toBe("400px");
348
+ expect(frame.style.height).toBe("300px");
349
+ /* Letterboxed: (600 - 400) / 2. */
350
+ expect(frame.style.left).toBe("100px");
351
+ expect(frame.style.top).toBe("0px");
352
+ expect(scales[scales.length - 1]).toBeCloseTo(expected, 6);
353
+ });
354
+
355
+ it("scales a small recording UP rather than leaving it postage-stamped", () => {
427
356
  expect(
428
- harness.replayers[1]!.initialEvents.map(
429
- (event: SessionReplayRecordedEvent): unknown => {
430
- return event.data;
431
- },
432
- ),
433
- ).toEqual([
434
- { chunkIndex: 2, sequence: 0 },
435
- { chunkIndex: 2, sequence: 1 },
436
- ]);
357
+ computeContainScale(1500, 900, { width: 375, height: 812 }),
358
+ ).toBeCloseTo(900 / 812, 6);
437
359
  });
438
360
 
439
- it("errors rather than skipping when nothing can anchor after a failed chunk", async () => {
440
- const harness: Harness = makeHarness({
441
- entries: [makeEntry(0, { hasFullSnapshot: true }), makeEntry(1)],
442
- omitChunkIndexes: [1],
361
+ it("keeps the picture at 1:1 while the box is unmeasured", () => {
362
+ expect(computeContainScale(0, 0, { width: 1200, height: 900 })).toBe(1);
363
+ });
364
+
365
+ it("shows the recording at 1:1 in a scroll box when fit is actual", () => {
366
+ const engine: FakeEngine = new FakeEngine({
367
+ recordedSize: { width: 1200, height: 900 },
443
368
  });
444
369
 
445
- renderStage(harness);
446
- await flush();
447
- await tick(2);
370
+ render(<ReplayStage engine={engine} fit="actual" />);
448
371
 
449
- expect(harness.replayers[0]!.added).toEqual([]);
450
- expect(harness.errors.length).toBe(1);
451
- expect(harness.errors[0]).toContain("no later snapshot");
372
+ sizeElement(stageElement(), 600, 300);
452
373
 
453
- /*
454
- * And it stops trying. The tick runs five times a second and the fed
455
- * range can never advance past this, so retrying would re-POST /chunks
456
- * for footage that is not coming back.
457
- */
458
- const requestsAfterFailure: number = harness.requests.length;
459
- await tick(5);
374
+ act((): void => {
375
+ window.dispatchEvent(new Event("resize"));
376
+ });
460
377
 
461
- expect(harness.errors.length).toBe(1);
462
- expect(harness.requests.length).toBe(requestsAfterFailure);
378
+ expect(stageElement()).toHaveAttribute("data-replay-fit", "actual");
379
+ expect(stageElement().className).toContain("overflow-auto");
380
+ expect(engine.host.style.transform).toBe("");
381
+ expect(frameElement().style.width).toBe("1200px");
463
382
  });
464
383
  });
465
384
 
466
- describe("ReplayStage Replayer construction", () => {
467
- it("borrows the next contiguous chunk when the anchor has a single event", async () => {
468
- /*
469
- * rrweb 2.1.1 throws "Replayer need at least 2 events." out of its
470
- * constructor whenever liveMode is false and fewer than two events are
471
- * passed. A one-event anchor is exactly what splitting an oversized
472
- * FullSnapshot produces for its final part - the part that carries
473
- * hasFullSnapshot.
474
- */
475
- const harness: Harness = makeHarness({
476
- entries: [makeEntry(0, { hasFullSnapshot: true }), makeEntry(1)],
477
- eventsPerChunk: 1,
385
+ describe("ReplayStage replay document", () => {
386
+ it("injects the CSP and referrer metas and names the iframe on every rebuilt document", () => {
387
+ const engine: FakeEngine = new FakeEngine();
388
+ const replayer: ReplayerLike & { iframe: HTMLIFrameElement } =
389
+ makeReplayer();
390
+
391
+ render(<ReplayStage engine={engine} />);
392
+
393
+ act((): void => {
394
+ engine.emitReplayer({
395
+ type: "fullsnapshot-rebuilded",
396
+ replayer: replayer,
397
+ });
478
398
  });
479
399
 
480
- renderStage(harness);
481
- await flush();
400
+ const head: HTMLHeadElement | undefined =
401
+ replayer.iframe.contentDocument?.head;
402
+
403
+ expect(head).toBeDefined();
482
404
 
483
- expect(harness.errors).toEqual([]);
484
- expect(harness.replayers.length).toBe(1);
485
- expect(harness.replayers[0]!.initialEvents.length).toBeGreaterThanOrEqual(
486
- 2,
405
+ const csp: HTMLMetaElement | null | undefined = head?.querySelector(
406
+ 'meta[http-equiv="Content-Security-Policy"]',
487
407
  );
488
- });
489
408
 
490
- it("gives a domain message when a single event is all there is", async () => {
491
- const harness: Harness = makeHarness({
492
- entries: [makeEntry(0, { hasFullSnapshot: true })],
493
- eventsPerChunk: 1,
494
- });
409
+ expect(csp?.getAttribute("content")).toBe(REPLAY_DOCUMENT_CSP);
410
+ expect(REPLAY_DOCUMENT_CSP).toContain("script-src 'none'");
411
+ expect(
412
+ head?.querySelector('meta[name="referrer"]')?.getAttribute("content"),
413
+ ).toBe("no-referrer");
414
+ expect(replayer.iframe.title).toBe("Recorded page");
495
415
 
496
- renderStage(harness);
497
- await flush();
416
+ /* Idempotent: a second rebuild does not stack a second meta. */
417
+ act((): void => {
418
+ engine.emitReplayer({
419
+ type: "fullsnapshot-rebuilded",
420
+ replayer: replayer,
421
+ });
422
+ });
498
423
 
499
- expect(harness.replayers.length).toBe(0);
500
- expect(harness.errors.length).toBe(1);
501
- expect(harness.errors[0]).toContain("too short to play");
502
- // Never rrweb's own string.
503
- expect(harness.errors[0]).not.toContain("Replayer need at least");
424
+ expect(
425
+ head?.querySelectorAll('meta[http-equiv="Content-Security-Policy"]')
426
+ .length,
427
+ ).toBe(1);
504
428
  });
505
- });
506
429
 
507
- describe("ReplayStage playback clock", () => {
508
- it("reports offsets from the manifest, not from end-user event timestamps", async () => {
509
- /*
510
- * Event timestamps are raw Date.now() values from the recorded machine.
511
- * Deriving the segment base from them puts the playhead clockSkewMs away
512
- * from the bands and markers, which come from the manifest.
513
- */
514
- const harness: Harness = makeHarness({
515
- entries: [
516
- makeEntry(0),
517
- makeEntry(1),
518
- makeEntry(2, { hasFullSnapshot: true }),
519
- ],
520
- });
430
+ it("stops listening once unmounted", () => {
431
+ const engine: FakeEngine = new FakeEngine();
432
+ const replayer: ReplayerLike & { iframe: HTMLIFrameElement } =
433
+ makeReplayer();
521
434
 
522
- renderStage(harness);
523
- await flush();
435
+ const { unmount } = render(<ReplayStage engine={engine} />);
436
+ unmount();
524
437
 
525
- harness.replayers[0]!.currentTimeMs = 5000;
526
- await tick(1);
438
+ engine.emitReplayer({ type: "created", replayer: replayer });
527
439
 
528
- // Chunk 2 starts at 30000ms into the session.
529
- expect(harness.timeUpdates[harness.timeUpdates.length - 1]).toBe(35000);
440
+ expect(
441
+ replayer.iframe.contentDocument?.head.querySelector(
442
+ 'meta[http-equiv="Content-Security-Policy"]',
443
+ ),
444
+ ).toBeNull();
530
445
  });
531
446
  });
532
447
 
533
- describe("ReplayStage transport state", () => {
534
- it("honours a Play pressed while the first chunk is still loading", async () => {
535
- const harness: Harness & { resolveFetch: () => void } = makeHarness({
536
- entries: [makeEntry(0, { hasFullSnapshot: true }), makeEntry(1)],
537
- deferFetch: true,
448
+ describe("ReplayStage device frame and touch", () => {
449
+ it("draws the phone frame for a mobile-width recording", () => {
450
+ const engine: FakeEngine = new FakeEngine({
451
+ recordedSize: { width: 375, height: 812 },
538
452
  });
539
453
 
540
- const stage: { rerender: (isPlaying: boolean) => void } = renderStage(
541
- harness,
542
- { isPlaying: false },
543
- );
454
+ render(<ReplayStage engine={engine} />);
544
455
 
545
- await flush();
546
- expect(harness.replayers.length).toBe(0);
456
+ expect(stageElement()).toHaveAttribute("data-replay-frame", "phone");
457
+ expect(frameElement().className).toContain("ring-8");
458
+ });
547
459
 
548
- // The viewer presses Play while the fetch is still in flight.
549
- act((): void => {
550
- stage.rerender(true);
460
+ it("draws the plain frame for a desktop recording, and lets the prop override it", () => {
461
+ const engine: FakeEngine = new FakeEngine({
462
+ recordedSize: { width: 1440, height: 900 },
551
463
  });
552
464
 
553
- harness.resolveFetch();
554
- await flush();
465
+ const { rerender } = render(<ReplayStage engine={engine} />);
466
+
467
+ expect(stageElement()).toHaveAttribute("data-replay-frame", "desktop");
555
468
 
556
- expect(harness.replayers.length).toBe(1);
557
- expect(harness.replayers[0]!.playOffsets).toEqual([0]);
558
- expect(harness.replayers[0]!.pauseOffsets).toEqual([]);
469
+ rerender(<ReplayStage engine={engine} isMobile={true} />);
470
+
471
+ expect(stageElement()).toHaveAttribute("data-replay-frame", "phone");
559
472
  });
560
- });
561
473
 
562
- describe("ReplayStage finish handling", () => {
563
- it("does not stop playback when rrweb drains its buffer mid-recording", async () => {
564
- const harness: Harness = makeHarness({
565
- entries: [
566
- makeEntry(0, { hasFullSnapshot: true }),
567
- makeEntry(1),
568
- makeEntry(2),
569
- ],
474
+ it("draws a touch ring where rrweb cast a TouchStart, scaled, and removes it", () => {
475
+ jest.useFakeTimers();
476
+
477
+ const engine: FakeEngine = new FakeEngine({
478
+ recordedSize: { width: 400, height: 800 },
570
479
  });
571
480
 
572
- renderStage(harness, { isPlaying: true });
573
- await flush();
481
+ render(<ReplayStage engine={engine} />);
574
482
 
575
- const finish: ((payload: unknown) => void) | undefined =
576
- harness.replayers[0]!.handlers.get("finish");
483
+ sizeElement(stageElement(), 200, 400);
577
484
 
578
- expect(finish).toBeDefined();
485
+ act((): void => {
486
+ window.dispatchEvent(new Event("resize"));
487
+ });
579
488
 
580
489
  act((): void => {
581
- finish!(undefined);
490
+ engine.emitReplayer({ type: "touch", x: 100, y: 200 });
582
491
  });
583
492
 
584
- /*
585
- * There is still footage to feed, so this Finish is a stall waiting on
586
- * /chunks. Reporting it as "not playing" would stop the session for good:
587
- * later addEvent calls append to a machine that has already ended.
588
- */
589
- expect(harness.playingChanges).toEqual([]);
590
- });
493
+ const ring: HTMLElement | null = document.querySelector(
494
+ '[data-testid="replay-touch-ring"]',
495
+ );
591
496
 
592
- it("stops playback when the recording genuinely ends", async () => {
593
- const harness: Harness = makeHarness({
594
- entries: [makeEntry(0, { hasFullSnapshot: true })],
497
+ expect(ring).not.toBeNull();
498
+ expect(ring?.style.left).toBe("50px");
499
+ expect(ring?.style.top).toBe("100px");
500
+
501
+ act((): void => {
502
+ jest.advanceTimersByTime(800);
595
503
  });
596
504
 
597
- renderStage(harness, { isPlaying: true });
598
- await flush();
505
+ expect(
506
+ document.querySelector('[data-testid="replay-touch-ring"]'),
507
+ ).toBeNull();
508
+ });
509
+ });
510
+
511
+ describe("ReplayStage cursor", () => {
512
+ it("shortens the cursor transition with the playback speed", () => {
513
+ const engine: FakeEngine = new FakeEngine({ speed: 4 });
514
+
515
+ render(<ReplayStage engine={engine} />);
516
+
517
+ expect(
518
+ stageElement().style.getPropertyValue("--oneuptime-replay-cursor-ms"),
519
+ ).toBe("20ms");
599
520
 
600
521
  act((): void => {
601
- harness.replayers[0]!.handlers.get("finish")!(undefined);
522
+ engine.update({ speed: 0.5 });
602
523
  });
603
524
 
604
- expect(harness.playingChanges).toEqual([false]);
525
+ expect(
526
+ stageElement().style.getPropertyValue("--oneuptime-replay-cursor-ms"),
527
+ ).toBe("160ms");
605
528
  });
606
529
  });