@oneuptime/common 12.0.32 → 12.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1191) hide show
  1. package/Models/AnalyticsModels/RumSession.ts +117 -1
  2. package/Models/AnalyticsModels/RumSessionChunk.ts +13 -0
  3. package/Models/AnalyticsModels/Span.ts +14 -0
  4. package/Models/DatabaseModels/AlertCustomField.ts +77 -3
  5. package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
  6. package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
  7. package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
  8. package/Models/DatabaseModels/Index.ts +10 -0
  9. package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
  10. package/Models/DatabaseModels/Monitor.ts +76 -0
  11. package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
  12. package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
  13. package/Models/DatabaseModels/NetworkDevice.ts +176 -1
  14. package/Models/DatabaseModels/NetworkSite.ts +201 -2
  15. package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
  16. package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
  17. package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
  18. package/Models/DatabaseModels/RumApplication.ts +6 -6
  19. package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
  20. package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
  21. package/Models/DatabaseModels/TeamCustomField.ts +77 -3
  22. package/Models/DatabaseModels/TeamMember.ts +0 -9
  23. package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
  24. package/Models/DatabaseModels/TeamPermission.ts +3 -24
  25. package/Models/DatabaseModels/TelemetryException.ts +119 -0
  26. package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
  27. package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
  28. package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
  29. package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
  30. package/Models/DatabaseModels/UserTelegram.ts +0 -4
  31. package/Scripts/benchmark-fanin-capacity.js +181 -0
  32. package/Server/API/EnterpriseLicenseAPI.ts +391 -64
  33. package/Server/API/LlmProviderAPI.ts +137 -22
  34. package/Server/API/TelemetryAPI.ts +1284 -164
  35. package/Server/API/UserNotificationSettingAPI.ts +55 -0
  36. package/Server/API/UserTelegramAPI.ts +48 -4
  37. package/Server/EnvironmentConfig.ts +49 -2
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
  39. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
  40. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
  41. package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
  42. package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
  43. package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
  44. package/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.ts +91 -0
  45. package/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.ts +67 -0
  46. package/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.ts +139 -0
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.ts +121 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
  49. package/Server/Infrastructure/QueueWorker.ts +59 -23
  50. package/Server/Infrastructure/Semaphore.ts +2 -0
  51. package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
  52. package/Server/Middleware/ProjectAuthorization.ts +11 -0
  53. package/Server/Middleware/SCIMAuthorization.ts +12 -0
  54. package/Server/Middleware/TelemetryIngest.ts +464 -7
  55. package/Server/Services/AIBillingService.ts +101 -27
  56. package/Server/Services/AccessTokenService.ts +1 -0
  57. package/Server/Services/AlertCustomFieldService.ts +98 -0
  58. package/Server/Services/AlertService.ts +37 -0
  59. package/Server/Services/ApiKeyPermissionService.ts +461 -29
  60. package/Server/Services/CustomFieldMappingService.ts +879 -0
  61. package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
  62. package/Server/Services/EnterpriseLicenseService.ts +55 -0
  63. package/Server/Services/GlobalConfigService.ts +194 -0
  64. package/Server/Services/IncidentCustomFieldService.ts +98 -0
  65. package/Server/Services/IncidentService.ts +35 -0
  66. package/Server/Services/Index.ts +10 -0
  67. package/Server/Services/MetricService.ts +194 -0
  68. package/Server/Services/MonitorService.ts +175 -21
  69. package/Server/Services/MonitorStatusTimelineService.ts +150 -8
  70. package/Server/Services/MonitorTemplateService.ts +217 -1
  71. package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
  72. package/Server/Services/NetworkAlertPolicyService.ts +944 -0
  73. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +87 -35
  74. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
  75. package/Server/Services/NetworkDeviceService.ts +1032 -73
  76. package/Server/Services/NetworkSiteService.ts +1502 -129
  77. package/Server/Services/NetworkSiteTypeService.ts +1216 -0
  78. package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
  79. package/Server/Services/NotificationService.ts +118 -28
  80. package/Server/Services/ProjectService.ts +127 -48
  81. package/Server/Services/RoutineEmailSettingsService.ts +73 -0
  82. package/Server/Services/RumSessionReplayViewService.ts +104 -24
  83. package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
  84. package/Server/Services/ScheduledMaintenanceService.ts +32 -0
  85. package/Server/Services/StatusPagePrivateUserService.ts +103 -3
  86. package/Server/Services/TeamMemberService.ts +78 -0
  87. package/Server/Services/TeamPermissionService.ts +235 -3
  88. package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
  89. package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
  90. package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
  91. package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
  92. package/Server/Services/UserNotificationSettingService.ts +90 -25
  93. package/Server/Services/UserService.ts +95 -0
  94. package/Server/Services/UserTelegramService.ts +326 -5
  95. package/Server/Types/Database/QueryHelper.ts +4 -2
  96. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
  97. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
  98. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
  99. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
  100. package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
  101. package/Server/Utils/APIKey/AccessPermission.ts +5 -2
  102. package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
  103. package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
  104. package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
  105. package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
  106. package/Server/Utils/DataSource/EgressGuard.ts +177 -8
  107. package/Server/Utils/DataSource/HttpFetch.ts +9 -2
  108. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +131 -0
  109. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +925 -0
  110. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
  111. package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
  112. package/Server/Utils/FrontendEnvironment.ts +40 -0
  113. package/Server/Utils/LLM/LLMService.ts +78 -0
  114. package/Server/Utils/LogRedaction.ts +28 -0
  115. package/Server/Utils/Logger.ts +90 -1
  116. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +338 -77
  117. package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
  118. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
  119. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
  120. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
  121. package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
  122. package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
  123. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +159 -15
  124. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
  125. package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
  126. package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
  127. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +72 -0
  128. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
  129. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
  130. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
  131. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
  132. package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
  133. package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
  134. package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
  135. package/Server/Utils/OutboundUserAgent.ts +152 -0
  136. package/Server/Utils/SSRFProtection.ts +217 -10
  137. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
  138. package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
  139. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
  140. package/Server/Utils/StartServer.ts +53 -36
  141. package/Server/Utils/TelegramVerificationToken.ts +185 -0
  142. package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
  143. package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
  144. package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
  145. package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
  146. package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +38 -16
  147. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +92 -0
  148. package/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.ts +217 -0
  149. package/Server/Utils/Telemetry.ts +198 -51
  150. package/Server/Utils/VM/VMAPI.ts +1 -0
  151. package/Server/Utils/VM/VMRunner.ts +975 -95
  152. package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
  153. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
  154. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
  155. package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
  156. package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
  157. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
  158. package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
  159. package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
  160. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +486 -9
  161. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
  162. package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
  163. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
  164. package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
  165. package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
  166. package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
  167. package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
  168. package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
  169. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
  170. package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +399 -0
  171. package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
  172. package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
  173. package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
  174. package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
  175. package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
  176. package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
  177. package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
  178. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
  179. package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
  180. package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
  181. package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
  182. package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
  183. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
  184. package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
  185. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
  186. package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
  187. package/Tests/ResponsiveVisibility.test.ts +115 -0
  188. package/Tests/ResponsiveVisibility.ts +183 -0
  189. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
  190. package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
  191. package/Tests/Server/API/SessionReplayAPI.test.ts +1940 -216
  192. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +186 -0
  193. package/Tests/Server/API/UserTelegramAPISecurity.test.ts +231 -0
  194. package/Tests/Server/EnvironmentConfigFrontendSecurity.test.ts +234 -0
  195. package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +202 -0
  196. package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
  197. package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
  198. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
  199. package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
  200. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
  201. package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
  202. package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
  203. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
  204. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
  205. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
  206. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
  207. package/Tests/Server/Services/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
  208. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
  209. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
  210. package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
  211. package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
  212. package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
  213. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
  214. package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
  215. package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
  216. package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
  217. package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
  218. package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
  219. package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
  220. package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
  221. package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
  222. package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
  223. package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
  224. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +273 -5
  225. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
  226. package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
  227. package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
  228. package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
  229. package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
  230. package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
  231. package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
  232. package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
  233. package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
  234. package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
  235. package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
  236. package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
  237. package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
  238. package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
  239. package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
  240. package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
  241. package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
  242. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
  243. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
  244. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
  245. package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
  246. package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
  247. package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
  248. package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
  249. package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
  250. package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
  251. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +997 -0
  252. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +110 -1
  253. package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
  254. package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
  255. package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
  256. package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
  257. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
  258. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
  259. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
  260. package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
  261. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
  262. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
  263. package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
  264. package/Tests/Server/Utils/Captcha.test.ts +422 -0
  265. package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
  266. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
  267. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
  268. package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
  269. package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
  270. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
  271. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
  272. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
  273. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
  274. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +828 -0
  275. package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
  276. package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
  277. package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
  278. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
  279. package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
  280. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +584 -0
  281. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
  282. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
  283. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
  284. package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
  285. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +437 -0
  286. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
  287. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
  288. package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
  289. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
  290. package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
  291. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
  292. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
  293. package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
  294. package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
  295. package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
  296. package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
  297. package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
  298. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
  299. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
  300. package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
  301. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
  302. package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
  303. package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
  304. package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
  305. package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
  306. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriterCapacity.test.ts +458 -0
  307. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +424 -0
  308. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.test.ts +528 -0
  309. package/Tests/Server/Utils/Telemetry.test.ts +456 -66
  310. package/Tests/Server/Utils/TelemetryExporterEnvironment.test.ts +56 -0
  311. package/Tests/Server/Utils/VM/VMRunnerHostBridgeLatency.test.ts +74 -0
  312. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +100 -7
  313. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +1176 -6
  314. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +220 -0
  315. package/Tests/Types/CustomField/CustomFieldValueMapping.test.ts +348 -0
  316. package/Tests/Types/JSONFunctions.test.ts +260 -0
  317. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
  318. package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
  319. package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +495 -15
  320. package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
  321. package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
  322. package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
  323. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
  324. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
  325. package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
  326. package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
  327. package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
  328. package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
  329. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
  330. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
  331. package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
  332. package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
  333. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
  334. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
  335. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
  336. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
  337. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
  338. package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
  339. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
  340. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
  341. package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
  342. package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
  343. package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
  344. package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
  345. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
  346. package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
  347. package/Tests/Types/NotificationSetting/RoutineEmailEvents.test.ts +47 -0
  348. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +608 -0
  349. package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +434 -0
  350. package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
  351. package/Tests/Types/WebsiteRequest.test.ts +285 -3
  352. package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
  353. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
  354. package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
  355. package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
  356. package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
  357. package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
  358. package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
  359. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
  360. package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
  361. package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
  362. package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
  363. package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
  364. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
  365. package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
  366. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +43 -12
  367. package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
  368. package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
  369. package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
  370. package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
  371. package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
  372. package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
  373. package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
  374. package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
  375. package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
  376. package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
  377. package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
  378. package/Tests/UI/Rum/ChunkLoader.test.ts +1036 -2
  379. package/Tests/UI/Rum/FidelityNotices.test.ts +187 -0
  380. package/Tests/UI/Rum/InactivityMap.test.ts +341 -0
  381. package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +259 -0
  382. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +855 -0
  383. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +594 -0
  384. package/Tests/UI/Rum/ReplayCard.test.tsx +451 -0
  385. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +536 -0
  386. package/Tests/UI/Rum/ReplayEngine.test.ts +2503 -0
  387. package/Tests/UI/Rum/ReplayEngineTypes.test.ts +171 -0
  388. package/Tests/UI/Rum/ReplayHeader.test.tsx +711 -0
  389. package/Tests/UI/Rum/ReplayLink.test.tsx +119 -0
  390. package/Tests/UI/Rum/ReplayPinControl.test.tsx +408 -0
  391. package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +152 -0
  392. package/Tests/UI/Rum/ReplayRail.test.tsx +1296 -0
  393. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +900 -0
  394. package/Tests/UI/Rum/ReplayScrubber.test.tsx +763 -147
  395. package/Tests/UI/Rum/ReplaySignalTypes.test.ts +189 -0
  396. package/Tests/UI/Rum/ReplaySignals.test.ts +1579 -0
  397. package/Tests/UI/Rum/ReplayStage.test.tsx +396 -473
  398. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +918 -0
  399. package/Tests/UI/Rum/ReplayTimeline.test.tsx +696 -0
  400. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +499 -0
  401. package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +346 -0
  402. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +545 -0
  403. package/Tests/UI/Rum/SessionReplayTable.test.tsx +991 -0
  404. package/Tests/UI/Rum/TargetedCapturePanel.test.tsx +254 -0
  405. package/Tests/UI/Telemetry/BrowserExporterIsolation.test.ts +71 -0
  406. package/Tests/UI/Utils/GlobalKeyboardShortcut.test.ts +344 -0
  407. package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
  408. package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
  409. package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
  410. package/Tests/Utils/API.test.ts +308 -0
  411. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
  412. package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
  413. package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
  414. package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
  415. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
  416. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  417. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
  418. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
  419. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
  420. package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
  421. package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
  422. package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
  423. package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
  424. package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
  425. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
  426. package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
  427. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
  428. package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
  429. package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
  430. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
  431. package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
  432. package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
  433. package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
  434. package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
  435. package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
  436. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
  437. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
  438. package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
  439. package/Tests/Utils/ValueFormatter.test.ts +148 -0
  440. package/Types/AI/ExceptionAIClassification.ts +10 -24
  441. package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
  442. package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
  443. package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
  444. package/Types/Email/EmailTemplateType.ts +2 -0
  445. package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
  446. package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
  447. package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
  448. package/Types/Exception/ApiException.ts +10 -0
  449. package/Types/Exception/BadDataException.ts +11 -0
  450. package/Types/Exception/BadRequestException.ts +11 -0
  451. package/Types/Exception/Exception.ts +65 -0
  452. package/Types/Exception/ForbiddenException.ts +10 -0
  453. package/Types/Exception/NotAuthenticatedException.ts +10 -0
  454. package/Types/Exception/NotAuthorizedException.ts +10 -0
  455. package/Types/Exception/NotFoundException.ts +11 -0
  456. package/Types/Exception/PayloadTooLargeException.ts +11 -0
  457. package/Types/Exception/PaymentRequiredException.ts +10 -0
  458. package/Types/Exception/ServiceUnavailableException.ts +10 -0
  459. package/Types/Exception/SsoAuthorizationException.ts +10 -0
  460. package/Types/Exception/TenantNotFoundException.ts +11 -0
  461. package/Types/Exception/TimeoutException.ts +10 -0
  462. package/Types/Exception/TooManyRequestsException.ts +10 -0
  463. package/Types/Exception/UnableToReachServer.ts +10 -0
  464. package/Types/Exception/WebsiteRequestException.ts +10 -0
  465. package/Types/Icon/IconProp.ts +1 -0
  466. package/Types/JSONFunctions.ts +189 -43
  467. package/Types/Monitor/CephAlertTemplates.ts +157 -195
  468. package/Types/Monitor/CriteriaFilter.ts +60 -2
  469. package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
  470. package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
  471. package/Types/Monitor/DockerAlertTemplates.ts +338 -128
  472. package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
  473. package/Types/Monitor/HostAlertTemplates.ts +302 -130
  474. package/Types/Monitor/IotAlertTemplates.ts +112 -104
  475. package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
  476. package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
  477. package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
  478. package/Types/Monitor/MonitorMetricType.ts +71 -0
  479. package/Types/Monitor/MonitorStep.ts +76 -0
  480. package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
  481. package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
  482. package/Types/Monitor/MonitorType.ts +47 -1
  483. package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
  484. package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
  485. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
  486. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
  487. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
  488. package/Types/Monitor/RumAlertTemplates.ts +46 -7
  489. package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
  490. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
  491. package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
  492. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
  493. package/Types/Monitor/SqlConnectionConfig.ts +31 -0
  494. package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
  495. package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
  496. package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
  497. package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
  498. package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
  499. package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
  500. package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
  501. package/Types/Permission.ts +90 -0
  502. package/Types/Probe/ProbeMonitorResponse.ts +16 -0
  503. package/Types/Rum/SessionReplay.ts +209 -0
  504. package/Types/Rum/SessionReplayApi.ts +722 -0
  505. package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
  506. package/Types/Rum/SessionReplayConsentMode.ts +11 -7
  507. package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
  508. package/Types/Rum/SessionReplayHealth.ts +238 -0
  509. package/Types/Telemetry/ErrorClass.ts +274 -0
  510. package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
  511. package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
  512. package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
  513. package/Types/Telemetry/UnitOfWork.ts +59 -0
  514. package/Types/WebsiteRequest.ts +85 -3
  515. package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
  516. package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
  517. package/UI/Components/Charts/Line/LineChart.tsx +13 -2
  518. package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
  519. package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
  520. package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
  521. package/UI/Components/Charts/Utils/XAxis.ts +217 -0
  522. package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
  523. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +143 -25
  524. package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
  525. package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
  526. package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
  527. package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
  528. package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
  529. package/UI/Components/Header/Header.tsx +25 -9
  530. package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
  531. package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
  532. package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
  533. package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
  534. package/UI/Components/Icon/Icon.tsx +11 -0
  535. package/UI/Components/JSONTable/JSONTable.tsx +2 -2
  536. package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
  537. package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
  538. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
  539. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
  540. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
  541. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
  542. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
  543. package/UI/Components/Modal/Modal.tsx +2 -8
  544. package/UI/Components/ModelTable/Column.ts +15 -0
  545. package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
  546. package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
  547. package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
  548. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
  549. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +88 -0
  550. package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
  551. package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
  552. package/UI/Components/SideMenu/SideMenu.tsx +123 -5
  553. package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
  554. package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
  555. package/UI/Components/SideOver/SideOver.tsx +21 -20
  556. package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
  557. package/UI/Components/Table/CellClassName.ts +81 -0
  558. package/UI/Components/Table/TableRow.tsx +20 -14
  559. package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
  560. package/UI/Components/Table/Types/Column.ts +36 -0
  561. package/UI/Components/Tooltip/Tooltip.tsx +11 -1
  562. package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
  563. package/UI/Components/Workflow/NodePlacement.ts +57 -0
  564. package/UI/Components/Workflow/Workflow.tsx +47 -18
  565. package/UI/Config.ts +15 -33
  566. package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
  567. package/UI/Utils/PageScrollLock.ts +79 -3
  568. package/UI/Utils/PermissionGate.ts +61 -0
  569. package/UI/Utils/SensitiveUrlToken.ts +112 -0
  570. package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
  571. package/UI/Utils/Telemetry/Telemetry.ts +10 -8
  572. package/UI/Utils/TestLLMProvider.ts +11 -0
  573. package/Utils/API.ts +129 -3
  574. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
  575. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
  576. package/Utils/HTTPResponseBodyReader.ts +221 -0
  577. package/Utils/Monitor/MonitorMetricType.ts +153 -1
  578. package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
  579. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
  580. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
  581. package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
  582. package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
  583. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
  584. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
  585. package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
  586. package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
  587. package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
  588. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
  589. package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
  590. package/Utils/Rum/ChunkMath.ts +106 -0
  591. package/Utils/Rum/SessionReplayHealth.ts +732 -0
  592. package/Utils/Rum/SessionReplayStringMap.ts +226 -0
  593. package/Utils/Schema/ModelSchema.ts +1 -0
  594. package/Utils/StatusPage/ResourceSearch.ts +290 -0
  595. package/Utils/Telemetry/OriginAllowList.ts +355 -0
  596. package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
  597. package/Utils/ValueFormatter.ts +35 -1
  598. package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
  599. package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
  600. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
  601. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
  602. package/build/dist/Models/AnalyticsModels/Span.js +14 -0
  603. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  604. package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
  605. package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
  606. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
  607. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
  608. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
  609. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
  610. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
  611. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  612. package/build/dist/Models/DatabaseModels/Index.js +10 -0
  613. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  614. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
  615. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
  616. package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
  617. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  618. package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
  619. package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
  620. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
  621. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
  622. package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
  623. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  624. package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
  625. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
  626. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
  627. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
  628. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
  629. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
  630. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
  631. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
  632. package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
  633. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  634. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
  635. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
  636. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
  637. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
  638. package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
  639. package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
  640. package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
  641. package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
  642. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
  643. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
  644. package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
  645. package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
  646. package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
  647. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  648. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
  649. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
  650. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
  651. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
  652. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
  653. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
  654. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
  655. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
  656. package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
  657. package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
  658. package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
  659. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
  660. package/build/dist/Server/API/LlmProviderAPI.js +108 -13
  661. package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
  662. package/build/dist/Server/API/TelemetryAPI.js +769 -109
  663. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  664. package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
  665. package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
  666. package/build/dist/Server/API/UserTelegramAPI.js +28 -6
  667. package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
  668. package/build/dist/Server/EnvironmentConfig.js +41 -2
  669. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  670. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
  671. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
  672. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
  673. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
  674. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
  675. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
  676. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
  677. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
  678. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
  679. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
  680. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
  681. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
  682. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
  683. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
  684. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
  685. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
  686. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
  687. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
  688. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
  689. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
  690. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
  691. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  692. package/build/dist/Server/Infrastructure/QueueWorker.js +52 -12
  693. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  694. package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
  695. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  696. package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
  697. package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
  698. package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
  699. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  700. package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
  701. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
  702. package/build/dist/Server/Middleware/TelemetryIngest.js +326 -8
  703. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  704. package/build/dist/Server/Services/AIBillingService.js +70 -16
  705. package/build/dist/Server/Services/AIBillingService.js.map +1 -1
  706. package/build/dist/Server/Services/AccessTokenService.js +1 -0
  707. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  708. package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
  709. package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
  710. package/build/dist/Server/Services/AlertService.js +34 -0
  711. package/build/dist/Server/Services/AlertService.js.map +1 -1
  712. package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
  713. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  714. package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
  715. package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
  716. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
  717. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
  718. package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
  719. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  720. package/build/dist/Server/Services/GlobalConfigService.js +133 -0
  721. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  722. package/build/dist/Server/Services/IncidentCustomFieldService.js +93 -0
  723. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  724. package/build/dist/Server/Services/IncidentService.js +32 -0
  725. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  726. package/build/dist/Server/Services/Index.js +10 -0
  727. package/build/dist/Server/Services/Index.js.map +1 -1
  728. package/build/dist/Server/Services/MetricService.js +163 -0
  729. package/build/dist/Server/Services/MetricService.js.map +1 -1
  730. package/build/dist/Server/Services/MonitorService.js +148 -21
  731. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  732. package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
  733. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  734. package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
  735. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  736. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
  737. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
  738. package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
  739. package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
  740. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +89 -36
  741. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  742. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
  743. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  744. package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
  745. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  746. package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
  747. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  748. package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
  749. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
  750. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
  751. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
  752. package/build/dist/Server/Services/NotificationService.js +80 -17
  753. package/build/dist/Server/Services/NotificationService.js.map +1 -1
  754. package/build/dist/Server/Services/ProjectService.js +88 -30
  755. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  756. package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
  757. package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
  758. package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
  759. package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
  760. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
  761. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
  762. package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
  763. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  764. package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
  765. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  766. package/build/dist/Server/Services/TeamMemberService.js +62 -2
  767. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  768. package/build/dist/Server/Services/TeamPermissionService.js +166 -3
  769. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  770. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
  771. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  772. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
  773. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
  774. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
  775. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
  776. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
  777. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
  778. package/build/dist/Server/Services/UserNotificationSettingService.js +66 -20
  779. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  780. package/build/dist/Server/Services/UserService.js +90 -0
  781. package/build/dist/Server/Services/UserService.js.map +1 -1
  782. package/build/dist/Server/Services/UserTelegramService.js +257 -4
  783. package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
  784. package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
  785. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  786. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
  787. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  788. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
  789. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  790. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
  791. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  792. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
  793. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
  794. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
  795. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  796. package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
  797. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  798. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
  799. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
  800. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
  801. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
  802. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
  803. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
  804. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
  805. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
  806. package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
  807. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  808. package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
  809. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  810. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +124 -0
  811. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
  812. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +733 -0
  813. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
  814. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
  815. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
  816. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
  817. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
  818. package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
  819. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
  820. package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
  821. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  822. package/build/dist/Server/Utils/LogRedaction.js +28 -0
  823. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  824. package/build/dist/Server/Utils/Logger.js +73 -1
  825. package/build/dist/Server/Utils/Logger.js.map +1 -1
  826. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +287 -68
  827. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  828. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
  829. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
  830. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  831. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  832. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
  833. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  834. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
  835. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  836. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
  837. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  838. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
  839. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
  840. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +125 -13
  841. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  842. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
  843. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  844. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  845. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  846. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  847. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  848. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +54 -0
  849. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  850. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
  851. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  852. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
  853. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  854. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
  855. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  856. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
  857. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  858. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
  859. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
  860. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
  861. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
  862. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
  863. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
  864. package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
  865. package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
  866. package/build/dist/Server/Utils/SSRFProtection.js +136 -9
  867. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  868. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
  869. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
  870. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
  871. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
  872. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
  873. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  874. package/build/dist/Server/Utils/StartServer.js +41 -28
  875. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  876. package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
  877. package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
  878. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
  879. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  880. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
  881. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
  882. package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
  883. package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
  884. package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
  885. package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
  886. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
  887. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
  888. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
  889. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
  890. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
  891. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
  892. package/build/dist/Server/Utils/Telemetry.js +162 -46
  893. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  894. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  895. package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
  896. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  897. package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
  898. package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
  899. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +60 -0
  900. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -0
  901. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js +20 -0
  902. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js.map +1 -0
  903. package/build/dist/Types/CustomField/CustomFieldValueMapping.js +141 -0
  904. package/build/dist/Types/CustomField/CustomFieldValueMapping.js.map +1 -0
  905. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  906. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  907. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
  908. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
  909. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
  910. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
  911. package/build/dist/Types/Exception/ApiException.js +9 -0
  912. package/build/dist/Types/Exception/ApiException.js.map +1 -1
  913. package/build/dist/Types/Exception/BadDataException.js +10 -0
  914. package/build/dist/Types/Exception/BadDataException.js.map +1 -1
  915. package/build/dist/Types/Exception/BadRequestException.js +10 -0
  916. package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
  917. package/build/dist/Types/Exception/Exception.js +56 -0
  918. package/build/dist/Types/Exception/Exception.js.map +1 -1
  919. package/build/dist/Types/Exception/ForbiddenException.js +9 -0
  920. package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
  921. package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
  922. package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
  923. package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
  924. package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
  925. package/build/dist/Types/Exception/NotFoundException.js +10 -0
  926. package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
  927. package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
  928. package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
  929. package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
  930. package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
  931. package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
  932. package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
  933. package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
  934. package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
  935. package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
  936. package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
  937. package/build/dist/Types/Exception/TimeoutException.js +9 -0
  938. package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
  939. package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
  940. package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
  941. package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
  942. package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
  943. package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
  944. package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
  945. package/build/dist/Types/Icon/IconProp.js +1 -0
  946. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  947. package/build/dist/Types/JSONFunctions.js +118 -37
  948. package/build/dist/Types/JSONFunctions.js.map +1 -1
  949. package/build/dist/Types/Monitor/CephAlertTemplates.js +130 -171
  950. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  951. package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
  952. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  953. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
  954. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
  955. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
  956. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
  957. package/build/dist/Types/Monitor/DockerAlertTemplates.js +286 -121
  958. package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
  959. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
  960. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
  961. package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
  962. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
  963. package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
  964. package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
  965. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
  966. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  967. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
  968. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  969. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
  970. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  971. package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
  972. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  973. package/build/dist/Types/Monitor/MonitorStep.js +54 -0
  974. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  975. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
  976. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
  977. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
  978. package/build/dist/Types/Monitor/MonitorType.js +45 -1
  979. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  980. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
  981. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
  982. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
  983. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
  984. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
  985. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
  986. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
  987. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  988. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
  989. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
  990. package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
  991. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  992. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
  993. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
  994. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
  995. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
  996. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
  997. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
  998. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
  999. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  1000. package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
  1001. package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
  1002. package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
  1003. package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
  1004. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
  1005. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
  1006. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
  1007. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
  1008. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
  1009. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
  1010. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
  1011. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
  1012. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
  1013. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
  1014. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
  1015. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
  1016. package/build/dist/Types/Permission.js +80 -0
  1017. package/build/dist/Types/Permission.js.map +1 -1
  1018. package/build/dist/Types/Rum/SessionReplay.js +117 -0
  1019. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  1020. package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
  1021. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
  1022. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
  1023. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
  1024. package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
  1025. package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
  1026. package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
  1027. package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
  1028. package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
  1029. package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
  1030. package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
  1031. package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
  1032. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
  1033. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
  1034. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
  1035. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
  1036. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
  1037. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
  1038. package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
  1039. package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
  1040. package/build/dist/Types/WebsiteRequest.js +55 -3
  1041. package/build/dist/Types/WebsiteRequest.js.map +1 -1
  1042. package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
  1043. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  1044. package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
  1045. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  1046. package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
  1047. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  1048. package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
  1049. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
  1050. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  1051. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
  1052. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  1053. package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
  1054. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  1055. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
  1056. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  1057. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +80 -6
  1058. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  1059. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +118 -0
  1060. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -0
  1061. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
  1062. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  1063. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +112 -7
  1064. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  1065. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
  1066. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  1067. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
  1068. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
  1069. package/build/dist/UI/Components/Header/Header.js +2 -3
  1070. package/build/dist/UI/Components/Header/Header.js.map +1 -1
  1071. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
  1072. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
  1073. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
  1074. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
  1075. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
  1076. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
  1077. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
  1078. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
  1079. package/build/dist/UI/Components/Icon/Icon.js +5 -0
  1080. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  1081. package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
  1082. package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
  1083. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
  1084. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
  1085. package/build/dist/UI/Components/Modal/Modal.js +2 -7
  1086. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  1087. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
  1088. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
  1089. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
  1090. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
  1091. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
  1092. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  1093. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
  1094. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  1095. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +77 -0
  1096. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  1097. package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
  1098. package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
  1099. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
  1100. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
  1101. package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
  1102. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  1103. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
  1104. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  1105. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
  1106. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  1107. package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
  1108. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  1109. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
  1110. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
  1111. package/build/dist/UI/Components/Table/CellClassName.js +55 -0
  1112. package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
  1113. package/build/dist/UI/Components/Table/TableRow.js +16 -13
  1114. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  1115. package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
  1116. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
  1117. package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
  1118. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  1119. package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
  1120. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  1121. package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
  1122. package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
  1123. package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
  1124. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  1125. package/build/dist/UI/Config.js +10 -20
  1126. package/build/dist/UI/Config.js.map +1 -1
  1127. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
  1128. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
  1129. package/build/dist/UI/Utils/PageScrollLock.js +31 -3
  1130. package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
  1131. package/build/dist/UI/Utils/PermissionGate.js +42 -1
  1132. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  1133. package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
  1134. package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
  1135. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
  1136. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
  1137. package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
  1138. package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
  1139. package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
  1140. package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
  1141. package/build/dist/Utils/API.js +67 -5
  1142. package/build/dist/Utils/API.js.map +1 -1
  1143. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
  1144. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
  1145. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
  1146. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  1147. package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
  1148. package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
  1149. package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
  1150. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  1151. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
  1152. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  1153. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
  1154. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
  1155. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
  1156. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
  1157. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
  1158. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
  1159. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
  1160. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
  1161. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
  1162. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  1163. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
  1164. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  1165. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
  1166. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
  1167. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
  1168. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
  1169. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
  1170. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
  1171. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
  1172. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  1173. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
  1174. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
  1175. package/build/dist/Utils/Rum/ChunkMath.js +76 -0
  1176. package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
  1177. package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
  1178. package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
  1179. package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
  1180. package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
  1181. package/build/dist/Utils/Schema/ModelSchema.js +1 -0
  1182. package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
  1183. package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
  1184. package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
  1185. package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
  1186. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
  1187. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
  1188. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
  1189. package/build/dist/Utils/ValueFormatter.js +32 -1
  1190. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  1191. package/package.json +2 -2
@@ -0,0 +1,1378 @@
1
+ import RumSessionService from "../../../../Server/Services/RumSessionService";
2
+ import RumSessionChunkService from "../../../../Server/Services/RumSessionChunkService";
3
+ import ExceptionInstanceService from "../../../../Server/Services/ExceptionInstanceService";
4
+ import { Statement } from "../../../../Server/Utils/AnalyticsDatabase/Statement";
5
+ import SessionReplayReadService, {
6
+ MAX_LIST_ROUTES,
7
+ SESSION_REPLAY_ACTIVITY_SUMMARY_CACHE_TTL_MS,
8
+ SessionReplayApplicationActivitySummary,
9
+ SessionReplayChunkReadResult,
10
+ SessionReplayExceptionSession,
11
+ SessionReplayExpiredSessionInfo,
12
+ SessionReplayListFilters,
13
+ SessionReplayListItem,
14
+ SessionReplayListRequest,
15
+ SessionReplayListResult,
16
+ SessionReplayManifest,
17
+ SessionReplaySessionHeader,
18
+ SessionReplaySessionIdentity,
19
+ } from "../../../../Server/Utils/SessionReplay/SessionReplayReadService";
20
+ import BadDataException from "../../../../Types/Exception/BadDataException";
21
+ import { JSONObject } from "../../../../Types/JSON";
22
+ import ObjectID from "../../../../Types/ObjectID";
23
+ import { MAX_SESSION_REPLAY_READ_BYTES } from "../../../../Types/Rum/SessionReplay";
24
+ import { SessionReplaySortBy } from "../../../../Types/Rum/SessionReplayApi";
25
+ import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
26
+
27
+ /*
28
+ * Statement-text tests for the bespoke ClickHouse reads. Nothing here
29
+ * talks to a database: executeQuery is spied and the SQL it would have
30
+ * run is asserted. What is pinned is the shape that keeps the reads
31
+ * correct on a ReplacingMergeTree and cheap under the sort key: every
32
+ * list predicate is a HAVING clause over an argMax alias (never a raw
33
+ * column, which would match a superseded header version), the WHERE
34
+ * stays the (projectId, rumApplicationId, startTime) prefix, the
35
+ * payload column is named by exactly one read, and the identity columns
36
+ * are named only when the caller asked for them.
37
+ */
38
+
39
+ function fakeResultSet(rows: Array<JSONObject>): unknown {
40
+ return {
41
+ json: async (): Promise<JSONObject> => {
42
+ return { data: rows } as unknown as JSONObject;
43
+ },
44
+ };
45
+ }
46
+
47
+ function statementOf(spy: jest.SpyInstance, call: number = 0): Statement {
48
+ const statement: Statement | undefined = spy.mock.calls[call]?.[0] as
49
+ | Statement
50
+ | undefined;
51
+
52
+ if (!statement) {
53
+ throw new Error(`executeQuery call ${call} was not made`);
54
+ }
55
+
56
+ return statement;
57
+ }
58
+
59
+ function boundValues(statement: Statement): Array<unknown> {
60
+ return Object.values(statement.query_params);
61
+ }
62
+
63
+ /* The HAVING section of a list statement, so WHERE-level leaks fail. */
64
+ function havingSection(query: string): string {
65
+ const index: number = query.indexOf("HAVING 1 = 1");
66
+
67
+ if (index < 0) {
68
+ throw new Error("Statement has no HAVING section");
69
+ }
70
+
71
+ return query.substring(index);
72
+ }
73
+
74
+ function whereSection(query: string): string {
75
+ const start: number = query.indexOf("WHERE");
76
+ const end: number = query.indexOf("GROUP BY");
77
+
78
+ return query.substring(start, end > 0 ? end : undefined);
79
+ }
80
+
81
+ describe("SessionReplayReadService statements", () => {
82
+ const projectId: ObjectID = ObjectID.generate();
83
+ const rumApplicationId: ObjectID = ObjectID.generate();
84
+
85
+ let headerQuerySpy: jest.SpyInstance;
86
+ let chunkQuerySpy: jest.SpyInstance;
87
+ let exceptionQuerySpy: jest.SpyInstance;
88
+
89
+ beforeEach(() => {
90
+ jest.clearAllMocks();
91
+ SessionReplayReadService.clearActivitySummaryCache();
92
+ SessionReplayReadService.setPublishedRecorderVersionProvider(null);
93
+
94
+ headerQuerySpy = jest
95
+ .spyOn(RumSessionService, "executeQuery")
96
+ .mockResolvedValue(fakeResultSet([]) as never);
97
+ chunkQuerySpy = jest
98
+ .spyOn(RumSessionChunkService, "executeQuery")
99
+ .mockResolvedValue(fakeResultSet([]) as never);
100
+ exceptionQuerySpy = jest
101
+ .spyOn(ExceptionInstanceService, "executeQuery")
102
+ .mockResolvedValue(fakeResultSet([]) as never);
103
+ });
104
+
105
+ afterEach(() => {
106
+ jest.restoreAllMocks();
107
+ });
108
+
109
+ function listRequest(
110
+ overrides: Partial<SessionReplayListRequest> = {},
111
+ ): SessionReplayListRequest {
112
+ return {
113
+ projectId: projectId,
114
+ rumApplicationId: rumApplicationId,
115
+ startTime: new Date("2026-08-01T00:00:00.000Z"),
116
+ endTime: new Date("2026-08-08T00:00:00.000Z"),
117
+ filters: {},
118
+ limit: 20,
119
+ includeIdentifiedUserLabel: false,
120
+ ...overrides,
121
+ };
122
+ }
123
+
124
+ async function listQuery(
125
+ filters: SessionReplayListFilters,
126
+ overrides: Partial<SessionReplayListRequest> = {},
127
+ ): Promise<string> {
128
+ await SessionReplayReadService.listSessions(
129
+ listRequest({ filters: filters, ...overrides }),
130
+ );
131
+
132
+ return statementOf(headerQuerySpy).query;
133
+ }
134
+
135
+ describe("list predicates are HAVING clauses over argMax aliases", () => {
136
+ test("hasIdentifiedUser tests the digest alias, never the label", async () => {
137
+ const positive: string = await listQuery({ hasIdentifiedUser: true });
138
+ expect(havingSection(positive)).toContain(
139
+ "AND aggIdentifiedUserKey != ''",
140
+ );
141
+ expect(whereSection(positive)).not.toContain("identifiedUserKey");
142
+ expect(positive).not.toContain("identifiedUserLabel");
143
+
144
+ headerQuerySpy.mockClear();
145
+
146
+ const negative: string = await listQuery({ hasIdentifiedUser: false });
147
+ expect(havingSection(negative)).toContain(
148
+ "AND aggIdentifiedUserKey = ''",
149
+ );
150
+ });
151
+
152
+ test("isPlayable combines finalization, chunk count and the lost seal", async () => {
153
+ const playable: string = await listQuery({ isPlayable: true });
154
+ expect(havingSection(playable)).toContain(
155
+ "AND ((aggIsFinalized = 0 OR aggChunkCount > 0) AND aggSealedReason != 'recording-lost')",
156
+ );
157
+
158
+ headerQuerySpy.mockClear();
159
+
160
+ const unplayable: string = await listQuery({ isPlayable: false });
161
+ expect(havingSection(unplayable)).toContain(
162
+ "AND NOT ((aggIsFinalized = 0 OR aggChunkCount > 0) AND aggSealedReason != 'recording-lost')",
163
+ );
164
+ });
165
+
166
+ test("hasTraces tests the trace-count alias", async () => {
167
+ const query: string = await listQuery({ hasTraces: true });
168
+ expect(havingSection(query)).toContain("AND aggTraceCount > 0");
169
+ expect(query).toContain(
170
+ "toFloat64(length(argMax(traceIds, version))) AS aggTraceCount",
171
+ );
172
+
173
+ headerQuerySpy.mockClear();
174
+
175
+ const none: string = await listQuery({ hasTraces: false });
176
+ expect(havingSection(none)).toContain("AND aggTraceCount = 0");
177
+ });
178
+
179
+ /*
180
+ * The routes and entry URL stored on a header are scrubbed ABSOLUTE
181
+ * urls (https://host/path), but the filter a person types is a PATH -
182
+ * the search box routes anything beginning with "/" to this filter, and
183
+ * the docs promise `url:/checkout` outright. Matching the whole string
184
+ * only meant that documented search returned an empty list in every
185
+ * project, silently. Both arms are needed: the whole-URL one for a
186
+ * caller that pastes an absolute URL, the path() one for the path.
187
+ */
188
+ test("urlPrefix matches the PATH of a route and of the entry URL, as well as the whole URL", async () => {
189
+ const query: string = await listQuery({ urlPrefix: "/checkout" });
190
+ const having: string = havingSection(query);
191
+
192
+ expect(having).toMatch(
193
+ /AND \(arrayExists\(r -> startsWith\(r, \{p\d+:String\}\) OR startsWith\(path\(r\), \{p\d+:String\}\), aggRoutes\) OR startsWith\(aggEntryUrl, \{p\d+:String\}\) OR startsWith\(path\(aggEntryUrl\), \{p\d+:String\}\)\)/,
194
+ );
195
+ expect(query).toContain("argMax(routes, version) AS aggRoutes");
196
+ /* Bound four times, never interpolated. */
197
+ expect(query).not.toContain("'/checkout'");
198
+ expect(
199
+ boundValues(statementOf(headerQuerySpy)).filter(
200
+ (value: unknown): boolean => {
201
+ return value === "/checkout";
202
+ },
203
+ ),
204
+ ).toHaveLength(4);
205
+ });
206
+
207
+ test("tags require every pair through mapContains over the argMax'd map", async () => {
208
+ const query: string = await listQuery({
209
+ tags: { build: "1.2.3", tier: "enterprise" },
210
+ });
211
+ const having: string = havingSection(query);
212
+
213
+ expect(having).toMatch(
214
+ /AND mapContains\(aggTags, \{p\d+:String\}\) AND aggTags\[\{p\d+:String\}\] = \{p\d+:String\}/,
215
+ );
216
+ expect(having.match(/mapContains\(aggTags/g)).toHaveLength(2);
217
+ expect(query).toContain("argMax(tags, version) AS aggTags");
218
+
219
+ const bound: Array<unknown> = boundValues(statementOf(headerQuerySpy));
220
+ expect(bound).toContain("build");
221
+ expect(bound).toContain("1.2.3");
222
+ expect(bound).toContain("tier");
223
+ expect(bound).toContain("enterprise");
224
+ });
225
+
226
+ test("search covers sessionId, both URLs, routes and trace ids, binds the term, and omits the label by default", async () => {
227
+ const query: string = await listQuery({ search: "acme" });
228
+ const having: string = havingSection(query);
229
+
230
+ expect(having).toMatch(/startsWith\(sessionId, \{p\d+:String\}\)/);
231
+ expect(having).toMatch(
232
+ /positionCaseInsensitiveUTF8\(aggEntryUrl, \{p\d+:String\}\) > 0/,
233
+ );
234
+ expect(having).toMatch(
235
+ /positionCaseInsensitiveUTF8\(aggExitUrl, \{p\d+:String\}\) > 0/,
236
+ );
237
+ expect(having).toMatch(
238
+ /arrayExists\(r -> positionCaseInsensitiveUTF8\(r, \{p\d+:String\}\) > 0, aggRoutes\)/,
239
+ );
240
+ expect(having).toMatch(
241
+ /has\(argMax\(traceIds, version\), \{p\d+:String\}\)/,
242
+ );
243
+ expect(query).not.toContain("identifiedUserLabel");
244
+ expect(query).not.toContain("'acme'");
245
+ expect(boundValues(statementOf(headerQuerySpy))).toContain("acme");
246
+ });
247
+
248
+ test("search names the identified user label only when the caller may read it", async () => {
249
+ const query: string = await listQuery(
250
+ { search: "jane" },
251
+ { includeIdentifiedUserLabel: true },
252
+ );
253
+
254
+ expect(havingSection(query)).toMatch(
255
+ /positionCaseInsensitiveUTF8\(aggIdentifiedUserLabel, \{p\d+:String\}\) > 0/,
256
+ );
257
+ expect(query).toContain(
258
+ "argMax(identifiedUserLabel, version) AS aggIdentifiedUserLabel",
259
+ );
260
+ });
261
+
262
+ test("search is appended after the cheap boolean predicates", async () => {
263
+ const query: string = await listQuery({
264
+ search: "acme",
265
+ hasError: true,
266
+ hasTraces: true,
267
+ isPlayable: true,
268
+ });
269
+ const having: string = havingSection(query);
270
+
271
+ const searchAt: number = having.indexOf("startsWith(sessionId");
272
+ expect(searchAt).toBeGreaterThan(having.indexOf("aggHasError ="));
273
+ expect(searchAt).toBeGreaterThan(having.indexOf("aggTraceCount > 0"));
274
+ expect(searchAt).toBeGreaterThan(having.indexOf("aggIsFinalized = 0"));
275
+ });
276
+
277
+ test("the WHERE stays the sort-key prefix whatever filters are set", async () => {
278
+ const query: string = await listQuery({
279
+ search: "acme",
280
+ urlPrefix: "/x",
281
+ tags: { a: "b" },
282
+ hasTraces: true,
283
+ isPlayable: true,
284
+ hasIdentifiedUser: true,
285
+ route: "/y",
286
+ browserNames: ["Chrome"],
287
+ });
288
+ const where: string = whereSection(query);
289
+
290
+ expect(where).toContain("projectId = ");
291
+ expect(where).toContain("rumApplicationId = ");
292
+ expect(where).toContain("startTime >= ");
293
+ expect(where).toContain("startTime <= ");
294
+ expect(where).toContain("retentionDate >= now()");
295
+
296
+ for (const forbidden of [
297
+ "routes",
298
+ "tags",
299
+ "traceIds",
300
+ "entryUrl",
301
+ "browserName",
302
+ "identifiedUserKey",
303
+ "sealedReason",
304
+ ]) {
305
+ expect(where).not.toContain(forbidden);
306
+ }
307
+ });
308
+
309
+ test("the exact route filter runs over the routes alias", async () => {
310
+ const query: string = await listQuery({ route: "https://a/b" });
311
+ expect(havingSection(query)).toMatch(
312
+ /AND has\(aggRoutes, \{p\d+:String\}\)/,
313
+ );
314
+ });
315
+ });
316
+
317
+ describe("list sort and cursor", () => {
318
+ test("defaults to newest first with a sessionId tiebreak", async () => {
319
+ const query: string = await listQuery({});
320
+ expect(query).toContain("ORDER BY aggStartTime DESC, sessionId DESC");
321
+ });
322
+
323
+ test.each([
324
+ ["durationMs", "aggDurationMs"],
325
+ ["errorCount", "aggErrorCount"],
326
+ [
327
+ "frustration",
328
+ "(aggRageClickCount + aggDeadClickCount + aggErrorClickCount + aggRefreshRageCount)",
329
+ ],
330
+ ] as Array<[SessionReplaySortBy, string]>)(
331
+ "sortBy %s orders by its alias with a sessionId tiebreak",
332
+ async (sortBy: SessionReplaySortBy, expression: string) => {
333
+ const query: string = await listQuery({}, { sortBy: sortBy });
334
+ expect(query).toContain(`ORDER BY ${expression} DESC, sessionId DESC`);
335
+ },
336
+ );
337
+
338
+ test("an unknown sortBy is refused before any query", async () => {
339
+ await expect(
340
+ SessionReplayReadService.listSessions(
341
+ listRequest({ sortBy: "payloadBytes" as SessionReplaySortBy }),
342
+ ),
343
+ ).rejects.toBeInstanceOf(BadDataException);
344
+ expect(headerQuerySpy).not.toHaveBeenCalled();
345
+ });
346
+
347
+ test("a newest-first cursor bounds startTime in the WHERE and tiebreaks in HAVING", async () => {
348
+ const query: string = await listQuery(
349
+ {},
350
+ {
351
+ cursor: {
352
+ sortBy: "startTime",
353
+ sortValue: 1700000000000,
354
+ sessionId: "s-9",
355
+ },
356
+ },
357
+ );
358
+
359
+ /* The window's own upper bound plus the cursor's. */
360
+ expect(whereSection(query).match(/startTime <= /g)).toHaveLength(2);
361
+ expect(havingSection(query)).toMatch(
362
+ /AND \(aggStartTime < \{p\d+:Double\} OR \(aggStartTime = \{p\d+:Double\} AND sessionId < \{p\d+:String\}\)\)/,
363
+ );
364
+ });
365
+
366
+ test("a cursor on any other sort never touches the WHERE", async () => {
367
+ const query: string = await listQuery(
368
+ {},
369
+ {
370
+ sortBy: "errorCount",
371
+ cursor: { sortBy: "errorCount", sortValue: 4, sessionId: "s-9" },
372
+ },
373
+ );
374
+
375
+ expect(whereSection(query).match(/startTime <= /g)).toHaveLength(1);
376
+ expect(havingSection(query)).toMatch(
377
+ /AND \(aggErrorCount < \{p\d+:Double\} OR \(aggErrorCount = \{p\d+:Double\} AND sessionId < \{p\d+:String\}\)\)/,
378
+ );
379
+ });
380
+
381
+ test("a cursor from a different ordering is refused", async () => {
382
+ await expect(
383
+ SessionReplayReadService.listSessions(
384
+ listRequest({
385
+ sortBy: "durationMs",
386
+ cursor: { sortBy: "errorCount", sortValue: 4, sessionId: "s" },
387
+ }),
388
+ ),
389
+ ).rejects.toBeInstanceOf(BadDataException);
390
+ expect(headerQuerySpy).not.toHaveBeenCalled();
391
+ });
392
+
393
+ test("nextCursor carries the sort key of the last row, and only when a page follows", async () => {
394
+ const rows: Array<JSONObject> = [
395
+ { sessionId: "a", aggErrorCount: 9, aggStartTime: 3 },
396
+ { sessionId: "b", aggErrorCount: 4, aggStartTime: 2 },
397
+ { sessionId: "c", aggErrorCount: 1, aggStartTime: 1 },
398
+ ];
399
+ headerQuerySpy.mockResolvedValue(fakeResultSet(rows) as never);
400
+
401
+ const result: SessionReplayListResult =
402
+ await SessionReplayReadService.listSessions(
403
+ listRequest({ limit: 2, sortBy: "errorCount" }),
404
+ );
405
+
406
+ expect(result.sessions).toHaveLength(2);
407
+ expect(result.nextCursor).toEqual({
408
+ sortBy: "errorCount",
409
+ sortValue: 4,
410
+ sessionId: "b",
411
+ });
412
+
413
+ headerQuerySpy.mockResolvedValue(fakeResultSet(rows) as never);
414
+
415
+ const lastPage: SessionReplayListResult =
416
+ await SessionReplayReadService.listSessions(
417
+ listRequest({ limit: 3, sortBy: "errorCount" }),
418
+ );
419
+ expect(lastPage.nextCursor).toBeNull();
420
+ });
421
+ });
422
+
423
+ describe("list projections", () => {
424
+ test("selects the engagement, correlation and expiry columns and the live duration", async () => {
425
+ const query: string = await listQuery({});
426
+
427
+ for (const projection of [
428
+ "toFloat64(length(argMax(exceptionFingerprints, version))) AS aggExceptionGroupCount",
429
+ "toFloat64(argMax(clickCount, version)) AS aggClickCount",
430
+ "toFloat64(argMax(activeMs, version)) AS aggActiveMs",
431
+ "toFloat64(argMax(firstErrorOffsetMs, version)) AS aggFirstErrorOffsetMs",
432
+ "toFloat64(toUnixTimestamp(argMax(retentionDate, version))) * 1000 AS aggExpiresAt",
433
+ "argMax(tags, version) AS aggTags",
434
+ "argMax(routes, version) AS aggRoutes",
435
+ ]) {
436
+ expect(query).toContain(projection);
437
+ }
438
+
439
+ /*
440
+ * A provisional header says durationMs 0 for ten minutes; the span
441
+ * it asserts itself is the honest lower bound until then.
442
+ */
443
+ expect(query).toContain(
444
+ "toFloat64(if(argMax(isFinalized, version), toInt64(argMax(durationMs, version)), greatest(toInt64(argMax(durationMs, version)), toUnixTimestamp64Milli(argMax(endTime, version)) - toUnixTimestamp64Milli(argMax(startTime, version))))) AS aggDurationMs",
445
+ );
446
+
447
+ expect(query).not.toContain("identifiedUserTraits");
448
+ expect(query).not.toMatch(/\bpayload\b(?!Bytes)/);
449
+ expect(query).toContain("retentionDate >= now()");
450
+ });
451
+
452
+ test("maps the new projections, slicing routes and keeping the clock as numbers", async () => {
453
+ headerQuerySpy.mockResolvedValue(
454
+ fakeResultSet([
455
+ {
456
+ sessionId: "s-1",
457
+ applicationId: rumApplicationId.toString(),
458
+ aggStartTime: 1700000000000,
459
+ aggEndTime: 1700000090000,
460
+ aggRoutes: ["/a", "/b", "/c", "/d", "/e", "/f", "/g"],
461
+ aggTraceCount: "3",
462
+ aggExceptionGroupCount: 2,
463
+ aggClickCount: 41,
464
+ aggActiveMs: "54000",
465
+ aggFirstErrorOffsetMs: "12000",
466
+ aggExpiresAt: 1700604800000,
467
+ aggTags: { build: "1.2.3" },
468
+ },
469
+ ]) as never,
470
+ );
471
+
472
+ const result: SessionReplayListResult =
473
+ await SessionReplayReadService.listSessions(listRequest());
474
+ const item: SessionReplayListItem = result.sessions[0]!;
475
+
476
+ expect(item.routes).toHaveLength(MAX_LIST_ROUTES);
477
+ expect(item.routes[0]).toBe("/a");
478
+ expect(item.traceCount).toBe(3);
479
+ expect(item.exceptionGroupCount).toBe(2);
480
+ expect(item.clickCount).toBe(41);
481
+ expect(item.activeMs).toBe(54000);
482
+ expect(item.firstErrorOffsetMs).toBe(12000);
483
+ expect(item.expiresAtUnixMs).toBe(1700604800000);
484
+ expect(item.tags).toEqual({ build: "1.2.3" });
485
+ expect(item.startTimeUnixMs).toBe(1700000000000);
486
+ expect(item.endTimeUnixMs).toBe(1700000090000);
487
+ expect(item.identifiedUserTraits).toBeUndefined();
488
+ expect(item.identifiedUserLabel).toBeUndefined();
489
+ });
490
+
491
+ /*
492
+ * The list's "3 errors" badge has nowhere to link without a
493
+ * fingerprint: the Exceptions page can only be opened unfiltered.
494
+ * Projected from the same argMax'd array the group count is measured
495
+ * over, so the two can never disagree about which session errored.
496
+ */
497
+ test("the first exception fingerprint is projected so the errors badge can link", async () => {
498
+ const query: string = await listQuery({});
499
+
500
+ expect(query).toContain(
501
+ "arrayElement(argMax(exceptionFingerprints, version), 1) AS aggTopExceptionFingerprint",
502
+ );
503
+
504
+ headerQuerySpy.mockResolvedValue(
505
+ fakeResultSet([
506
+ {
507
+ sessionId: "s-1",
508
+ aggTopExceptionFingerprint: "fp-abc",
509
+ },
510
+ ]) as never,
511
+ );
512
+
513
+ const withFingerprint: SessionReplayListResult =
514
+ await SessionReplayReadService.listSessions(listRequest());
515
+
516
+ expect(withFingerprint.sessions[0]!.topExceptionFingerprint).toBe(
517
+ "fp-abc",
518
+ );
519
+
520
+ /* A clean session reports "", never undefined. */
521
+ headerQuerySpy.mockResolvedValue(
522
+ fakeResultSet([{ sessionId: "s-2" }]) as never,
523
+ );
524
+
525
+ const clean: SessionReplayListResult =
526
+ await SessionReplayReadService.listSessions(listRequest());
527
+
528
+ expect(clean.sessions[0]!.topExceptionFingerprint).toBe("");
529
+ });
530
+
531
+ test("names and maps the identity columns only when asked", async () => {
532
+ headerQuerySpy.mockResolvedValue(
533
+ fakeResultSet([
534
+ {
535
+ sessionId: "s-1",
536
+ aggIdentifiedUserLabel: "jane@example.com",
537
+ aggIdentifiedUserTraits: { plan: "pro" },
538
+ },
539
+ ]) as never,
540
+ );
541
+
542
+ const result: SessionReplayListResult =
543
+ await SessionReplayReadService.listSessions(
544
+ listRequest({ includeIdentifiedUserLabel: true }),
545
+ );
546
+
547
+ const query: string = statementOf(headerQuerySpy).query;
548
+ expect(query).toContain(
549
+ "argMax(identifiedUserTraits, version) AS aggIdentifiedUserTraits",
550
+ );
551
+ expect(result.sessions[0]!.identifiedUserLabel).toBe("jane@example.com");
552
+ expect(result.sessions[0]!.identifiedUserTraits).toEqual({
553
+ plan: "pro",
554
+ });
555
+ });
556
+ });
557
+
558
+ describe("getSessionHeader", () => {
559
+ const headerRow: JSONObject = {
560
+ sessionId: "s-1",
561
+ headerProjectId: "p",
562
+ applicationId: "a",
563
+ aggStartTime: 1700000000000,
564
+ aggEndTime: 1700000060000,
565
+ aggIsFinalized: 1,
566
+ aggClientReportedStart: 1699999999000,
567
+ aggTags: { env: "prod" },
568
+ aggExpiresAt: 1700604800000,
569
+ aggClickCount: 7,
570
+ aggCustomEventCount: 2,
571
+ aggActiveMs: 30000,
572
+ aggFirstErrorOffsetMs: 5000,
573
+ aggAttributes: {
574
+ "recorder.capabilities": "click-events,web-vitals,made-up",
575
+ },
576
+ };
577
+
578
+ test("never names the identity columns and pins the application only when given one", async () => {
579
+ headerQuerySpy.mockResolvedValue(fakeResultSet([headerRow]) as never);
580
+
581
+ await SessionReplayReadService.getSessionHeader({
582
+ projectId: projectId,
583
+ sessionId: "s-1",
584
+ });
585
+
586
+ const plain: string = statementOf(headerQuerySpy).query;
587
+ expect(plain).not.toContain("identifiedUserLabel");
588
+ expect(plain).not.toContain("identifiedUserTraits");
589
+ expect(plain).not.toContain("rumApplicationId = ");
590
+ expect(plain).toContain("LIMIT 2");
591
+ expect(plain).toContain("retentionDate >= now()");
592
+
593
+ headerQuerySpy.mockClear();
594
+
595
+ await SessionReplayReadService.getSessionHeader({
596
+ projectId: projectId,
597
+ sessionId: "s-1",
598
+ rumApplicationId: rumApplicationId,
599
+ });
600
+
601
+ const pinned: Statement = statementOf(headerQuerySpy);
602
+ expect(whereSection(pinned.query)).toContain("rumApplicationId = ");
603
+ expect(boundValues(pinned)).toContain(rumApplicationId.toString());
604
+ });
605
+
606
+ test("maps the clock, tags, expiry, counters and the known recorder capabilities", async () => {
607
+ headerQuerySpy.mockResolvedValue(fakeResultSet([headerRow]) as never);
608
+
609
+ const header: SessionReplaySessionHeader | null =
610
+ await SessionReplayReadService.getSessionHeader({
611
+ projectId: projectId,
612
+ sessionId: "s-1",
613
+ });
614
+
615
+ expect(header).not.toBeNull();
616
+ expect(header!.startTimeUnixMs).toBe(1700000000000);
617
+ expect(header!.endTimeUnixMs).toBe(1700000060000);
618
+ expect(header!.clientReportedStartUnixMs).toBe(1699999999000);
619
+ expect(header!.tags).toEqual({ env: "prod" });
620
+ expect(header!.expiresAtUnixMs).toBe(1700604800000);
621
+ expect(header!.clickCount).toBe(7);
622
+ expect(header!.customEventCount).toBe(2);
623
+ expect(header!.activeMs).toBe(30000);
624
+ expect(header!.firstErrorOffsetMs).toBe(5000);
625
+ /* A stored value outside the vocabulary never reaches the player. */
626
+ expect(header!.recorderCapabilities).toEqual([
627
+ "click-events",
628
+ "web-vitals",
629
+ ]);
630
+ expect(header!.identifiedUserLabel).toBeUndefined();
631
+ expect(header!.identifiedUserTraits).toBeUndefined();
632
+ });
633
+
634
+ test("an ambiguous session id is refused with an actionable message", async () => {
635
+ headerQuerySpy.mockResolvedValue(
636
+ fakeResultSet([
637
+ headerRow,
638
+ { ...headerRow, applicationId: "b" },
639
+ ]) as never,
640
+ );
641
+
642
+ await expect(
643
+ SessionReplayReadService.getSessionHeader({
644
+ projectId: projectId,
645
+ sessionId: "s-1",
646
+ }),
647
+ ).rejects.toThrow(/rumApplicationId/);
648
+ });
649
+ });
650
+
651
+ describe("getSessionIdentity", () => {
652
+ test("names both identity columns, pinned to the application", async () => {
653
+ headerQuerySpy.mockResolvedValue(
654
+ fakeResultSet([
655
+ {
656
+ aggIdentifiedUserLabel: "jane@example.com",
657
+ aggIdentifiedUserTraits: { plan: "pro", seats: 4 },
658
+ },
659
+ ]) as never,
660
+ );
661
+
662
+ const identity: SessionReplaySessionIdentity =
663
+ await SessionReplayReadService.getSessionIdentity({
664
+ projectId: projectId,
665
+ rumApplicationId: rumApplicationId,
666
+ sessionId: "s-1",
667
+ });
668
+
669
+ const statement: Statement = statementOf(headerQuerySpy);
670
+ expect(statement.query).toContain(
671
+ "argMax(identifiedUserLabel, version) AS aggIdentifiedUserLabel",
672
+ );
673
+ expect(statement.query).toContain(
674
+ "argMax(identifiedUserTraits, version) AS aggIdentifiedUserTraits",
675
+ );
676
+ expect(whereSection(statement.query)).toContain("rumApplicationId = ");
677
+ expect(statement.query).toContain("retentionDate >= now()");
678
+
679
+ expect(identity.identifiedUserLabel).toBe("jane@example.com");
680
+ /* A numeric-looking trait still renders. */
681
+ expect(identity.identifiedUserTraits).toEqual({
682
+ plan: "pro",
683
+ seats: "4",
684
+ });
685
+ });
686
+
687
+ test("answers empty rather than throwing when no row survives retention", async () => {
688
+ const identity: SessionReplaySessionIdentity =
689
+ await SessionReplayReadService.getSessionIdentity({
690
+ projectId: projectId,
691
+ rumApplicationId: rumApplicationId,
692
+ sessionId: "s-1",
693
+ });
694
+
695
+ expect(identity).toEqual({
696
+ identifiedUserLabel: "",
697
+ identifiedUserTraits: {},
698
+ });
699
+ });
700
+ });
701
+
702
+ describe("getExpiredSessionInfo", () => {
703
+ test("reads past retention, returning only dates and the application", async () => {
704
+ headerQuerySpy.mockResolvedValue(
705
+ fakeResultSet([
706
+ {
707
+ applicationId: rumApplicationId.toString(),
708
+ expiresAtUnixMs: 1700604800000,
709
+ startTimeUnixMs: 1700000000000,
710
+ },
711
+ ]) as never,
712
+ );
713
+
714
+ const info: SessionReplayExpiredSessionInfo | null =
715
+ await SessionReplayReadService.getExpiredSessionInfo({
716
+ projectId: projectId,
717
+ sessionId: "s-1",
718
+ });
719
+
720
+ const query: string = statementOf(headerQuerySpy).query;
721
+ expect(query).not.toContain("retentionDate >= now()");
722
+ expect(query).toContain("max(retentionDate)");
723
+ expect(query).not.toMatch(/\bpayload\b/);
724
+ expect(query).not.toContain("identifiedUser");
725
+
726
+ expect(info).not.toBeNull();
727
+ expect(info!.rumApplicationId).toBe(rumApplicationId.toString());
728
+ expect(info!.expiresAt.getTime()).toBe(1700604800000);
729
+ expect(info!.startTime.getTime()).toBe(1700000000000);
730
+ });
731
+
732
+ test("is null when no header ever existed", async () => {
733
+ expect(
734
+ await SessionReplayReadService.getExpiredSessionInfo({
735
+ projectId: projectId,
736
+ sessionId: "never",
737
+ }),
738
+ ).toBeNull();
739
+ });
740
+ });
741
+
742
+ describe("getManifest", () => {
743
+ function header(
744
+ overrides: Partial<SessionReplaySessionHeader>,
745
+ ): SessionReplaySessionHeader {
746
+ return {
747
+ sessionId: "s-1",
748
+ projectId: projectId.toString(),
749
+ rumApplicationId: rumApplicationId.toString(),
750
+ startTime: new Date(1700000000000),
751
+ endTime: new Date(1700000015000),
752
+ durationMs: 0,
753
+ isFinalized: false,
754
+ sealedReason: "",
755
+ chunkCount: 0,
756
+ maxChunkIndex: 0,
757
+ missingChunkCount: 0,
758
+ eventCount: 0,
759
+ payloadBytes: 0,
760
+ hasError: false,
761
+ errorCount: 0,
762
+ rageClickCount: 0,
763
+ deadClickCount: 0,
764
+ errorClickCount: 0,
765
+ refreshRageCount: 0,
766
+ pageCount: 1,
767
+ triggerReason: "always",
768
+ maskingMode: "MaskAllText",
769
+ consentState: "NotRequired",
770
+ recorderKind: "dom",
771
+ recorderVersion: "1.0.0",
772
+ rrwebVersion: "2.1.1",
773
+ schemaVersion: 1,
774
+ wireVersion: 1,
775
+ entryUrl: "https://a/",
776
+ exitUrl: "https://a/",
777
+ routes: ["https://a/"],
778
+ browserName: "Chrome",
779
+ browserVersion: "1",
780
+ osName: "macOS",
781
+ deviceType: "desktop",
782
+ countryCode: "GB",
783
+ viewportWidth: 1,
784
+ viewportHeight: 1,
785
+ fidelityNotices: [],
786
+ fullSnapshotChunkIndexes: [],
787
+ traceIds: [],
788
+ exceptionFingerprints: [],
789
+ clockSkewMs: 0,
790
+ startTimeUnixMs: 1700000000000,
791
+ endTimeUnixMs: 1700000015000,
792
+ clientReportedStartUnixMs: 1700000000000,
793
+ tags: {},
794
+ expiresAtUnixMs: 1700604800000,
795
+ clickCount: 0,
796
+ customEventCount: 0,
797
+ activeMs: 0,
798
+ firstErrorOffsetMs: 0,
799
+ recorderCapabilities: [],
800
+ ...overrides,
801
+ };
802
+ }
803
+
804
+ const chunkRows: Array<JSONObject> = [
805
+ {
806
+ tabId: "tab-1",
807
+ chunkIndex: 0,
808
+ chunkStartOffsetMs: 0,
809
+ chunkEndOffsetMs: 15000,
810
+ eventCount: 100,
811
+ hasFullSnapshot: 1,
812
+ chunkPayloadBytes: 1024,
813
+ clickCount: 3,
814
+ url: "https://a/",
815
+ },
816
+ {
817
+ tabId: "tab-1",
818
+ chunkIndex: 1,
819
+ chunkStartOffsetMs: 15000,
820
+ chunkEndOffsetMs: 30000,
821
+ eventCount: 50,
822
+ hasFullSnapshot: 0,
823
+ chunkPayloadBytes: 512,
824
+ clickCount: 1,
825
+ url: "https://a/checkout",
826
+ },
827
+ {
828
+ tabId: "tab-2",
829
+ chunkIndex: 0,
830
+ chunkStartOffsetMs: 134000,
831
+ chunkEndOffsetMs: 150000,
832
+ eventCount: 20,
833
+ hasFullSnapshot: 1,
834
+ chunkPayloadBytes: 256,
835
+ clickCount: 0,
836
+ url: "https://a/help",
837
+ },
838
+ ];
839
+
840
+ test("projects clickCount and url per chunk, never the payload, and derives each tab's first offset", async () => {
841
+ chunkQuerySpy.mockResolvedValue(fakeResultSet(chunkRows) as never);
842
+
843
+ const manifest: SessionReplayManifest =
844
+ await SessionReplayReadService.getManifest({
845
+ header: header({ isFinalized: true, durationMs: 150000 }),
846
+ projectId: projectId,
847
+ rumApplicationId: rumApplicationId,
848
+ sessionId: "s-1",
849
+ });
850
+
851
+ const query: string = statementOf(chunkQuerySpy).query;
852
+ expect(query).toContain("clickCount");
853
+ expect(query).toContain("url");
854
+ expect(query).not.toMatch(/\bpayload\b(?!Bytes)/);
855
+ expect(query).not.toContain("length(payload)");
856
+ expect(query).toContain("retentionDate >= now()");
857
+
858
+ expect(manifest.tabs).toHaveLength(2);
859
+ expect(manifest.tabs[0]!.firstChunkStartOffsetMs).toBe(0);
860
+ expect(manifest.tabs[1]!.firstChunkStartOffsetMs).toBe(134000);
861
+ expect(manifest.tabs[0]!.chunks[1]!.clickCount).toBe(1);
862
+ expect(manifest.tabs[0]!.chunks[1]!.url).toBe("https://a/checkout");
863
+ });
864
+
865
+ test("a finalized header is returned untouched", async () => {
866
+ chunkQuerySpy.mockResolvedValue(fakeResultSet(chunkRows) as never);
867
+
868
+ const finalized: SessionReplaySessionHeader = header({
869
+ isFinalized: true,
870
+ durationMs: 90000,
871
+ chunkCount: 9,
872
+ eventCount: 9,
873
+ });
874
+
875
+ const manifest: SessionReplayManifest =
876
+ await SessionReplayReadService.getManifest({
877
+ header: finalized,
878
+ projectId: projectId,
879
+ rumApplicationId: rumApplicationId,
880
+ sessionId: "s-1",
881
+ });
882
+
883
+ expect(manifest.header).toBe(finalized);
884
+ });
885
+
886
+ test("a provisional header reports what its chunk rows prove instead of zeros", async () => {
887
+ chunkQuerySpy.mockResolvedValue(fakeResultSet(chunkRows) as never);
888
+
889
+ const manifest: SessionReplayManifest =
890
+ await SessionReplayReadService.getManifest({
891
+ header: header({ isFinalized: false }),
892
+ projectId: projectId,
893
+ rumApplicationId: rumApplicationId,
894
+ sessionId: "s-1",
895
+ });
896
+
897
+ expect(manifest.header.isFinalized).toBe(false);
898
+ expect(manifest.header.durationMs).toBe(150000);
899
+ expect(manifest.header.chunkCount).toBe(3);
900
+ expect(manifest.header.eventCount).toBe(170);
901
+ expect(manifest.header.maxChunkIndex).toBe(1);
902
+ expect(manifest.header.endTimeUnixMs).toBe(1700000150000);
903
+ expect(manifest.header.endTime.getTime()).toBe(1700000150000);
904
+ });
905
+ });
906
+
907
+ describe("getChunks", () => {
908
+ const chunkRequest: {
909
+ projectId: ObjectID;
910
+ rumApplicationId: ObjectID;
911
+ sessionId: string;
912
+ tabId: string;
913
+ chunkIndexes: Array<number>;
914
+ } = {
915
+ projectId: projectId,
916
+ rumApplicationId: rumApplicationId,
917
+ sessionId: "s-1",
918
+ tabId: "tab-1",
919
+ chunkIndexes: [0, 1, 2],
920
+ };
921
+
922
+ test("measures the stored size in the one statement that ships the bytes", async () => {
923
+ chunkQuerySpy.mockResolvedValue(
924
+ fakeResultSet([
925
+ { chunkIndex: 0, servedPayload: "[1]", isServed: 1 },
926
+ { chunkIndex: 1, servedPayload: "[22]", isServed: 1 },
927
+ ]) as never,
928
+ );
929
+
930
+ const result: SessionReplayChunkReadResult =
931
+ await SessionReplayReadService.getChunks(chunkRequest);
932
+
933
+ expect(chunkQuerySpy).toHaveBeenCalledTimes(1);
934
+
935
+ const query: string = statementOf(chunkQuerySpy).query;
936
+ expect(query).toContain("length(payload)");
937
+ expect(query).not.toContain("toFloat64(payloadBytes)");
938
+ expect(query).toContain(
939
+ "ORDER BY chunkIndex ASC, version DESC LIMIT 1 BY chunkIndex",
940
+ );
941
+ expect(query).toContain(
942
+ "row_number() OVER (ORDER BY chunkIndex ASC) = 1",
943
+ );
944
+ expect(query).toContain("retentionDate >= now()");
945
+ expect(boundValues(statementOf(chunkQuerySpy))).toContain(
946
+ MAX_SESSION_REPLAY_READ_BYTES,
947
+ );
948
+
949
+ expect(
950
+ result.chunks.map((c: { chunkIndex: number }): number => {
951
+ return c.chunkIndex;
952
+ }),
953
+ ).toEqual([0, 1]);
954
+ expect(result.omittedChunkIndexes).toEqual([]);
955
+ });
956
+
957
+ test("serves the prefix that fits and names what was left out, never refusing outright", async () => {
958
+ chunkQuerySpy.mockResolvedValue(
959
+ fakeResultSet([
960
+ { chunkIndex: 0, servedPayload: "[1]", isServed: 1 },
961
+ { chunkIndex: 1, servedPayload: "", isServed: 0 },
962
+ { chunkIndex: 2, servedPayload: "[3]", isServed: 1 },
963
+ ]) as never,
964
+ );
965
+
966
+ const result: SessionReplayChunkReadResult =
967
+ await SessionReplayReadService.getChunks(chunkRequest);
968
+
969
+ expect(
970
+ result.chunks.map((c: { chunkIndex: number }): number => {
971
+ return c.chunkIndex;
972
+ }),
973
+ ).toEqual([0]);
974
+ /* Chunk 2 fit, but a hole before it would be unplayable. */
975
+ expect(result.omittedChunkIndexes).toEqual([1, 2]);
976
+ });
977
+
978
+ test("a single oversized chunk is still served: the ingest cap already bounded it", async () => {
979
+ const fat: string = "a".repeat(MAX_SESSION_REPLAY_READ_BYTES + 10);
980
+
981
+ chunkQuerySpy.mockResolvedValue(
982
+ fakeResultSet([
983
+ { chunkIndex: 0, servedPayload: fat, isServed: 1 },
984
+ ]) as never,
985
+ );
986
+
987
+ const result: SessionReplayChunkReadResult =
988
+ await SessionReplayReadService.getChunks({
989
+ ...chunkRequest,
990
+ chunkIndexes: [0],
991
+ });
992
+
993
+ expect(result.chunks).toHaveLength(1);
994
+ expect(result.omittedChunkIndexes).toEqual([]);
995
+ });
996
+
997
+ test("re-applies the cap to the bytes actually returned", async () => {
998
+ const half: string = "a".repeat(5 * 1024 * 1024);
999
+
1000
+ chunkQuerySpy.mockResolvedValue(
1001
+ fakeResultSet([
1002
+ { chunkIndex: 0, servedPayload: half, isServed: 1 },
1003
+ { chunkIndex: 1, servedPayload: half, isServed: 1 },
1004
+ ]) as never,
1005
+ );
1006
+
1007
+ const result: SessionReplayChunkReadResult =
1008
+ await SessionReplayReadService.getChunks({
1009
+ ...chunkRequest,
1010
+ chunkIndexes: [0, 1],
1011
+ });
1012
+
1013
+ expect(
1014
+ result.chunks.map((c: { chunkIndex: number }): number => {
1015
+ return c.chunkIndex;
1016
+ }),
1017
+ ).toEqual([0]);
1018
+ expect(result.omittedChunkIndexes).toEqual([1]);
1019
+ });
1020
+
1021
+ test("refuses more than the per-read chunk cap before querying", async () => {
1022
+ await expect(
1023
+ SessionReplayReadService.getChunks({
1024
+ ...chunkRequest,
1025
+ chunkIndexes: [0, 1, 2, 3, 4, 5, 6, 7, 8],
1026
+ }),
1027
+ ).rejects.toBeInstanceOf(BadDataException);
1028
+ expect(chunkQuerySpy).not.toHaveBeenCalled();
1029
+ });
1030
+ });
1031
+
1032
+ describe("getSessionsForException", () => {
1033
+ test("always bounds the window and consults the exception instances for live sessions", async () => {
1034
+ exceptionQuerySpy.mockResolvedValue(
1035
+ fakeResultSet([
1036
+ { sessionId: "live-1" },
1037
+ { sessionId: "live-2" },
1038
+ ]) as never,
1039
+ );
1040
+
1041
+ await SessionReplayReadService.getSessionsForException({
1042
+ projectId: projectId,
1043
+ exceptionFingerprint: "fp-1",
1044
+ accessibleRumApplicationIds: null,
1045
+ limit: 5,
1046
+ });
1047
+
1048
+ const instances: Statement = statementOf(exceptionQuerySpy);
1049
+ expect(instances.query).toContain("SELECT DISTINCT sessionId");
1050
+ expect(instances.query).toContain("fingerprint = ");
1051
+ expect(instances.query).toContain("sessionId != ''");
1052
+ expect(instances.query).toContain("time >= ");
1053
+ expect(instances.query).toContain("time <= ");
1054
+ expect(boundValues(instances)).toContain("fp-1");
1055
+
1056
+ const headers: Statement = statementOf(headerQuerySpy);
1057
+ const where: string = whereSection(headers.query);
1058
+ expect(where).toContain("startTime >= ");
1059
+ expect(where).toContain("startTime <= ");
1060
+ expect(where).toContain("retentionDate >= now()");
1061
+ expect(where).toMatch(
1062
+ /AND \(hasAny\(exceptionFingerprints, \[\{p\d+:String\}\]\) OR sessionId IN \(\{p\d+:Array\(String\)\}\)\)/,
1063
+ );
1064
+ expect(
1065
+ havingSection(headers.query.replace("HAVING (", "HAVING 1 = 1 AND (")),
1066
+ ).toMatch(
1067
+ /hasAny\(aggExceptionFingerprints, \[\{p\d+:String\}\]\) OR sessionId IN \(\{p\d+:Array\(String\)\}\)/,
1068
+ );
1069
+ expect(boundValues(headers)).toContainEqual(["live-1", "live-2"]);
1070
+ });
1071
+
1072
+ /*
1073
+ * A pinned sessionId NARROWS the instance lookup; it does not replace
1074
+ * it. Returning the pin unchecked reduced the statement to
1075
+ * `sessionId = X AND (hasAny(fingerprints, [f]) OR sessionId IN (X))`,
1076
+ * whose second arm is trivially true - so the fingerprint constrained
1077
+ * nothing and the "Watch what the user saw" card would present any
1078
+ * accessible session as having observed the exception, on nothing but a
1079
+ * stale occurrence row.
1080
+ */
1081
+ test("a pinned session id still has to be confirmed by the instance table", async () => {
1082
+ exceptionQuerySpy.mockResolvedValue(
1083
+ fakeResultSet([{ sessionId: "s-9" }]) as never,
1084
+ );
1085
+
1086
+ await SessionReplayReadService.getSessionsForException({
1087
+ projectId: projectId,
1088
+ exceptionFingerprint: "fp-1",
1089
+ accessibleRumApplicationIds: null,
1090
+ sessionId: "s-9",
1091
+ limit: 5,
1092
+ });
1093
+
1094
+ const instances: Statement = statementOf(exceptionQuerySpy);
1095
+ expect(instances.query).toContain("fingerprint = ");
1096
+ expect(instances.query).toContain("AND sessionId = ");
1097
+ expect(boundValues(instances)).toContain("fp-1");
1098
+ expect(boundValues(instances)).toContain("s-9");
1099
+
1100
+ const headers: Statement = statementOf(headerQuerySpy);
1101
+ expect(whereSection(headers.query)).toContain("AND sessionId = ");
1102
+ expect(boundValues(headers)).toContain("s-9");
1103
+ });
1104
+
1105
+ test("a pinned session the instance table has never seen falls back to the fingerprint alone", async () => {
1106
+ /* The session exists, but it never threw this exception. */
1107
+ exceptionQuerySpy.mockResolvedValue(fakeResultSet([]) as never);
1108
+
1109
+ await SessionReplayReadService.getSessionsForException({
1110
+ projectId: projectId,
1111
+ exceptionFingerprint: "fp-1",
1112
+ accessibleRumApplicationIds: null,
1113
+ sessionId: "s-9",
1114
+ limit: 5,
1115
+ });
1116
+
1117
+ const headers: Statement = statementOf(headerQuerySpy);
1118
+
1119
+ /*
1120
+ * No `OR sessionId IN (...)` escape hatch: the header's own
1121
+ * fingerprint list is the only thing that can admit the row.
1122
+ */
1123
+ expect(headers.query).not.toContain("OR sessionId IN (");
1124
+ expect(headers.query).toContain("hasAny(exceptionFingerprints");
1125
+ });
1126
+
1127
+ test("a failed instance lookup degrades to the finalized headers", async () => {
1128
+ exceptionQuerySpy.mockRejectedValue(
1129
+ new Error("clickhouse down") as never,
1130
+ );
1131
+ headerQuerySpy.mockResolvedValue(
1132
+ fakeResultSet([
1133
+ {
1134
+ sessionId: "s-1",
1135
+ applicationId: rumApplicationId.toString(),
1136
+ aggStartTime: 1,
1137
+ aggEndTime: 2,
1138
+ aggIsFinalized: 1,
1139
+ },
1140
+ ]) as never,
1141
+ );
1142
+
1143
+ const sessions: Array<SessionReplayExceptionSession> =
1144
+ await SessionReplayReadService.getSessionsForException({
1145
+ projectId: projectId,
1146
+ exceptionFingerprint: "fp-1",
1147
+ accessibleRumApplicationIds: null,
1148
+ limit: 5,
1149
+ });
1150
+
1151
+ expect(sessions).toHaveLength(1);
1152
+ expect(statementOf(headerQuerySpy).query).not.toContain(
1153
+ "OR sessionId IN (",
1154
+ );
1155
+ });
1156
+
1157
+ test("a caller who reaches no application gets no rows and no query", async () => {
1158
+ const sessions: Array<SessionReplayExceptionSession> =
1159
+ await SessionReplayReadService.getSessionsForException({
1160
+ projectId: projectId,
1161
+ exceptionFingerprint: "fp-1",
1162
+ accessibleRumApplicationIds: [],
1163
+ limit: 5,
1164
+ });
1165
+
1166
+ expect(sessions).toEqual([]);
1167
+ expect(headerQuerySpy).not.toHaveBeenCalled();
1168
+ expect(exceptionQuerySpy).not.toHaveBeenCalled();
1169
+ });
1170
+ });
1171
+
1172
+ describe("getApplicationActivitySummary", () => {
1173
+ const summaryRows: Array<Array<JSONObject>> = [
1174
+ [{ sessionCount: 143, unplayableCount: 3 }],
1175
+ [{ lastStartUnixMs: 1700000000000 }],
1176
+ ];
1177
+
1178
+ function mockSummaryRows(): void {
1179
+ headerQuerySpy
1180
+ .mockResolvedValueOnce(fakeResultSet(summaryRows[0]!) as never)
1181
+ .mockResolvedValueOnce(fakeResultSet(summaryRows[1]!) as never);
1182
+ }
1183
+
1184
+ test("counts without a GROUP BY and reads the latest start in sort-key order", async () => {
1185
+ mockSummaryRows();
1186
+
1187
+ const summary: SessionReplayApplicationActivitySummary =
1188
+ await SessionReplayReadService.getApplicationActivitySummary({
1189
+ projectId: projectId,
1190
+ rumApplicationId: rumApplicationId,
1191
+ nowUnixMs: 1700000000000,
1192
+ });
1193
+
1194
+ expect(headerQuerySpy).toHaveBeenCalledTimes(2);
1195
+
1196
+ const counts: Statement = statementOf(headerQuerySpy, 0);
1197
+ expect(counts.query).toContain("uniqExact(sessionId)");
1198
+ expect(counts.query).toContain(
1199
+ "uniqExactIf(sessionId, isFinalized AND (chunkCount = 0 OR sealedReason = ",
1200
+ );
1201
+ expect(counts.query).not.toContain("GROUP BY");
1202
+ expect(counts.query).toContain("startTime >= ");
1203
+ expect(counts.query).toContain("retentionDate >= now()");
1204
+ expect(counts.query).not.toMatch(/\bpayload\b/);
1205
+ expect(boundValues(counts)).toContain("recording-lost");
1206
+
1207
+ const latest: Statement = statementOf(headerQuerySpy, 1);
1208
+ expect(latest.query).toContain("ORDER BY startTime DESC LIMIT 1");
1209
+ expect(latest.query).not.toContain("GROUP BY");
1210
+ expect(latest.query).toContain("retentionDate >= now()");
1211
+
1212
+ expect(summary.sessionsLast24h).toBe(143);
1213
+ expect(summary.playableSessionsLast24h).toBe(140);
1214
+ expect(summary.lastSessionStartedAt?.getTime()).toBe(1700000000000);
1215
+ });
1216
+
1217
+ test("is served from memory within the cache window and re-read after it", async () => {
1218
+ mockSummaryRows();
1219
+
1220
+ await SessionReplayReadService.getApplicationActivitySummary({
1221
+ projectId: projectId,
1222
+ rumApplicationId: rumApplicationId,
1223
+ nowUnixMs: 1700000000000,
1224
+ });
1225
+ await SessionReplayReadService.getApplicationActivitySummary({
1226
+ projectId: projectId,
1227
+ rumApplicationId: rumApplicationId,
1228
+ nowUnixMs:
1229
+ 1700000000000 + SESSION_REPLAY_ACTIVITY_SUMMARY_CACHE_TTL_MS - 1,
1230
+ });
1231
+
1232
+ expect(headerQuerySpy).toHaveBeenCalledTimes(2);
1233
+
1234
+ mockSummaryRows();
1235
+
1236
+ await SessionReplayReadService.getApplicationActivitySummary({
1237
+ projectId: projectId,
1238
+ rumApplicationId: rumApplicationId,
1239
+ nowUnixMs:
1240
+ 1700000000000 + SESSION_REPLAY_ACTIVITY_SUMMARY_CACHE_TTL_MS + 1,
1241
+ });
1242
+
1243
+ expect(headerQuerySpy).toHaveBeenCalledTimes(4);
1244
+ });
1245
+
1246
+ test("answers null counts, never zero, when ClickHouse cannot be read", async () => {
1247
+ headerQuerySpy.mockRejectedValue(new Error("timeout") as never);
1248
+
1249
+ const summary: SessionReplayApplicationActivitySummary =
1250
+ await SessionReplayReadService.getApplicationActivitySummary({
1251
+ projectId: projectId,
1252
+ rumApplicationId: rumApplicationId,
1253
+ nowUnixMs: 1700000000000,
1254
+ });
1255
+
1256
+ expect(summary).toEqual({
1257
+ sessionsLast24h: null,
1258
+ playableSessionsLast24h: null,
1259
+ lastSessionStartedAt: null,
1260
+ recorderCapabilities: null,
1261
+ });
1262
+ });
1263
+
1264
+ /*
1265
+ * The health card and the installation test both promise "the
1266
+ * capabilities of the newest recorder that reported" - the one place an
1267
+ * operator can spot a stale cached artifact ("click labels: no")
1268
+ * without opening a recording, which writes an audit row. The route
1269
+ * never sent them, so the row said "not reported yet" for every
1270
+ * application forever. They ride on the last-session query rather than
1271
+ * costing a query of their own.
1272
+ */
1273
+ test("the newest session's recorder capabilities ride on the last-start read", async () => {
1274
+ headerQuerySpy
1275
+ .mockResolvedValueOnce(
1276
+ fakeResultSet([{ sessionCount: 4, unplayableCount: 0 }]) as never,
1277
+ )
1278
+ .mockResolvedValueOnce(
1279
+ fakeResultSet([
1280
+ {
1281
+ lastStartUnixMs: 1700000000000,
1282
+ aggAttributes: {
1283
+ "recorder.capabilities":
1284
+ "click-events,web-vitals,not-a-capability",
1285
+ },
1286
+ },
1287
+ ]) as never,
1288
+ );
1289
+
1290
+ const summary: SessionReplayApplicationActivitySummary =
1291
+ await SessionReplayReadService.getApplicationActivitySummary({
1292
+ projectId: projectId,
1293
+ rumApplicationId: rumApplicationId,
1294
+ nowUnixMs: 1700000000000,
1295
+ });
1296
+
1297
+ const latest: Statement = statementOf(headerQuerySpy, 1);
1298
+ expect(latest.query).toContain("attributes AS aggAttributes");
1299
+
1300
+ /* Filtered to the vocabulary this build knows. */
1301
+ expect(summary.recorderCapabilities).toEqual([
1302
+ "click-events",
1303
+ "web-vitals",
1304
+ ]);
1305
+ });
1306
+
1307
+ test("a session that declared no capabilities answers null, never an empty list", async () => {
1308
+ headerQuerySpy
1309
+ .mockResolvedValueOnce(
1310
+ fakeResultSet([{ sessionCount: 1, unplayableCount: 0 }]) as never,
1311
+ )
1312
+ .mockResolvedValueOnce(
1313
+ fakeResultSet([{ lastStartUnixMs: 1700000000000 }]) as never,
1314
+ );
1315
+
1316
+ const summary: SessionReplayApplicationActivitySummary =
1317
+ await SessionReplayReadService.getApplicationActivitySummary({
1318
+ projectId: projectId,
1319
+ rumApplicationId: rumApplicationId,
1320
+ nowUnixMs: 1700000000000,
1321
+ });
1322
+
1323
+ /*
1324
+ * "An old recorder declared nothing" and "we could not tell" are both
1325
+ * rendered as "not reported yet"; claiming the recorder can do
1326
+ * NOTHING would be a stronger statement than the row supports.
1327
+ */
1328
+ expect(summary.recorderCapabilities).toBeNull();
1329
+ });
1330
+
1331
+ test("an application with no session in retention has no last start", async () => {
1332
+ headerQuerySpy
1333
+ .mockResolvedValueOnce(
1334
+ fakeResultSet([{ sessionCount: 0, unplayableCount: 0 }]) as never,
1335
+ )
1336
+ .mockResolvedValueOnce(fakeResultSet([]) as never);
1337
+
1338
+ const summary: SessionReplayApplicationActivitySummary =
1339
+ await SessionReplayReadService.getApplicationActivitySummary({
1340
+ projectId: projectId,
1341
+ rumApplicationId: rumApplicationId,
1342
+ nowUnixMs: 1700000000000,
1343
+ });
1344
+
1345
+ expect(summary.sessionsLast24h).toBe(0);
1346
+ expect(summary.lastSessionStartedAt).toBeNull();
1347
+ });
1348
+ });
1349
+
1350
+ describe("published recorder version", () => {
1351
+ test("is unknown until a provider is registered, and survives a throwing provider", () => {
1352
+ expect(SessionReplayReadService.getPublishedRecorderVersion()).toBeNull();
1353
+
1354
+ SessionReplayReadService.setPublishedRecorderVersionProvider(
1355
+ (): string | null => {
1356
+ return "2.3.4";
1357
+ },
1358
+ );
1359
+ expect(SessionReplayReadService.getPublishedRecorderVersion()).toBe(
1360
+ "2.3.4",
1361
+ );
1362
+
1363
+ SessionReplayReadService.setPublishedRecorderVersionProvider(
1364
+ (): string | null => {
1365
+ throw new Error("manifest unreadable");
1366
+ },
1367
+ );
1368
+ expect(SessionReplayReadService.getPublishedRecorderVersion()).toBeNull();
1369
+
1370
+ SessionReplayReadService.setPublishedRecorderVersionProvider(
1371
+ (): string | null => {
1372
+ return "";
1373
+ },
1374
+ );
1375
+ expect(SessionReplayReadService.getPublishedRecorderVersion()).toBeNull();
1376
+ });
1377
+ });
1378
+ });