@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,1579 @@
1
+ import { describe, expect, it } from "@jest/globals";
2
+ import ExceptionInstance from "../../../Models/AnalyticsModels/ExceptionInstance";
3
+ import Log from "../../../Models/AnalyticsModels/Log";
4
+ import Span, { SpanStatus } from "../../../Models/AnalyticsModels/Span";
5
+ import LogSeverity from "../../../Types/Log/LogSeverity";
6
+ import ObjectID from "../../../Types/ObjectID";
7
+ import {
8
+ REPLAY_TIMELINE_EVENT_KINDS,
9
+ ReplayTimelineEvent,
10
+ ReplayTimelineEventKind,
11
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/SessionReplay/ReplayTimelineTypes";
12
+ import {
13
+ ReplayClockAlignmentState,
14
+ ReplaySignal,
15
+ ReplaySignalKind,
16
+ ReplayTelemetryClock,
17
+ makeRecordingSignalId,
18
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/SessionReplay/Rail/ReplaySignalTypes";
19
+ import {
20
+ REPLAY_NETWORK_CAPTURE_CAP,
21
+ REPLAY_SIGNAL_SEEK_PRE_ROLL_MS,
22
+ REPLAY_SIGNAL_TITLE_MAX_LENGTH,
23
+ REPLAY_TRACE_WATERFALL_MAX_SPANS,
24
+ ReplayClientErrorSignalDetail,
25
+ ReplayErrorPair,
26
+ ReplayInteractionSignalDetail,
27
+ ReplayLogSignalDetail,
28
+ ReplayNetworkSignalDetail,
29
+ ReplayPerformanceSignalDetail,
30
+ ReplayServerErrorSignalDetail,
31
+ ReplaySignalMatch,
32
+ ReplaySpanSignalDetail,
33
+ ReplayTraceWaterfallSpan,
34
+ buildErrorCounterpartIndex,
35
+ findErrorAfterInteraction,
36
+ findErrorLogsForTrace,
37
+ findSignalMatch,
38
+ formatPerformanceMeasure,
39
+ formatSignalBytes,
40
+ formatSignalDuration,
41
+ formatVitalRating,
42
+ fromExceptionRow,
43
+ fromLogRow,
44
+ fromSpanRow,
45
+ fromTimelineEvent,
46
+ fromTimelineEvents,
47
+ getActiveSignalIndex,
48
+ groupSpansIntoTraces,
49
+ indexTraceSignalsByTraceId,
50
+ isSignalActiveAt,
51
+ isSteppableClientError,
52
+ mergeSignals,
53
+ pairClientAndServerErrors,
54
+ splitSignalUrl,
55
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/SessionReplay/Rail/ReplaySignals";
56
+
57
+ /*
58
+ * The rail renders one row shape for everything; these adapters are where
59
+ * a recording event or a server row becomes that shape. Every kind must
60
+ * land with the right severity, title, links and id, telemetry rows must
61
+ * sit on the session clock WITHOUT the clockSkewMs correction (which only
62
+ * applies to client-stamped values), and the merge/active-index helpers
63
+ * must keep the "synced to the playhead" claim true.
64
+ */
65
+
66
+ const START_UNIX_MS: number = 1_700_000_000_000;
67
+
68
+ function makeEvent(
69
+ kind: ReplayTimelineEventKind,
70
+ overrides?: Partial<ReplayTimelineEvent>,
71
+ ): ReplayTimelineEvent {
72
+ return {
73
+ id: makeRecordingSignalId(2, 7),
74
+ kind: kind,
75
+ chunkIndex: 2,
76
+ offsetMs: 12_500,
77
+ ...overrides,
78
+ };
79
+ }
80
+
81
+ const UNANCHORED: ReplayClockAlignmentState = {
82
+ status: "unanchored",
83
+ deltaMs: 0,
84
+ pairCount: 0,
85
+ uncertaintyMs: 3500,
86
+ };
87
+
88
+ const ANCHORED: ReplayClockAlignmentState = {
89
+ status: "anchored",
90
+ deltaMs: -1500,
91
+ pairCount: 3,
92
+ uncertaintyMs: 200,
93
+ };
94
+
95
+ function makeClock(
96
+ alignment: ReplayClockAlignmentState = UNANCHORED,
97
+ serviceNameById?: Record<string, string>,
98
+ ): ReplayTelemetryClock {
99
+ return {
100
+ startTimeUnixMs: START_UNIX_MS,
101
+ alignment: alignment,
102
+ serviceNameById: serviceNameById,
103
+ };
104
+ }
105
+
106
+ function makeLog(args: {
107
+ id: string;
108
+ atMs: number;
109
+ body?: string;
110
+ severity?: LogSeverity;
111
+ severityNumber?: number;
112
+ serviceId?: string;
113
+ traceId?: string;
114
+ spanId?: string;
115
+ }): Log {
116
+ const log: Log = new Log();
117
+
118
+ log.id = new ObjectID(args.id);
119
+ log.time = new Date(START_UNIX_MS + args.atMs);
120
+ log.body = args.body ?? "charge failed: card_declined";
121
+
122
+ if (args.severity !== undefined) {
123
+ log.severityText = args.severity;
124
+ }
125
+
126
+ if (args.severityNumber !== undefined) {
127
+ log.severityNumber = args.severityNumber;
128
+ }
129
+
130
+ if (args.serviceId) {
131
+ log.primaryEntityId = new ObjectID(args.serviceId);
132
+ }
133
+
134
+ if (args.traceId) {
135
+ log.traceId = args.traceId;
136
+ }
137
+
138
+ if (args.spanId) {
139
+ log.spanId = args.spanId;
140
+ }
141
+
142
+ return log;
143
+ }
144
+
145
+ function makeSpan(args: {
146
+ spanId: string;
147
+ traceId: string;
148
+ atMs: number;
149
+ durationMs: number;
150
+ name?: string;
151
+ parentSpanId?: string | undefined;
152
+ status?: SpanStatus;
153
+ serviceId?: string;
154
+ }): Span {
155
+ const span: Span = new Span();
156
+
157
+ span.spanId = args.spanId;
158
+ span.traceId = args.traceId;
159
+ span.startTime = new Date(START_UNIX_MS + args.atMs);
160
+ span.durationUnixNano = args.durationMs * 1_000_000;
161
+ span.name = args.name ?? `span ${args.spanId}`;
162
+
163
+ if (args.parentSpanId) {
164
+ span.parentSpanId = args.parentSpanId;
165
+ }
166
+
167
+ if (args.status !== undefined) {
168
+ span.statusCode = args.status;
169
+ }
170
+
171
+ if (args.serviceId) {
172
+ span.primaryEntityId = new ObjectID(args.serviceId);
173
+ }
174
+
175
+ return span;
176
+ }
177
+
178
+ function makeException(args: {
179
+ id: string;
180
+ atMs: number;
181
+ message?: string;
182
+ exceptionType?: string;
183
+ fingerprint?: string;
184
+ traceId?: string;
185
+ spanId?: string;
186
+ stackTrace?: string;
187
+ serviceId?: string;
188
+ }): ExceptionInstance {
189
+ const instance: ExceptionInstance = new ExceptionInstance();
190
+
191
+ instance.id = new ObjectID(args.id);
192
+ instance.time = new Date(START_UNIX_MS + args.atMs);
193
+ instance.message = args.message ?? "Cannot read properties of undefined";
194
+
195
+ if (args.exceptionType) {
196
+ instance.exceptionType = args.exceptionType;
197
+ }
198
+
199
+ if (args.fingerprint) {
200
+ instance.fingerprint = args.fingerprint;
201
+ }
202
+
203
+ if (args.traceId) {
204
+ instance.traceId = args.traceId;
205
+ }
206
+
207
+ if (args.spanId) {
208
+ instance.spanId = args.spanId;
209
+ }
210
+
211
+ if (args.stackTrace) {
212
+ instance.stackTrace = args.stackTrace;
213
+ }
214
+
215
+ if (args.serviceId) {
216
+ instance.primaryEntityId = new ObjectID(args.serviceId);
217
+ }
218
+
219
+ return instance;
220
+ }
221
+
222
+ function makeSignal(overrides: Partial<ReplaySignal>): ReplaySignal {
223
+ return {
224
+ id: overrides.id ?? "rec:0:0",
225
+ kind: overrides.kind ?? "console",
226
+ source: overrides.source ?? "recording",
227
+ offsetMs: overrides.offsetMs ?? 0,
228
+ severity: overrides.severity ?? "info",
229
+ title: overrides.title ?? "row",
230
+ links: overrides.links ?? {},
231
+ detail: overrides.detail ?? {},
232
+ ...overrides,
233
+ };
234
+ }
235
+
236
+ describe("fromTimelineEvent: every kind maps", () => {
237
+ const expectedKinds: Record<ReplayTimelineEventKind, ReplaySignalKind> = {
238
+ console: "console",
239
+ network: "network",
240
+ route: "navigation",
241
+ navigation: "navigation",
242
+ error: "client-error",
243
+ frustration: "frustration",
244
+ performance: "performance",
245
+ click: "interaction",
246
+ visibility: "marker",
247
+ custom: "custom",
248
+ identify: "marker",
249
+ tags: "marker",
250
+ "click-dropped": "marker",
251
+ "custom-dropped": "marker",
252
+ };
253
+
254
+ it.each(REPLAY_TIMELINE_EVENT_KINDS)(
255
+ "%s becomes a recording signal with the event's id, chunk and offset",
256
+ (kind: ReplayTimelineEventKind) => {
257
+ const signal: ReplaySignal = fromTimelineEvent(makeEvent(kind), {
258
+ startTimeUnixMs: START_UNIX_MS,
259
+ });
260
+
261
+ expect(signal.kind).toBe(expectedKinds[kind]);
262
+ expect(signal.id).toBe("rec:2:7");
263
+ expect(signal.source).toBe("recording");
264
+ expect(signal.chunkIndex).toBe(2);
265
+ expect(signal.offsetMs).toBe(12_500);
266
+ expect(signal.alignment).toBe("exact");
267
+ expect(signal.title.length).toBeGreaterThan(0);
268
+ expect(signal.title).not.toContain("undefined");
269
+ expect(signal.title).not.toContain("NaN");
270
+ },
271
+ );
272
+
273
+ it("never throws on a bare event with no per-kind fields", () => {
274
+ for (const kind of REPLAY_TIMELINE_EVENT_KINDS) {
275
+ expect(() => {
276
+ return fromTimelineEvent(makeEvent(kind), { startTimeUnixMs: null });
277
+ }).not.toThrow();
278
+ }
279
+ });
280
+
281
+ it("stamps a wall clock from the event, else from start + offset, else null", () => {
282
+ const fromEvent: ReplaySignal = fromTimelineEvent(
283
+ makeEvent("click", { atUnixMs: 123 }),
284
+ { startTimeUnixMs: START_UNIX_MS },
285
+ );
286
+ const derived: ReplaySignal = fromTimelineEvent(makeEvent("click"), {
287
+ startTimeUnixMs: START_UNIX_MS,
288
+ });
289
+ const unknown: ReplaySignal = fromTimelineEvent(makeEvent("click"), {
290
+ startTimeUnixMs: null,
291
+ });
292
+
293
+ expect(fromEvent.detail["atUnixMs"]).toBe(123);
294
+ expect(derived.detail["atUnixMs"]).toBe(START_UNIX_MS + 12_500);
295
+ expect(unknown.detail["atUnixMs"]).toBeNull();
296
+ });
297
+ });
298
+
299
+ describe("console rows", () => {
300
+ it("maps level to severity and keeps the full message in detail", () => {
301
+ const message: string = "TypeError: boom\n at app.js:1:1";
302
+ const error: ReplaySignal = fromTimelineEvent(
303
+ makeEvent("console", { level: "error", message: message }),
304
+ { startTimeUnixMs: null },
305
+ );
306
+ const warn: ReplaySignal = fromTimelineEvent(
307
+ makeEvent("console", { level: "warn", message: "careful" }),
308
+ { startTimeUnixMs: null },
309
+ );
310
+
311
+ expect(error.severity).toBe("error");
312
+ expect(error.title).toBe("TypeError: boom");
313
+ expect(error.subtitle).toBe("error");
314
+ expect(error.detail["message"]).toBe(message);
315
+ expect(warn.severity).toBe("warn");
316
+ });
317
+
318
+ it("truncates long titles with an ellipsis but not the detail", () => {
319
+ const message: string = "x".repeat(REPLAY_SIGNAL_TITLE_MAX_LENGTH + 50);
320
+ const signal: ReplaySignal = fromTimelineEvent(
321
+ makeEvent("console", { level: "warn", message: message }),
322
+ { startTimeUnixMs: null },
323
+ );
324
+
325
+ expect(signal.title.length).toBe(REPLAY_SIGNAL_TITLE_MAX_LENGTH);
326
+ expect(signal.title.endsWith("…")).toBe(true);
327
+ expect(signal.detail["message"]).toBe(message);
328
+ });
329
+ });
330
+
331
+ describe("network rows", () => {
332
+ const base: Partial<ReplayTimelineEvent> = {
333
+ method: "post",
334
+ url: "https://api.example.com/api/orders?x=1",
335
+ status: 500,
336
+ durationMs: 220,
337
+ responseBytes: 1229,
338
+ requestBytes: 512,
339
+ initiator: "fetch",
340
+ traceId: "abc123abc123abc123abc123abc123ab",
341
+ isError: true,
342
+ };
343
+
344
+ it("renders 'POST 500 /api/orders' with duration and bytes and a trace link", () => {
345
+ const signal: ReplaySignal = fromTimelineEvent(makeEvent("network", base), {
346
+ startTimeUnixMs: null,
347
+ });
348
+ const detail: ReplayNetworkSignalDetail =
349
+ signal.detail as ReplayNetworkSignalDetail;
350
+
351
+ expect(signal.title).toBe("POST 500 /api/orders?x=1");
352
+ expect(signal.subtitle).toBe("220ms 1.2KB");
353
+ expect(signal.severity).toBe("error");
354
+ expect(signal.links.traceId).toBe(base.traceId);
355
+ expect(detail.method).toBe("POST");
356
+ expect(detail.url).toBe(base.url);
357
+ expect(detail.origin).toBe("https://api.example.com");
358
+ expect(detail.path).toBe("/api/orders?x=1");
359
+ expect(detail.status).toBe(500);
360
+ expect(detail.durationMs).toBe(220);
361
+ expect(detail.responseBytes).toBe(1229);
362
+ expect(detail.requestBytes).toBe(512);
363
+ expect(detail.initiator).toBe("fetch");
364
+ expect(detail.traceId).toBe(base.traceId);
365
+ expect(detail.isError).toBe(true);
366
+ expect(detail.failedBeforeResponse).toBe(false);
367
+ expect(detail.isSlow).toBe(false);
368
+ });
369
+
370
+ it("grades severity by status: 2xx info, 4xx warn, 5xx error, 0 error", () => {
371
+ const grade: (status: number) => string = (status: number): string => {
372
+ return fromTimelineEvent(
373
+ makeEvent("network", { ...base, status: status, isError: false }),
374
+ { startTimeUnixMs: null },
375
+ ).severity;
376
+ };
377
+
378
+ expect(grade(200)).toBe("info");
379
+ expect(grade(302)).toBe("info");
380
+ expect(grade(404)).toBe("warn");
381
+ expect(grade(503)).toBe("error");
382
+ expect(grade(0)).toBe("error");
383
+ });
384
+
385
+ it("names a status-0 request 'failed' and flags it as failed before response", () => {
386
+ const failedBase: Partial<ReplayTimelineEvent> = { ...base, status: 0 };
387
+
388
+ delete failedBase.durationMs;
389
+
390
+ const signal: ReplaySignal = fromTimelineEvent(
391
+ makeEvent("network", failedBase),
392
+ { startTimeUnixMs: null },
393
+ );
394
+ const detail: ReplayNetworkSignalDetail =
395
+ signal.detail as ReplayNetworkSignalDetail;
396
+
397
+ expect(signal.title).toBe("POST failed /api/orders?x=1");
398
+ expect(detail.failedBeforeResponse).toBe(true);
399
+ expect(detail.isError).toBe(true);
400
+ /* No duration was measured, so none is claimed. */
401
+ expect(detail.durationMs).toBeNull();
402
+ expect(signal.subtitle).toBe("1.2KB");
403
+ });
404
+
405
+ it("omits the subtitle entirely when neither duration nor bytes were measured", () => {
406
+ const signal: ReplaySignal = fromTimelineEvent(
407
+ makeEvent("network", { method: "GET", url: "/x", status: 200 }),
408
+ { startTimeUnixMs: null },
409
+ );
410
+
411
+ expect(signal.subtitle).toBeUndefined();
412
+ expect(signal.links.traceId).toBeUndefined();
413
+ });
414
+
415
+ it("flags requests over 1s as slow", () => {
416
+ const signal: ReplaySignal = fromTimelineEvent(
417
+ makeEvent("network", { ...base, status: 200, durationMs: 1400 }),
418
+ { startTimeUnixMs: null },
419
+ );
420
+
421
+ expect((signal.detail as ReplayNetworkSignalDetail).isSlow).toBe(true);
422
+ expect(signal.subtitle).toBe("1.4s 1.2KB");
423
+ });
424
+ });
425
+
426
+ describe("navigation rows", () => {
427
+ it("labels history routes by kind and full loads as such", () => {
428
+ const route: ReplaySignal = fromTimelineEvent(
429
+ makeEvent("route", {
430
+ from: "/cart",
431
+ to: "/checkout",
432
+ routeKind: "pushState",
433
+ }),
434
+ { startTimeUnixMs: null },
435
+ );
436
+ const load: ReplaySignal = fromTimelineEvent(
437
+ makeEvent("navigation", { to: "https://app.example.com/login" }),
438
+ { startTimeUnixMs: null },
439
+ );
440
+
441
+ expect(route.title).toBe("/checkout");
442
+ expect(route.subtitle).toBe("history push");
443
+ expect(route.detail["from"]).toBe("/cart");
444
+ expect(route.detail["kind"]).toBe("pushState");
445
+ expect(load.title).toBe("https://app.example.com/login");
446
+ expect(load.subtitle).toBe("full page load");
447
+ expect(load.detail["kind"]).toBe("full-load");
448
+ expect(load.detail["from"]).toBeNull();
449
+ });
450
+
451
+ it("carries the declared viewport of a full load and never invents one", () => {
452
+ const load: ReplaySignal = fromTimelineEvent(
453
+ makeEvent("navigation", {
454
+ to: "https://app.example.com/login",
455
+ viewportWidth: 1440,
456
+ viewportHeight: 900,
457
+ }),
458
+ { startTimeUnixMs: null },
459
+ );
460
+ const route: ReplaySignal = fromTimelineEvent(
461
+ makeEvent("route", { to: "/checkout", routeKind: "pushState" }),
462
+ { startTimeUnixMs: null },
463
+ );
464
+
465
+ expect(load.detail["viewportWidth"]).toBe(1440);
466
+ expect(load.detail["viewportHeight"]).toBe(900);
467
+ /* A route change does not carry a viewport; the detail must say so, not 0. */
468
+ expect(route.detail["viewportWidth"]).toBeNull();
469
+ expect(route.detail["viewportHeight"]).toBeNull();
470
+ });
471
+ });
472
+
473
+ describe("client error rows", () => {
474
+ it("carries stack, source, line and column into detail with a location line", () => {
475
+ const signal: ReplaySignal = fromTimelineEvent(
476
+ makeEvent("error", {
477
+ errorKind: "error",
478
+ message: "Cannot read properties of undefined (reading 'id')",
479
+ source: "https://app.example.com/static/app.js",
480
+ lineNumber: 12,
481
+ columnNumber: 5,
482
+ stack: "TypeError: Cannot read...\n at render (app.js:12:5)",
483
+ }),
484
+ { startTimeUnixMs: null },
485
+ );
486
+ const detail: ReplayClientErrorSignalDetail =
487
+ signal.detail as ReplayClientErrorSignalDetail;
488
+
489
+ expect(signal.kind).toBe("client-error");
490
+ expect(signal.severity).toBe("error");
491
+ expect(signal.title).toBe(
492
+ "Cannot read properties of undefined (reading 'id')",
493
+ );
494
+ expect(signal.subtitle).toBe("uncaught error · /static/app.js:12:5");
495
+ expect(detail.stack).toContain("at render");
496
+ expect(detail.source).toBe("https://app.example.com/static/app.js");
497
+ expect(detail.lineNumber).toBe(12);
498
+ expect(detail.columnNumber).toBe(5);
499
+ expect(detail.location).toBe("/static/app.js:12:5");
500
+ });
501
+
502
+ it("labels unhandled rejections and tolerates a missing location", () => {
503
+ const signal: ReplaySignal = fromTimelineEvent(
504
+ makeEvent("error", {
505
+ errorKind: "unhandledrejection",
506
+ message: "Network down",
507
+ }),
508
+ { startTimeUnixMs: null },
509
+ );
510
+
511
+ expect(signal.subtitle).toBe("unhandled rejection");
512
+ expect(
513
+ (signal.detail as ReplayClientErrorSignalDetail).location,
514
+ ).toBeNull();
515
+ expect((signal.detail as ReplayClientErrorSignalDetail).stack).toBeNull();
516
+ });
517
+ });
518
+
519
+ describe("frustration and interaction rows", () => {
520
+ it("names each frustration kind and quantifies it", () => {
521
+ const rage: ReplaySignal = fromTimelineEvent(
522
+ makeEvent("frustration", {
523
+ frustrationKind: "rage-click",
524
+ clickCount: 5,
525
+ x: 120.4,
526
+ y: 340.6,
527
+ }),
528
+ { startTimeUnixMs: null },
529
+ );
530
+ const refresh: ReplaySignal = fromTimelineEvent(
531
+ makeEvent("frustration", {
532
+ frustrationKind: "refresh-rage",
533
+ reloadCount: 3,
534
+ }),
535
+ { startTimeUnixMs: null },
536
+ );
537
+ const dead: ReplaySignal = fromTimelineEvent(
538
+ makeEvent("frustration", { frustrationKind: "dead-click" }),
539
+ { startTimeUnixMs: null },
540
+ );
541
+
542
+ expect(rage.kind).toBe("frustration");
543
+ expect(rage.severity).toBe("warn");
544
+ expect(rage.title).toBe("Rage click (5 clicks)");
545
+ expect(rage.subtitle).toBe("at 120, 341");
546
+ expect(refresh.title).toBe("Refresh rage (3 reloads)");
547
+ expect(dead.title).toBe("Dead click");
548
+ expect(dead.subtitle).toBeUndefined();
549
+ });
550
+
551
+ it("prefers the click's text, then its selector, then coordinates", () => {
552
+ const labelled: ReplaySignal = fromTimelineEvent(
553
+ makeEvent("click", {
554
+ selector: "button.pay",
555
+ text: "Pay now",
556
+ x: 10,
557
+ y: 20,
558
+ }),
559
+ { startTimeUnixMs: null },
560
+ );
561
+ const selectorOnly: ReplaySignal = fromTimelineEvent(
562
+ makeEvent("click", { selector: "button.pay", x: 10, y: 20 }),
563
+ { startTimeUnixMs: null },
564
+ );
565
+ const coordinates: ReplaySignal = fromTimelineEvent(
566
+ makeEvent("click", { x: 10, y: 20 }),
567
+ { startTimeUnixMs: null },
568
+ );
569
+
570
+ expect(labelled.kind).toBe("interaction");
571
+ expect(labelled.title).toBe('Click "Pay now"');
572
+ expect(labelled.subtitle).toBe("button.pay");
573
+ expect(selectorOnly.title).toBe("Click button.pay");
574
+ expect(selectorOnly.subtitle).toBe("at 10, 20");
575
+ expect(coordinates.title).toBe("Click at (10, 20)");
576
+ expect(
577
+ (coordinates.detail as ReplayInteractionSignalDetail).isCoordinateOnly,
578
+ ).toBe(true);
579
+ expect(
580
+ (labelled.detail as ReplayInteractionSignalDetail).isCoordinateOnly,
581
+ ).toBe(false);
582
+ });
583
+ });
584
+
585
+ describe("performance rows", () => {
586
+ it("renders budget overruns as 'LCP 4.8s (budget 4s)' with warn severity", () => {
587
+ const signal: ReplaySignal = fromTimelineEvent(
588
+ makeEvent("performance", {
589
+ performanceKind: "lcp",
590
+ durationMs: 4800,
591
+ budgetMs: 4000,
592
+ url: "https://app.example.com/checkout",
593
+ }),
594
+ { startTimeUnixMs: null },
595
+ );
596
+ const detail: ReplayPerformanceSignalDetail =
597
+ signal.detail as ReplayPerformanceSignalDetail;
598
+
599
+ expect(signal.title).toBe("LCP 4.8s (budget 4s)");
600
+ expect(signal.severity).toBe("warn");
601
+ expect(signal.subtitle).toBe("/checkout");
602
+ expect(detail.isOverBudget).toBe(true);
603
+ expect(detail.kind).toBe("lcp");
604
+ });
605
+
606
+ it("grades web vitals by rating and formats CLS without a unit", () => {
607
+ const poor: ReplaySignal = fromTimelineEvent(
608
+ makeEvent("performance", {
609
+ performanceKind: "web-vital",
610
+ metric: "INP",
611
+ value: 320,
612
+ rating: "poor",
613
+ }),
614
+ { startTimeUnixMs: null },
615
+ );
616
+ const good: ReplaySignal = fromTimelineEvent(
617
+ makeEvent("performance", {
618
+ performanceKind: "web-vital",
619
+ metric: "CLS",
620
+ value: 0.0234,
621
+ rating: "good",
622
+ }),
623
+ { startTimeUnixMs: null },
624
+ );
625
+
626
+ expect(poor.title).toBe("INP 320ms poor");
627
+ expect(poor.severity).toBe("error");
628
+ expect((poor.detail as ReplayPerformanceSignalDetail).isOverBudget).toBe(
629
+ true,
630
+ );
631
+ expect(good.title).toBe("CLS 0.023 good");
632
+ expect(good.severity).toBe("success");
633
+ expect((good.detail as ReplayPerformanceSignalDetail).isOverBudget).toBe(
634
+ false,
635
+ );
636
+ });
637
+
638
+ it("does not claim a budget or duration it was not given", () => {
639
+ const signal: ReplaySignal = fromTimelineEvent(
640
+ makeEvent("performance", { performanceKind: "long-task" }),
641
+ { startTimeUnixMs: null },
642
+ );
643
+
644
+ expect(signal.title).toBe("Long task");
645
+ expect(signal.severity).toBe("info");
646
+ expect(signal.title).not.toContain("0ms");
647
+ });
648
+ });
649
+
650
+ describe("custom and marker rows", () => {
651
+ it("names the custom event and counts its properties", () => {
652
+ const signal: ReplaySignal = fromTimelineEvent(
653
+ makeEvent("custom", {
654
+ name: "checkout.step",
655
+ properties: { step: "2", plan: "pro" },
656
+ }),
657
+ { startTimeUnixMs: null },
658
+ );
659
+
660
+ expect(signal.kind).toBe("custom");
661
+ expect(signal.title).toBe("checkout.step");
662
+ expect(signal.subtitle).toBe("2 properties");
663
+ expect(signal.detail["properties"]).toEqual({ step: "2", plan: "pro" });
664
+ });
665
+
666
+ it("renders visibility, identify, tags and cap notices as markers", () => {
667
+ const hidden: ReplaySignal = fromTimelineEvent(
668
+ makeEvent("visibility", { visibilityState: "hidden" }),
669
+ { startTimeUnixMs: null },
670
+ );
671
+ const identify: ReplaySignal = fromTimelineEvent(
672
+ makeEvent("identify", { hasTraits: true }),
673
+ { startTimeUnixMs: null },
674
+ );
675
+ const tags: ReplaySignal = fromTimelineEvent(
676
+ makeEvent("tags", { tags: { plan: "pro" } }),
677
+ { startTimeUnixMs: null },
678
+ );
679
+ const dropped: ReplaySignal = fromTimelineEvent(
680
+ makeEvent("click-dropped", { droppedCount: 12 }),
681
+ { startTimeUnixMs: null },
682
+ );
683
+ const droppedCustom: ReplaySignal = fromTimelineEvent(
684
+ makeEvent("custom-dropped", { droppedCount: 3 }),
685
+ { startTimeUnixMs: null },
686
+ );
687
+
688
+ expect(hidden.title).toBe("Tab hidden");
689
+ expect(hidden.detail["markerKind"]).toBe("visibility");
690
+ expect(identify.title).toBe("User identified");
691
+ expect(identify.subtitle).toBe("with traits");
692
+ expect(tags.title).toBe("Tags set");
693
+ expect(tags.subtitle).toBe("1 tag");
694
+ expect(dropped.title).toBe("12 clicks not labelled (recorder cap)");
695
+ expect(dropped.severity).toBe("warn");
696
+ expect(droppedCustom.title).toBe(
697
+ "3 custom events not recorded (recorder cap)",
698
+ );
699
+ });
700
+
701
+ it("fromTimelineEvents maps a batch in order", () => {
702
+ const signals: Array<ReplaySignal> = fromTimelineEvents(
703
+ [
704
+ makeEvent("console", { id: "rec:0:0", level: "warn", message: "a" }),
705
+ makeEvent("click", { id: "rec:0:1", x: 1, y: 2 }),
706
+ ],
707
+ { startTimeUnixMs: null },
708
+ );
709
+
710
+ expect(
711
+ signals.map((signal: ReplaySignal): string => {
712
+ return signal.id;
713
+ }),
714
+ ).toEqual(["rec:0:0", "rec:0:1"]);
715
+ });
716
+ });
717
+
718
+ describe("fromLogRow", () => {
719
+ it("places the row at time - startTimeUnixMs on the baseline, labelled unanchored", () => {
720
+ const signal: ReplaySignal | null = fromLogRow(
721
+ makeLog({
722
+ id: "log-1",
723
+ atMs: 42_000,
724
+ severity: LogSeverity.Error,
725
+ traceId: "trace-a",
726
+ spanId: "span-a",
727
+ serviceId: "svc-1",
728
+ }),
729
+ makeClock(UNANCHORED, { "svc-1": "payment-svc" }),
730
+ );
731
+
732
+ expect(signal).not.toBeNull();
733
+ expect(signal?.id).toBe("log:log-1");
734
+ expect(signal?.kind).toBe("log");
735
+ expect(signal?.source).toBe("telemetry");
736
+ expect(signal?.offsetMs).toBe(42_000);
737
+ expect(signal?.alignment).toBe("unanchored");
738
+ expect(signal?.severity).toBe("error");
739
+ expect(signal?.title).toBe("[ERROR] charge failed: card_declined");
740
+ expect(signal?.subtitle).toBe("payment-svc");
741
+ expect(signal?.links).toEqual({
742
+ traceId: "trace-a",
743
+ spanId: "span-a",
744
+ logId: "log-1",
745
+ });
746
+
747
+ const detail: ReplayLogSignalDetail =
748
+ signal?.detail as ReplayLogSignalDetail;
749
+
750
+ expect(detail.level).toBe("ERROR");
751
+ expect(detail.serviceName).toBe("payment-svc");
752
+ expect(detail.timeUnixMs).toBe(START_UNIX_MS + 42_000);
753
+ expect(detail.baselineOffsetMs).toBe(42_000);
754
+ });
755
+
756
+ it("applies the anchoring delta when anchored, and keeps the baseline in detail", () => {
757
+ const signal: ReplaySignal | null = fromLogRow(
758
+ makeLog({ id: "log-2", atMs: 42_000, severity: LogSeverity.Warning }),
759
+ makeClock(ANCHORED),
760
+ );
761
+
762
+ expect(signal?.offsetMs).toBe(42_000 + ANCHORED.deltaMs);
763
+ expect(signal?.alignment).toBe("anchored");
764
+ expect((signal?.detail as ReplayLogSignalDetail).baselineOffsetMs).toBe(
765
+ 42_000,
766
+ );
767
+ expect(signal?.severity).toBe("warn");
768
+ expect(signal?.title).toBe("[WARN] charge failed: card_declined");
769
+ });
770
+
771
+ it("is never adjusted by a clock skew, whatever the manifest says", () => {
772
+ /*
773
+ * The clock has no clockSkewMs input on purpose: skew is a client-vs-
774
+ * server delta and these rows are server-stamped. Pin the shape so a
775
+ * future "helpful" parameter cannot creep in.
776
+ */
777
+ const clock: ReplayTelemetryClock = makeClock(UNANCHORED);
778
+
779
+ expect(Object.keys(clock).sort()).toEqual([
780
+ "alignment",
781
+ "serviceNameById",
782
+ "startTimeUnixMs",
783
+ ]);
784
+ expect(
785
+ fromLogRow(makeLog({ id: "log-3", atMs: 10_000 }), clock)?.offsetMs,
786
+ ).toBe(10_000);
787
+ });
788
+
789
+ it("falls back to the OTLP severity number and omits the level when unset", () => {
790
+ const numbered: ReplaySignal | null = fromLogRow(
791
+ makeLog({ id: "log-4", atMs: 1, severityNumber: 18 }),
792
+ makeClock(),
793
+ );
794
+ const plain: ReplaySignal | null = fromLogRow(
795
+ makeLog({ id: "log-5", atMs: 1, body: "hello" }),
796
+ makeClock(),
797
+ );
798
+
799
+ expect(numbered?.severity).toBe("error");
800
+ expect(plain?.severity).toBe("info");
801
+ expect(plain?.title).toBe("hello");
802
+ expect(plain?.subtitle).toBeUndefined();
803
+ });
804
+
805
+ it("returns null for a row with no id or no time", () => {
806
+ const noTime: Log = new Log();
807
+
808
+ noTime.id = new ObjectID("log-6");
809
+
810
+ const noId: Log = new Log();
811
+
812
+ noId.time = new Date(START_UNIX_MS);
813
+
814
+ expect(fromLogRow(noTime, makeClock())).toBeNull();
815
+ expect(fromLogRow(noId, makeClock())).toBeNull();
816
+ });
817
+ });
818
+
819
+ describe("fromExceptionRow", () => {
820
+ it("maps to a server-error with fingerprint, instance, trace and span links", () => {
821
+ const signal: ReplaySignal | null = fromExceptionRow(
822
+ makeException({
823
+ id: "exc-1",
824
+ atMs: 9_000,
825
+ exceptionType: "TypeError",
826
+ message: "Cannot read properties of undefined",
827
+ fingerprint: "fp-1",
828
+ traceId: "trace-a",
829
+ spanId: "span-a",
830
+ stackTrace: "TypeError: ...\n at handler",
831
+ serviceId: "svc-1",
832
+ }),
833
+ makeClock(ANCHORED, { "svc-1": "orders-svc" }),
834
+ );
835
+
836
+ expect(signal?.id).toBe("exc:exc-1");
837
+ expect(signal?.kind).toBe("server-error");
838
+ expect(signal?.severity).toBe("error");
839
+ expect(signal?.offsetMs).toBe(9_000 + ANCHORED.deltaMs);
840
+ expect(signal?.alignment).toBe("anchored");
841
+ expect(signal?.title).toBe(
842
+ "TypeError: Cannot read properties of undefined",
843
+ );
844
+ expect(signal?.subtitle).toBe("orders-svc");
845
+ expect(signal?.links).toEqual({
846
+ exceptionInstanceId: "exc-1",
847
+ exceptionFingerprint: "fp-1",
848
+ traceId: "trace-a",
849
+ spanId: "span-a",
850
+ });
851
+
852
+ const detail: ReplayServerErrorSignalDetail =
853
+ signal?.detail as ReplayServerErrorSignalDetail;
854
+
855
+ expect(detail.stackTrace).toContain("at handler");
856
+ expect(detail.fingerprint).toBe("fp-1");
857
+ expect(detail.baselineOffsetMs).toBe(9_000);
858
+ });
859
+
860
+ it("uses the message alone when there is no type, and 'Exception' when there is neither", () => {
861
+ const messageOnly: ReplaySignal | null = fromExceptionRow(
862
+ makeException({ id: "exc-2", atMs: 1, message: "boom" }),
863
+ makeClock(),
864
+ );
865
+ const bare: ReplaySignal | null = fromExceptionRow(
866
+ makeException({ id: "exc-3", atMs: 1, message: "" }),
867
+ makeClock(),
868
+ );
869
+
870
+ expect(messageOnly?.title).toBe("boom");
871
+ expect(bare?.title).toBe("Exception");
872
+ expect(bare?.links).toEqual({ exceptionInstanceId: "exc-3" });
873
+ });
874
+
875
+ it("returns null without an id or a time", () => {
876
+ const instance: ExceptionInstance = new ExceptionInstance();
877
+
878
+ instance.message = "x";
879
+
880
+ expect(fromExceptionRow(instance, makeClock())).toBeNull();
881
+ });
882
+ });
883
+
884
+ describe("spans and traces", () => {
885
+ it("fromSpanRow yields one trace row spanning the span's duration", () => {
886
+ const signal: ReplaySignal | null = fromSpanRow(
887
+ makeSpan({
888
+ spanId: "s1",
889
+ traceId: "t1",
890
+ atMs: 5_000,
891
+ durationMs: 250,
892
+ name: "GET /api/orders",
893
+ serviceId: "svc-1",
894
+ }),
895
+ makeClock(UNANCHORED, { "svc-1": "orders-svc" }),
896
+ );
897
+
898
+ expect(signal?.id).toBe("span:s1");
899
+ expect(signal?.kind).toBe("span");
900
+ expect(signal?.offsetMs).toBe(5_000);
901
+ expect(signal?.endOffsetMs).toBe(5_250);
902
+ expect(signal?.title).toBe("GET /api/orders");
903
+ expect(signal?.subtitle).toBe("orders-svc · 250ms · 1 span");
904
+ expect(signal?.links).toEqual({ traceId: "t1", spanId: "s1" });
905
+ expect(signal?.severity).toBe("info");
906
+ });
907
+
908
+ it("groupSpansIntoTraces makes one row per trace with a waterfall and an end offset", () => {
909
+ const rows: Array<Span> = [
910
+ makeSpan({
911
+ spanId: "child-b",
912
+ traceId: "t1",
913
+ atMs: 5_120,
914
+ durationMs: 80,
915
+ parentSpanId: "child-a",
916
+ status: SpanStatus.Error,
917
+ }),
918
+ makeSpan({
919
+ spanId: "root",
920
+ traceId: "t1",
921
+ atMs: 5_000,
922
+ durationMs: 300,
923
+ name: "POST /checkout",
924
+ serviceId: "svc-1",
925
+ }),
926
+ makeSpan({
927
+ spanId: "child-a",
928
+ traceId: "t1",
929
+ atMs: 5_100,
930
+ durationMs: 150,
931
+ parentSpanId: "root",
932
+ }),
933
+ makeSpan({
934
+ spanId: "other",
935
+ traceId: "t2",
936
+ atMs: 1_000,
937
+ durationMs: 10,
938
+ name: "GET /health",
939
+ }),
940
+ ];
941
+ const signals: Array<ReplaySignal> = groupSpansIntoTraces(
942
+ rows,
943
+ makeClock(UNANCHORED, { "svc-1": "checkout-svc" }),
944
+ );
945
+
946
+ expect(signals).toHaveLength(2);
947
+ /* Sorted by the earliest span of each trace. */
948
+ expect(signals[0]?.links.traceId).toBe("t2");
949
+
950
+ const trace: ReplaySignal = signals[1] as ReplaySignal;
951
+ const detail: ReplaySpanSignalDetail =
952
+ trace.detail as ReplaySpanSignalDetail;
953
+
954
+ expect(trace.id).toBe("span:root");
955
+ expect(trace.offsetMs).toBe(5_000);
956
+ expect(trace.endOffsetMs).toBe(5_300);
957
+ expect(trace.title).toBe("POST /checkout");
958
+ expect(trace.subtitle).toBe("checkout-svc · 300ms · 3 spans");
959
+ expect(trace.severity).toBe("error");
960
+ expect(detail.spanCount).toBe(3);
961
+ expect(detail.errorSpanCount).toBe(1);
962
+ expect(detail.hasError).toBe(true);
963
+ expect(detail.rootSpanId).toBe("root");
964
+ expect(detail.isWaterfallTruncated).toBe(false);
965
+ expect(
966
+ detail.spans.map(
967
+ (span: ReplayTraceWaterfallSpan): [string, number, number] => {
968
+ return [span.spanId, span.depth, span.startOffsetMs];
969
+ },
970
+ ),
971
+ ).toEqual([
972
+ ["root", 0, 0],
973
+ ["child-a", 1, 100],
974
+ ["child-b", 2, 120],
975
+ ]);
976
+ expect(detail.spans[2]?.hasError).toBe(true);
977
+ expect(detail.spans[1]?.sessionOffsetMs).toBe(5_100);
978
+ });
979
+
980
+ it("uses the earliest span as the root when the real root was not ingested", () => {
981
+ const signals: Array<ReplaySignal> = groupSpansIntoTraces(
982
+ [
983
+ makeSpan({
984
+ spanId: "late",
985
+ traceId: "t1",
986
+ atMs: 2_000,
987
+ durationMs: 5,
988
+ parentSpanId: "missing-root",
989
+ }),
990
+ makeSpan({
991
+ spanId: "early",
992
+ traceId: "t1",
993
+ atMs: 1_000,
994
+ durationMs: 5,
995
+ parentSpanId: "missing-root",
996
+ }),
997
+ ],
998
+ makeClock(),
999
+ );
1000
+
1001
+ expect(signals[0]?.id).toBe("span:early");
1002
+ expect((signals[0]?.detail as ReplaySpanSignalDetail).spans[0]?.depth).toBe(
1003
+ 0,
1004
+ );
1005
+ });
1006
+
1007
+ it("caps the waterfall at the max span count and says so", () => {
1008
+ const rows: Array<Span> = [];
1009
+
1010
+ for (let i: number = 0; i < REPLAY_TRACE_WATERFALL_MAX_SPANS + 5; i++) {
1011
+ rows.push(
1012
+ makeSpan({
1013
+ spanId: `s${i}`,
1014
+ traceId: "t1",
1015
+ atMs: 1_000 + i,
1016
+ durationMs: 1,
1017
+ parentSpanId: i === 0 ? undefined : "s0",
1018
+ }),
1019
+ );
1020
+ }
1021
+
1022
+ const detail: ReplaySpanSignalDetail = groupSpansIntoTraces(
1023
+ rows,
1024
+ makeClock(),
1025
+ )[0]?.detail as ReplaySpanSignalDetail;
1026
+
1027
+ expect(detail.spanCount).toBe(REPLAY_TRACE_WATERFALL_MAX_SPANS + 5);
1028
+ expect(detail.spans).toHaveLength(REPLAY_TRACE_WATERFALL_MAX_SPANS);
1029
+ expect(detail.isWaterfallTruncated).toBe(true);
1030
+ });
1031
+
1032
+ it("skips spans without a trace id or a start time", () => {
1033
+ const orphan: Span = new Span();
1034
+
1035
+ orphan.spanId = "x";
1036
+
1037
+ expect(groupSpansIntoTraces([orphan], makeClock())).toEqual([]);
1038
+ expect(fromSpanRow(orphan, makeClock())).toBeNull();
1039
+ });
1040
+
1041
+ it("shifts trace rows by the anchoring delta when anchored", () => {
1042
+ const signal: ReplaySignal | null = fromSpanRow(
1043
+ makeSpan({ spanId: "s1", traceId: "t1", atMs: 5_000, durationMs: 100 }),
1044
+ makeClock(ANCHORED),
1045
+ );
1046
+
1047
+ expect(signal?.offsetMs).toBe(5_000 + ANCHORED.deltaMs);
1048
+ expect(signal?.endOffsetMs).toBe(5_100 + ANCHORED.deltaMs);
1049
+ });
1050
+ });
1051
+
1052
+ describe("mergeSignals", () => {
1053
+ it("orders by offset, then recording before telemetry, then input order", () => {
1054
+ const merged: Array<ReplaySignal> = mergeSignals(
1055
+ [
1056
+ makeSignal({ id: "log:b", source: "telemetry", offsetMs: 100 }),
1057
+ makeSignal({ id: "rec:1:1", source: "recording", offsetMs: 300 }),
1058
+ ],
1059
+ [
1060
+ makeSignal({ id: "rec:1:0", source: "recording", offsetMs: 100 }),
1061
+ makeSignal({ id: "log:a", source: "telemetry", offsetMs: 100 }),
1062
+ makeSignal({ id: "rec:0:0", source: "recording", offsetMs: 50 }),
1063
+ ],
1064
+ );
1065
+
1066
+ expect(
1067
+ merged.map((signal: ReplaySignal): string => {
1068
+ return signal.id;
1069
+ }),
1070
+ ).toEqual(["rec:0:0", "rec:1:0", "log:b", "log:a", "rec:1:1"]);
1071
+ });
1072
+
1073
+ it("does not mutate its inputs and accepts no lists", () => {
1074
+ const input: Array<ReplaySignal> = [
1075
+ makeSignal({ id: "b", offsetMs: 2 }),
1076
+ makeSignal({ id: "a", offsetMs: 1 }),
1077
+ ];
1078
+
1079
+ mergeSignals(input);
1080
+
1081
+ expect(input[0]?.id).toBe("b");
1082
+ expect(mergeSignals()).toEqual([]);
1083
+ });
1084
+ });
1085
+
1086
+ describe("getActiveSignalIndex", () => {
1087
+ const signals: Array<ReplaySignal> = [
1088
+ makeSignal({ id: "a", offsetMs: 1000 }),
1089
+ makeSignal({ id: "b", offsetMs: 2000 }),
1090
+ makeSignal({ id: "c", offsetMs: 3000 }),
1091
+ ];
1092
+
1093
+ it("returns the last row the playhead has passed, -1 before the first (old helper parity)", () => {
1094
+ expect(getActiveSignalIndex(signals, 0)).toBe(-1);
1095
+ expect(getActiveSignalIndex(signals, 999)).toBe(-1);
1096
+ expect(getActiveSignalIndex(signals, 1000)).toBe(0);
1097
+ expect(getActiveSignalIndex(signals, 2500)).toBe(1);
1098
+ expect(getActiveSignalIndex(signals, 99_999)).toBe(2);
1099
+ expect(getActiveSignalIndex([], 5)).toBe(-1);
1100
+ });
1101
+
1102
+ it("keeps the clicked row active while the playhead sits in its pre-roll window", () => {
1103
+ /* Row click seeks to offset - pre-roll; the clicked row must not dim. */
1104
+ const seekTarget: number = 3000 - REPLAY_SIGNAL_SEEK_PRE_ROLL_MS;
1105
+
1106
+ expect(getActiveSignalIndex(signals, seekTarget)).toBe(1);
1107
+ expect(getActiveSignalIndex(signals, seekTarget, "c")).toBe(2);
1108
+ /* Once the playhead moves past the row, the plain rule applies again. */
1109
+ expect(getActiveSignalIndex(signals, 3000, "c")).toBe(2);
1110
+ expect(getActiveSignalIndex(signals, 1500, "c")).toBe(0);
1111
+ /* An unknown selection changes nothing. */
1112
+ expect(getActiveSignalIndex(signals, seekTarget, "zzz")).toBe(1);
1113
+ });
1114
+
1115
+ it("isSignalActiveAt treats traces as live for their whole duration", () => {
1116
+ const trace: ReplaySignal = makeSignal({
1117
+ id: "span:1",
1118
+ kind: "span",
1119
+ offsetMs: 1000,
1120
+ endOffsetMs: 1500,
1121
+ });
1122
+ const point: ReplaySignal = makeSignal({ id: "rec:0:0", offsetMs: 1000 });
1123
+
1124
+ expect(isSignalActiveAt(trace, 999)).toBe(false);
1125
+ expect(isSignalActiveAt(trace, 1000)).toBe(true);
1126
+ expect(isSignalActiveAt(trace, 1400)).toBe(true);
1127
+ expect(isSignalActiveAt(trace, 1501)).toBe(false);
1128
+ expect(isSignalActiveAt(point, 1000)).toBe(true);
1129
+ expect(isSignalActiveAt(point, 1001)).toBe(false);
1130
+ });
1131
+ });
1132
+
1133
+ describe("cross-references", () => {
1134
+ it("indexes trace rows by trace id and finds error logs on a trace", () => {
1135
+ const trace: ReplaySignal = makeSignal({
1136
+ id: "span:root",
1137
+ kind: "span",
1138
+ source: "telemetry",
1139
+ links: { traceId: "t1", spanId: "root" },
1140
+ });
1141
+ const errorLog: ReplaySignal = makeSignal({
1142
+ id: "log:1",
1143
+ kind: "log",
1144
+ source: "telemetry",
1145
+ severity: "error",
1146
+ links: { traceId: "t1", logId: "1" },
1147
+ });
1148
+ const infoLog: ReplaySignal = makeSignal({
1149
+ id: "log:2",
1150
+ kind: "log",
1151
+ source: "telemetry",
1152
+ severity: "info",
1153
+ links: { traceId: "t1", logId: "2" },
1154
+ });
1155
+ const otherError: ReplaySignal = makeSignal({
1156
+ id: "log:3",
1157
+ kind: "log",
1158
+ source: "telemetry",
1159
+ severity: "error",
1160
+ links: { traceId: "t2", logId: "3" },
1161
+ });
1162
+ const all: Array<ReplaySignal> = [trace, errorLog, infoLog, otherError];
1163
+
1164
+ expect(indexTraceSignalsByTraceId(all).get("t1")).toBe(trace);
1165
+ expect(indexTraceSignalsByTraceId(all).has("t2")).toBe(false);
1166
+ expect(findErrorLogsForTrace(all, "t1")).toEqual([errorLog]);
1167
+ expect(findErrorLogsForTrace(all, "")).toEqual([]);
1168
+ });
1169
+
1170
+ it("pairs a client error with the nearest server exception of the same message within 2s", () => {
1171
+ const client: ReplaySignal = fromTimelineEvent(
1172
+ makeEvent("error", {
1173
+ id: "rec:0:0",
1174
+ offsetMs: 10_000,
1175
+ errorKind: "error",
1176
+ message: "Cannot read properties of undefined",
1177
+ }),
1178
+ { startTimeUnixMs: null },
1179
+ );
1180
+ const near: ReplaySignal = fromExceptionRow(
1181
+ makeException({
1182
+ id: "near",
1183
+ atMs: 11_500,
1184
+ exceptionType: "TypeError",
1185
+ message: "Cannot read properties of undefined",
1186
+ }),
1187
+ makeClock(),
1188
+ ) as ReplaySignal;
1189
+ const nearer: ReplaySignal = fromExceptionRow(
1190
+ makeException({
1191
+ id: "nearer",
1192
+ atMs: 9_600,
1193
+ message: "cannot read properties of undefined",
1194
+ }),
1195
+ makeClock(),
1196
+ ) as ReplaySignal;
1197
+ const far: ReplaySignal = fromExceptionRow(
1198
+ makeException({
1199
+ id: "far",
1200
+ atMs: 13_000,
1201
+ message: "Cannot read properties of undefined",
1202
+ }),
1203
+ makeClock(),
1204
+ ) as ReplaySignal;
1205
+ const different: ReplaySignal = fromExceptionRow(
1206
+ makeException({ id: "different", atMs: 10_000, message: "other" }),
1207
+ makeClock(),
1208
+ ) as ReplaySignal;
1209
+
1210
+ const pairs: Array<ReplayErrorPair> = pairClientAndServerErrors([
1211
+ client,
1212
+ near,
1213
+ nearer,
1214
+ far,
1215
+ different,
1216
+ ]);
1217
+
1218
+ expect(pairs).toEqual([
1219
+ { clientSignalId: "rec:0:0", serverSignalId: "exc:nearer", gapMs: -400 },
1220
+ ]);
1221
+
1222
+ const index: Map<string, string> = buildErrorCounterpartIndex(pairs);
1223
+
1224
+ expect(index.get("rec:0:0")).toBe("exc:nearer");
1225
+ expect(index.get("exc:nearer")).toBe("rec:0:0");
1226
+ expect(index.has("exc:near")).toBe(false);
1227
+ });
1228
+
1229
+ it("matches a client message against 'Type: message' on the server side", () => {
1230
+ const client: ReplaySignal = fromTimelineEvent(
1231
+ makeEvent("error", {
1232
+ offsetMs: 1_000,
1233
+ errorKind: "error",
1234
+ message: "TypeError: boom",
1235
+ }),
1236
+ { startTimeUnixMs: null },
1237
+ );
1238
+ const server: ReplaySignal = fromExceptionRow(
1239
+ makeException({
1240
+ id: "s",
1241
+ atMs: 1_200,
1242
+ exceptionType: "TypeError",
1243
+ message: "boom",
1244
+ }),
1245
+ makeClock(),
1246
+ ) as ReplaySignal;
1247
+
1248
+ expect(pairClientAndServerErrors([client, server])).toHaveLength(1);
1249
+ expect(pairClientAndServerErrors([client])).toEqual([]);
1250
+ });
1251
+
1252
+ it("finds the first client error shortly after an interaction", () => {
1253
+ const click: ReplaySignal = makeSignal({
1254
+ id: "rec:0:0",
1255
+ kind: "interaction",
1256
+ offsetMs: 5_000,
1257
+ });
1258
+ const before: ReplaySignal = makeSignal({
1259
+ id: "rec:0:1",
1260
+ kind: "client-error",
1261
+ offsetMs: 4_900,
1262
+ });
1263
+ const after: ReplaySignal = makeSignal({
1264
+ id: "rec:0:2",
1265
+ kind: "client-error",
1266
+ offsetMs: 5_400,
1267
+ });
1268
+ const later: ReplaySignal = makeSignal({
1269
+ id: "rec:0:3",
1270
+ kind: "client-error",
1271
+ offsetMs: 5_900,
1272
+ });
1273
+ const tooLate: ReplaySignal = makeSignal({
1274
+ id: "rec:0:4",
1275
+ kind: "client-error",
1276
+ offsetMs: 8_000,
1277
+ });
1278
+
1279
+ expect(
1280
+ findErrorAfterInteraction([later, tooLate, before, after], click)?.id,
1281
+ ).toBe("rec:0:2");
1282
+ expect(findErrorAfterInteraction([before, tooLate], click)).toBeNull();
1283
+ });
1284
+ });
1285
+
1286
+ describe("formatters", () => {
1287
+ it("formats bytes and durations for row meta", () => {
1288
+ expect(formatSignalBytes(830)).toBe("830B");
1289
+ expect(formatSignalBytes(1229)).toBe("1.2KB");
1290
+ expect(formatSignalBytes(3.4 * 1024 * 1024)).toBe("3.4MB");
1291
+ expect(formatSignalBytes(-1)).toBe("");
1292
+ expect(formatSignalDuration(220)).toBe("220ms");
1293
+ expect(formatSignalDuration(1234)).toBe("1.2s");
1294
+ expect(formatSignalDuration(125_000)).toBe("2m 5s");
1295
+ expect(formatSignalDuration(Number.NaN)).toBe("");
1296
+ });
1297
+
1298
+ it("splits absolute urls and leaves relative ones whole", () => {
1299
+ expect(splitSignalUrl("https://a.com/p?q=1#h")).toEqual({
1300
+ origin: "https://a.com",
1301
+ path: "/p?q=1#h",
1302
+ });
1303
+ expect(splitSignalUrl("/relative/path")).toEqual({
1304
+ origin: "",
1305
+ path: "/relative/path",
1306
+ });
1307
+ });
1308
+ });
1309
+
1310
+ /*
1311
+ * The recorder's own vocabulary for "this is not a failure": a cancelled
1312
+ * request, a capture-cap marker, a subresource that failed to load and a
1313
+ * repeat of an error already recorded. Every one of these used to render
1314
+ * as a red failed request or an ordinary uncaught error (ux-05, ux-06).
1315
+ */
1316
+ describe("ReplaySignals recorder notices that are not failures", () => {
1317
+ function eventWithExtras(
1318
+ kind: ReplayTimelineEventKind,
1319
+ overrides: Partial<ReplayTimelineEvent>,
1320
+ extras: Record<string, unknown>,
1321
+ ): ReplayTimelineEvent {
1322
+ return {
1323
+ ...makeEvent(kind, overrides),
1324
+ ...extras,
1325
+ } as ReplayTimelineEvent;
1326
+ }
1327
+
1328
+ it("renders an aborted request as cancelled, never as an error", () => {
1329
+ const signal: ReplaySignal = fromTimelineEvent(
1330
+ eventWithExtras(
1331
+ "network",
1332
+ {
1333
+ method: "get",
1334
+ url: "https://api.example.com/search?q=ab",
1335
+ status: 0,
1336
+ durationMs: 40,
1337
+ isError: false,
1338
+ },
1339
+ { aborted: true },
1340
+ ),
1341
+ { startTimeUnixMs: null },
1342
+ );
1343
+ const detail: ReplayNetworkSignalDetail =
1344
+ signal.detail as ReplayNetworkSignalDetail;
1345
+
1346
+ expect(signal.title).toBe("GET cancelled /search?q=ab");
1347
+ expect(signal.severity).toBe("info");
1348
+ expect(detail.aborted).toBe(true);
1349
+ expect(detail.isError).toBe(false);
1350
+ /* An abort is status 0, but nothing failed before a response. */
1351
+ expect(detail.failedBeforeResponse).toBe(false);
1352
+ });
1353
+
1354
+ it("renders the network cap marker as a notice, not an empty failed request", () => {
1355
+ const signal: ReplaySignal = fromTimelineEvent(
1356
+ eventWithExtras(
1357
+ "network",
1358
+ { method: "", url: "", status: 0 },
1359
+ { isCapMarker: true },
1360
+ ),
1361
+ { startTimeUnixMs: null },
1362
+ );
1363
+ const detail: ReplayNetworkSignalDetail =
1364
+ signal.detail as ReplayNetworkSignalDetail;
1365
+
1366
+ expect(signal.title).toBe(
1367
+ `Network capture stopped after ${REPLAY_NETWORK_CAPTURE_CAP} requests`,
1368
+ );
1369
+ expect(signal.title).not.toContain("failed");
1370
+ expect(signal.severity).toBe("info");
1371
+ expect(detail.isCapMarker).toBe(true);
1372
+ expect(detail.isError).toBe(false);
1373
+ });
1374
+
1375
+ it("names a failed resource load and keeps it out of the error stepping", () => {
1376
+ const signal: ReplaySignal = fromTimelineEvent(
1377
+ eventWithExtras(
1378
+ "error",
1379
+ {
1380
+ message: "Resource failed to load: <img>",
1381
+ source: "https://cdn.example.com/logo.png",
1382
+ },
1383
+ { errorKind: "resource", tagName: "img" },
1384
+ ),
1385
+ { startTimeUnixMs: null },
1386
+ );
1387
+ const detail: ReplayClientErrorSignalDetail =
1388
+ signal.detail as ReplayClientErrorSignalDetail;
1389
+
1390
+ expect(signal.title).toBe("Resource failed to load: <img> /logo.png");
1391
+ expect(signal.severity).toBe("warn");
1392
+ expect(detail.kind).toBe("resource");
1393
+ expect(detail.tagName).toBe("img");
1394
+ expect(isSteppableClientError(signal)).toBe(false);
1395
+ });
1396
+
1397
+ it("quantifies a repeat marker and does not step through it as a new error", () => {
1398
+ const signal: ReplaySignal = fromTimelineEvent(
1399
+ eventWithExtras(
1400
+ "error",
1401
+ { message: "TypeError: boom", errorKind: "error" },
1402
+ { isRepeat: true, occurrences: 2400 },
1403
+ ),
1404
+ { startTimeUnixMs: null },
1405
+ );
1406
+ const detail: ReplayClientErrorSignalDetail =
1407
+ signal.detail as ReplayClientErrorSignalDetail;
1408
+
1409
+ expect(signal.subtitle).toContain("seen 2400 times");
1410
+ expect(detail.isRepeat).toBe(true);
1411
+ expect(detail.occurrences).toBe(2400);
1412
+ expect(isSteppableClientError(signal)).toBe(false);
1413
+ });
1414
+
1415
+ it("renders the error cap marker as a recorder notice", () => {
1416
+ const signal: ReplaySignal = fromTimelineEvent(
1417
+ eventWithExtras(
1418
+ "error",
1419
+ {
1420
+ message:
1421
+ "Error capture stopped after 100 distinct errors in this session; later errors were not recorded.",
1422
+ errorKind: "error",
1423
+ },
1424
+ { isCapMarker: true },
1425
+ ),
1426
+ { startTimeUnixMs: null },
1427
+ );
1428
+ const detail: ReplayClientErrorSignalDetail =
1429
+ signal.detail as ReplayClientErrorSignalDetail;
1430
+
1431
+ expect(signal.severity).toBe("warn");
1432
+ expect(signal.subtitle).toBe("recorder cap");
1433
+ expect(detail.isCapMarker).toBe(true);
1434
+ expect(isSteppableClientError(signal)).toBe(false);
1435
+ });
1436
+
1437
+ it("keeps a real uncaught error steppable and unchanged", () => {
1438
+ const signal: ReplaySignal = fromTimelineEvent(
1439
+ makeEvent("error", {
1440
+ message: "TypeError: boom",
1441
+ errorKind: "error",
1442
+ source: "https://app.example.com/app.js",
1443
+ lineNumber: 12,
1444
+ columnNumber: 5,
1445
+ }),
1446
+ { startTimeUnixMs: null },
1447
+ );
1448
+
1449
+ expect(signal.severity).toBe("error");
1450
+ expect(signal.subtitle).toBe("uncaught error · /app.js:12:5");
1451
+ expect(isSteppableClientError(signal)).toBe(true);
1452
+ });
1453
+
1454
+ it("never pairs a resource failure with a server exception", () => {
1455
+ const resource: ReplaySignal = fromTimelineEvent(
1456
+ eventWithExtras(
1457
+ "error",
1458
+ { message: "boom", offsetMs: 1000 },
1459
+ { errorKind: "resource" },
1460
+ ),
1461
+ { startTimeUnixMs: null },
1462
+ );
1463
+ const server: ReplaySignal = {
1464
+ id: "exc:1",
1465
+ kind: "server-error",
1466
+ source: "telemetry",
1467
+ offsetMs: 1200,
1468
+ severity: "error",
1469
+ title: "boom",
1470
+ links: {},
1471
+ detail: { message: "boom", exceptionType: null },
1472
+ alignment: "unanchored",
1473
+ };
1474
+
1475
+ expect(pairClientAndServerErrors([resource, server])).toEqual([]);
1476
+ });
1477
+ });
1478
+
1479
+ /* ux-17: kebab-case library values never reach a row or a detail. */
1480
+ describe("ReplaySignals performance wording", () => {
1481
+ it("spells out a web vital's rating", () => {
1482
+ const signal: ReplaySignal = fromTimelineEvent(
1483
+ makeEvent("performance", {
1484
+ performanceKind: "web-vital",
1485
+ metric: "LCP",
1486
+ value: 4800,
1487
+ rating: "needs-improvement",
1488
+ }),
1489
+ { startTimeUnixMs: null },
1490
+ );
1491
+
1492
+ expect(signal.title).toBe("LCP 4.8s needs improvement");
1493
+ expect(signal.title).not.toContain("needs-improvement");
1494
+ expect(formatVitalRating("needs-improvement")).toBe("needs improvement");
1495
+ expect(formatVitalRating(null)).toBe("");
1496
+ });
1497
+
1498
+ it("names the measure of a budget row in words", () => {
1499
+ const signal: ReplaySignal = fromTimelineEvent(
1500
+ makeEvent("performance", {
1501
+ performanceKind: "long-task",
1502
+ durationMs: 320,
1503
+ budgetMs: 200,
1504
+ }),
1505
+ { startTimeUnixMs: null },
1506
+ );
1507
+ const detail: ReplayPerformanceSignalDetail =
1508
+ signal.detail as ReplayPerformanceSignalDetail;
1509
+
1510
+ expect(signal.title).toBe("Long task 320ms (budget 200ms)");
1511
+ expect(formatPerformanceMeasure(detail)).toBe("Long task");
1512
+ });
1513
+ });
1514
+
1515
+ /*
1516
+ * integration-003: a span cross-link carries the id of the span that was
1517
+ * clicked, while the Traces tab has one row per trace keyed by its ROOT
1518
+ * span, so matching by row id alone selected nothing.
1519
+ */
1520
+ describe("ReplaySignals findSignalMatch", () => {
1521
+ const TRACE: string = "4bf92f3577b34da6a3ce929d0e0e4736";
1522
+
1523
+ function traceRow(): ReplaySignal {
1524
+ const rows: Array<ReplaySignal> = groupSpansIntoTraces(
1525
+ [
1526
+ makeSpan({
1527
+ spanId: "root-a",
1528
+ traceId: TRACE,
1529
+ atMs: 4000,
1530
+ durationMs: 900,
1531
+ }),
1532
+ makeSpan({
1533
+ spanId: "child-b",
1534
+ traceId: TRACE,
1535
+ atMs: 4300,
1536
+ durationMs: 200,
1537
+ parentSpanId: "root-a",
1538
+ }),
1539
+ ],
1540
+ makeClock(ANCHORED),
1541
+ );
1542
+
1543
+ return rows[0] as ReplaySignal;
1544
+ }
1545
+
1546
+ it("matches a row by its own id", () => {
1547
+ const row: ReplaySignal = traceRow();
1548
+
1549
+ expect(findSignalMatch([row], row.id)).toEqual({
1550
+ signal: row,
1551
+ offsetMs: row.offsetMs,
1552
+ });
1553
+ });
1554
+
1555
+ it("resolves a child span id to the trace row that contains it", () => {
1556
+ const row: ReplaySignal = traceRow();
1557
+ const child: ReplayTraceWaterfallSpan | undefined = (
1558
+ row.detail as ReplaySpanSignalDetail
1559
+ ).spans.find((span: ReplayTraceWaterfallSpan): boolean => {
1560
+ return span.spanId === "child-b";
1561
+ });
1562
+
1563
+ const match: ReplaySignalMatch | null = findSignalMatch(
1564
+ [row],
1565
+ "span:child-b",
1566
+ );
1567
+
1568
+ expect(match?.signal.id).toBe(row.id);
1569
+ /* The moment is the CHILD's start, not the trace's. */
1570
+ expect(match?.offsetMs).toBe(child?.sessionOffsetMs);
1571
+ expect(match?.offsetMs).not.toBe(row.offsetMs);
1572
+ });
1573
+
1574
+ it("returns null for an id no row answers to", () => {
1575
+ expect(findSignalMatch([traceRow()], "span:not-here")).toBeNull();
1576
+ expect(findSignalMatch([traceRow()], "log:missing")).toBeNull();
1577
+ expect(findSignalMatch([traceRow()], "")).toBeNull();
1578
+ });
1579
+ });