@oneuptime/common 12.0.33 → 12.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (652) hide show
  1. package/Models/AnalyticsModels/RumSession.ts +117 -1
  2. package/Models/AnalyticsModels/RumSessionChunk.ts +13 -0
  3. package/Models/DatabaseModels/AlertCustomField.ts +77 -3
  4. package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
  5. package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
  6. package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
  7. package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
  8. package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
  9. package/Models/DatabaseModels/RumApplication.ts +6 -6
  10. package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
  11. package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
  12. package/Models/DatabaseModels/TeamCustomField.ts +77 -3
  13. package/Models/DatabaseModels/TeamMember.ts +0 -9
  14. package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
  15. package/Models/DatabaseModels/TeamPermission.ts +3 -24
  16. package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
  17. package/Models/DatabaseModels/UserTelegram.ts +0 -4
  18. package/Scripts/benchmark-fanin-capacity.js +181 -0
  19. package/Server/API/TelemetryAPI.ts +1284 -164
  20. package/Server/API/UserNotificationSettingAPI.ts +55 -0
  21. package/Server/API/UserTelegramAPI.ts +48 -4
  22. package/Server/EnvironmentConfig.ts +35 -2
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.ts +91 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.ts +67 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.ts +139 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.ts +121 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  28. package/Server/Infrastructure/QueueWorker.ts +20 -14
  29. package/Server/Infrastructure/Semaphore.ts +2 -0
  30. package/Server/Middleware/TelemetryIngest.ts +453 -7
  31. package/Server/Services/AccessTokenService.ts +1 -0
  32. package/Server/Services/AlertCustomFieldService.ts +98 -0
  33. package/Server/Services/AlertService.ts +37 -0
  34. package/Server/Services/ApiKeyPermissionService.ts +461 -29
  35. package/Server/Services/CustomFieldMappingService.ts +879 -0
  36. package/Server/Services/GlobalConfigService.ts +194 -0
  37. package/Server/Services/IncidentCustomFieldService.ts +98 -0
  38. package/Server/Services/IncidentService.ts +35 -0
  39. package/Server/Services/MetricService.ts +194 -0
  40. package/Server/Services/MonitorService.ts +32 -0
  41. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +78 -25
  42. package/Server/Services/ProjectService.ts +22 -0
  43. package/Server/Services/RoutineEmailSettingsService.ts +73 -0
  44. package/Server/Services/RumSessionReplayViewService.ts +104 -24
  45. package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
  46. package/Server/Services/ScheduledMaintenanceService.ts +32 -0
  47. package/Server/Services/TeamMemberService.ts +78 -0
  48. package/Server/Services/TeamPermissionService.ts +235 -3
  49. package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
  50. package/Server/Services/UserNotificationSettingService.ts +34 -6
  51. package/Server/Services/UserTelegramService.ts +326 -5
  52. package/Server/Types/Database/QueryHelper.ts +2 -0
  53. package/Server/Utils/APIKey/AccessPermission.ts +5 -2
  54. package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
  55. package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
  56. package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
  57. package/Server/Utils/DataSource/EgressGuard.ts +177 -8
  58. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
  59. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +57 -4
  60. package/Server/Utils/FrontendEnvironment.ts +40 -0
  61. package/Server/Utils/LogRedaction.ts +20 -0
  62. package/Server/Utils/Logger.ts +11 -0
  63. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +338 -77
  64. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
  65. package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
  66. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +110 -15
  67. package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
  68. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -0
  69. package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
  70. package/Server/Utils/SSRFProtection.ts +217 -10
  71. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
  72. package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
  73. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
  74. package/Server/Utils/StartServer.ts +2 -17
  75. package/Server/Utils/TelegramVerificationToken.ts +185 -0
  76. package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
  77. package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +38 -16
  78. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +92 -0
  79. package/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.ts +217 -0
  80. package/Server/Utils/VM/VMAPI.ts +1 -0
  81. package/Server/Utils/VM/VMRunner.ts +975 -95
  82. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
  83. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
  84. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
  85. package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +399 -0
  86. package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
  87. package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
  88. package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
  89. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
  90. package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
  91. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
  92. package/Tests/ResponsiveVisibility.test.ts +115 -0
  93. package/Tests/ResponsiveVisibility.ts +183 -0
  94. package/Tests/Server/API/SessionReplayAPI.test.ts +1940 -216
  95. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +186 -0
  96. package/Tests/Server/API/UserTelegramAPISecurity.test.ts +231 -0
  97. package/Tests/Server/EnvironmentConfigFrontendSecurity.test.ts +234 -0
  98. package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +202 -0
  99. package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
  100. package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
  101. package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
  102. package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
  103. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
  104. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
  105. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
  106. package/Tests/Server/Services/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
  107. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
  108. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
  109. package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
  110. package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
  111. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
  112. package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
  113. package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
  114. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +226 -1
  115. package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
  116. package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
  117. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
  118. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
  119. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
  120. package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
  121. package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
  122. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +141 -0
  123. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +18 -10
  124. package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
  125. package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
  126. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
  127. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
  128. package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
  129. package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
  130. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
  131. package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
  132. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
  133. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
  134. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
  135. package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
  136. package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
  137. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
  138. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +584 -0
  139. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
  140. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +437 -0
  141. package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
  142. package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
  143. package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
  144. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
  145. package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
  146. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
  147. package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
  148. package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
  149. package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
  150. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriterCapacity.test.ts +458 -0
  151. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +424 -0
  152. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.test.ts +528 -0
  153. package/Tests/Server/Utils/TelemetryExporterEnvironment.test.ts +56 -0
  154. package/Tests/Server/Utils/VM/VMRunnerHostBridgeLatency.test.ts +74 -0
  155. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +100 -7
  156. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +1176 -6
  157. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +220 -0
  158. package/Tests/Types/CustomField/CustomFieldValueMapping.test.ts +348 -0
  159. package/Tests/Types/JSONFunctions.test.ts +260 -0
  160. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
  161. package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +495 -15
  162. package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
  163. package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
  164. package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
  165. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
  166. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
  167. package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
  168. package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
  169. package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
  170. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
  171. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
  172. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
  173. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
  174. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
  175. package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
  176. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
  177. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
  178. package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
  179. package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
  180. package/Tests/Types/NotificationSetting/RoutineEmailEvents.test.ts +47 -0
  181. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +608 -0
  182. package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +434 -0
  183. package/Tests/Types/WebsiteRequest.test.ts +285 -3
  184. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
  185. package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
  186. package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
  187. package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
  188. package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
  189. package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
  190. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
  191. package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
  192. package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
  193. package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
  194. package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
  195. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
  196. package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
  197. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +28 -12
  198. package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
  199. package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
  200. package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
  201. package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
  202. package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
  203. package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
  204. package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
  205. package/Tests/UI/Rum/ChunkLoader.test.ts +1036 -2
  206. package/Tests/UI/Rum/FidelityNotices.test.ts +187 -0
  207. package/Tests/UI/Rum/InactivityMap.test.ts +341 -0
  208. package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +259 -0
  209. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +855 -0
  210. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +594 -0
  211. package/Tests/UI/Rum/ReplayCard.test.tsx +451 -0
  212. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +536 -0
  213. package/Tests/UI/Rum/ReplayEngine.test.ts +2503 -0
  214. package/Tests/UI/Rum/ReplayEngineTypes.test.ts +171 -0
  215. package/Tests/UI/Rum/ReplayHeader.test.tsx +711 -0
  216. package/Tests/UI/Rum/ReplayLink.test.tsx +119 -0
  217. package/Tests/UI/Rum/ReplayPinControl.test.tsx +408 -0
  218. package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +152 -0
  219. package/Tests/UI/Rum/ReplayRail.test.tsx +1296 -0
  220. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +900 -0
  221. package/Tests/UI/Rum/ReplayScrubber.test.tsx +763 -147
  222. package/Tests/UI/Rum/ReplaySignalTypes.test.ts +189 -0
  223. package/Tests/UI/Rum/ReplaySignals.test.ts +1579 -0
  224. package/Tests/UI/Rum/ReplayStage.test.tsx +396 -473
  225. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +918 -0
  226. package/Tests/UI/Rum/ReplayTimeline.test.tsx +696 -0
  227. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +499 -0
  228. package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +346 -0
  229. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +545 -0
  230. package/Tests/UI/Rum/SessionReplayTable.test.tsx +991 -0
  231. package/Tests/UI/Rum/TargetedCapturePanel.test.tsx +254 -0
  232. package/Tests/UI/Telemetry/BrowserExporterIsolation.test.ts +71 -0
  233. package/Tests/UI/Utils/GlobalKeyboardShortcut.test.ts +344 -0
  234. package/Tests/Utils/API.test.ts +308 -0
  235. package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
  236. package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
  237. package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
  238. package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
  239. package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
  240. package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
  241. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
  242. package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
  243. package/Tests/Utils/ValueFormatter.test.ts +148 -0
  244. package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
  245. package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
  246. package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
  247. package/Types/Icon/IconProp.ts +1 -0
  248. package/Types/JSONFunctions.ts +189 -43
  249. package/Types/Monitor/CephAlertTemplates.ts +157 -195
  250. package/Types/Monitor/DockerAlertTemplates.ts +338 -128
  251. package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
  252. package/Types/Monitor/HostAlertTemplates.ts +302 -130
  253. package/Types/Monitor/IotAlertTemplates.ts +112 -104
  254. package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
  255. package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
  256. package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
  257. package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
  258. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
  259. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
  260. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
  261. package/Types/Monitor/RumAlertTemplates.ts +46 -7
  262. package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
  263. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
  264. package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
  265. package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
  266. package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
  267. package/Types/Rum/SessionReplay.ts +209 -0
  268. package/Types/Rum/SessionReplayApi.ts +722 -0
  269. package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
  270. package/Types/Rum/SessionReplayConsentMode.ts +11 -7
  271. package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
  272. package/Types/Rum/SessionReplayHealth.ts +238 -0
  273. package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
  274. package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
  275. package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
  276. package/Types/WebsiteRequest.ts +85 -3
  277. package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
  278. package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
  279. package/UI/Components/Charts/Line/LineChart.tsx +13 -2
  280. package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
  281. package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
  282. package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
  283. package/UI/Components/Charts/Utils/XAxis.ts +217 -0
  284. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +143 -25
  285. package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
  286. package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
  287. package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
  288. package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
  289. package/UI/Components/Header/Header.tsx +25 -9
  290. package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
  291. package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
  292. package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
  293. package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
  294. package/UI/Components/Icon/Icon.tsx +11 -0
  295. package/UI/Components/JSONTable/JSONTable.tsx +2 -2
  296. package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
  297. package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
  298. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
  299. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
  300. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
  301. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
  302. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
  303. package/UI/Components/ModelTable/Column.ts +15 -0
  304. package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
  305. package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
  306. package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
  307. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
  308. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  309. package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
  310. package/UI/Components/Table/CellClassName.ts +81 -0
  311. package/UI/Components/Table/TableRow.tsx +20 -14
  312. package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
  313. package/UI/Components/Table/Types/Column.ts +36 -0
  314. package/UI/Components/Tooltip/Tooltip.tsx +11 -1
  315. package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
  316. package/UI/Components/Workflow/NodePlacement.ts +57 -0
  317. package/UI/Components/Workflow/Workflow.tsx +47 -18
  318. package/UI/Config.ts +15 -33
  319. package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
  320. package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
  321. package/UI/Utils/Telemetry/Telemetry.ts +10 -8
  322. package/Utils/API.ts +129 -3
  323. package/Utils/HTTPResponseBodyReader.ts +221 -0
  324. package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
  325. package/Utils/Rum/ChunkMath.ts +106 -0
  326. package/Utils/Rum/SessionReplayHealth.ts +732 -0
  327. package/Utils/Rum/SessionReplayStringMap.ts +226 -0
  328. package/Utils/Schema/ModelSchema.ts +1 -0
  329. package/Utils/StatusPage/ResourceSearch.ts +290 -0
  330. package/Utils/Telemetry/OriginAllowList.ts +355 -0
  331. package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
  332. package/Utils/ValueFormatter.ts +35 -1
  333. package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
  334. package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
  335. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
  336. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
  338. package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
  339. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
  340. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
  341. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
  342. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  343. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
  344. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
  345. package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
  346. package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
  347. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
  348. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
  349. package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
  350. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  351. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
  352. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
  353. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
  354. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
  355. package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
  356. package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
  358. package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
  360. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
  362. package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
  364. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
  366. package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
  367. package/build/dist/Server/API/TelemetryAPI.js +769 -109
  368. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  369. package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
  370. package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
  371. package/build/dist/Server/API/UserTelegramAPI.js +28 -6
  372. package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
  373. package/build/dist/Server/EnvironmentConfig.js +29 -2
  374. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  375. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
  376. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
  377. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
  378. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
  379. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
  380. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
  381. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
  382. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
  383. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  384. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  385. package/build/dist/Server/Infrastructure/QueueWorker.js +19 -7
  386. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  387. package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
  388. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  389. package/build/dist/Server/Middleware/TelemetryIngest.js +315 -8
  390. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  391. package/build/dist/Server/Services/AccessTokenService.js +1 -0
  392. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  393. package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
  394. package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
  395. package/build/dist/Server/Services/AlertService.js +34 -0
  396. package/build/dist/Server/Services/AlertService.js.map +1 -1
  397. package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
  398. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  399. package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
  400. package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
  401. package/build/dist/Server/Services/GlobalConfigService.js +133 -0
  402. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentCustomFieldService.js +93 -0
  404. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentService.js +32 -0
  406. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  407. package/build/dist/Server/Services/MetricService.js +163 -0
  408. package/build/dist/Server/Services/MetricService.js.map +1 -1
  409. package/build/dist/Server/Services/MonitorService.js +29 -0
  410. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  411. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +79 -27
  412. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/ProjectService.js +22 -0
  414. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  415. package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
  416. package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
  417. package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
  418. package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
  419. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
  420. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
  421. package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
  422. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  423. package/build/dist/Server/Services/TeamMemberService.js +62 -2
  424. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  425. package/build/dist/Server/Services/TeamPermissionService.js +166 -3
  426. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  427. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
  428. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  429. package/build/dist/Server/Services/UserNotificationSettingService.js +26 -6
  430. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  431. package/build/dist/Server/Services/UserTelegramService.js +257 -4
  432. package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
  433. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  434. package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
  435. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  436. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
  437. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
  438. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
  439. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
  440. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
  441. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
  442. package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
  443. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  444. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +38 -5
  445. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -1
  446. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +44 -2
  447. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  448. package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
  449. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
  450. package/build/dist/Server/Utils/LogRedaction.js +20 -0
  451. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  452. package/build/dist/Server/Utils/Logger.js +10 -0
  453. package/build/dist/Server/Utils/Logger.js.map +1 -1
  454. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +287 -68
  455. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  456. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
  457. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  458. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
  459. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  460. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +88 -13
  461. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  462. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  463. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  464. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +22 -0
  465. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  466. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
  467. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
  468. package/build/dist/Server/Utils/SSRFProtection.js +136 -9
  469. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  470. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
  471. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
  472. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
  473. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
  474. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
  475. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  476. package/build/dist/Server/Utils/StartServer.js +3 -14
  477. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  478. package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
  479. package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
  480. package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
  481. package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
  482. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
  483. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
  484. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
  485. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
  486. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
  487. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
  488. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  489. package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
  490. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  491. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +60 -0
  492. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -0
  493. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js +20 -0
  494. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js.map +1 -0
  495. package/build/dist/Types/CustomField/CustomFieldValueMapping.js +141 -0
  496. package/build/dist/Types/CustomField/CustomFieldValueMapping.js.map +1 -0
  497. package/build/dist/Types/Icon/IconProp.js +1 -0
  498. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  499. package/build/dist/Types/JSONFunctions.js +118 -37
  500. package/build/dist/Types/JSONFunctions.js.map +1 -1
  501. package/build/dist/Types/Monitor/CephAlertTemplates.js +130 -171
  502. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  503. package/build/dist/Types/Monitor/DockerAlertTemplates.js +286 -121
  504. package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
  505. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
  506. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
  507. package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
  508. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
  509. package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
  510. package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
  511. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
  512. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  513. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
  514. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  515. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
  516. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
  517. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
  518. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
  519. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
  520. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
  521. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
  522. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  523. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
  524. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
  525. package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
  526. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  527. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
  528. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
  529. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
  530. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
  531. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
  532. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
  533. package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
  534. package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
  535. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
  536. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
  537. package/build/dist/Types/Rum/SessionReplay.js +117 -0
  538. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  539. package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
  540. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
  541. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
  542. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
  543. package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
  544. package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
  545. package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
  546. package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
  547. package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
  548. package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
  549. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
  550. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
  551. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
  552. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
  553. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
  554. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
  555. package/build/dist/Types/WebsiteRequest.js +55 -3
  556. package/build/dist/Types/WebsiteRequest.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
  558. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
  560. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
  562. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  563. package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
  564. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
  565. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  566. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
  567. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  568. package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
  569. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  570. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +80 -6
  571. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  572. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +118 -0
  573. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -0
  574. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +112 -7
  575. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  576. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
  577. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  578. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
  579. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
  580. package/build/dist/UI/Components/Header/Header.js +2 -3
  581. package/build/dist/UI/Components/Header/Header.js.map +1 -1
  582. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
  583. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
  584. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
  585. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
  586. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
  587. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
  588. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
  589. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
  590. package/build/dist/UI/Components/Icon/Icon.js +5 -0
  591. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  592. package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
  593. package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
  594. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
  595. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
  596. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
  597. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
  598. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
  599. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
  600. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
  601. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  602. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
  603. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  604. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +38 -0
  605. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  606. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
  607. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
  608. package/build/dist/UI/Components/Table/CellClassName.js +55 -0
  609. package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
  610. package/build/dist/UI/Components/Table/TableRow.js +16 -13
  611. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  612. package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
  613. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
  614. package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
  615. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  616. package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
  617. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  618. package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
  619. package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
  620. package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
  621. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  622. package/build/dist/UI/Config.js +10 -20
  623. package/build/dist/UI/Config.js.map +1 -1
  624. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
  625. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
  626. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
  627. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
  628. package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
  629. package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
  630. package/build/dist/Utils/API.js +67 -5
  631. package/build/dist/Utils/API.js.map +1 -1
  632. package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
  633. package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
  636. package/build/dist/Utils/Rum/ChunkMath.js +76 -0
  637. package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
  638. package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
  639. package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
  640. package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
  641. package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
  642. package/build/dist/Utils/Schema/ModelSchema.js +1 -0
  643. package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
  644. package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
  645. package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
  646. package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
  647. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
  648. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
  649. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
  650. package/build/dist/Utils/ValueFormatter.js +32 -1
  651. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  652. package/package.json +1 -1
@@ -31,6 +31,7 @@ import {
31
31
  buildNetworkDeviceFromDiscoveredHost,
32
32
  } from "../../Utils/NetworkDiscovery/DiscoveredDeviceBuilder";
33
33
  import { normalizeDiscoveredHosts } from "../../Utils/NetworkDiscovery/DiscoveredHostUtil";
34
+ import { DISCOVERY_SCAN_IMPORTABLE_STATUSES } from "../../Utils/NetworkDiscovery/DiscoveryScanStatus";
34
35
  import { NetworkDeviceMonitoringMethodUtil } from "../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
35
36
  import NetworkDeviceMonitorTemplateUtil from "../../Utils/Monitor/NetworkDeviceMonitorTemplateUtil";
36
37
  import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
@@ -41,7 +42,8 @@ import logger, { LogAttributes } from "../Utils/Logger";
41
42
 
42
43
  /*
43
44
  * The engine behind network device auto-import rules (issue #3378): reads a
44
- * completed discovery scan's results, asks the project's rules which hosts
45
+ * discovery scan's results finished or still arriving from a running sweep,
46
+ * see DISCOVERY_SCAN_IMPORTABLE_STATUSES — asks the project's rules which hosts
45
47
  * import, and creates the Network Devices the manual Review dialog would
46
48
  * have — through the same builder, so a rule-imported host and a
47
49
  * hand-imported host are the same device. Site assignment, owners and labels
@@ -182,24 +184,32 @@ export type ImportAttemptBudgetsByProjectId = Map<string, ImportAttemptBudget>;
182
184
 
183
185
  class NetworkDeviceAutoImportRuleEngineServiceClass {
184
186
  /**
185
- * The automatic path: apply the project's enabled rules to one Completed
186
- * scan, then stamp the scan's autoImportProcessedAt marker.
187
+ * The automatic path: apply the project's enabled rules to one scan's
188
+ * stored results, then stamp the scan's autoImportProcessedAt marker.
189
+ *
190
+ * The scan may still be SWEEPING — see
191
+ * DISCOVERY_SCAN_IMPORTABLE_STATUSES. Its partial results are as real as
192
+ * a finished scan's (the probe found those hosts; it simply has more of the
193
+ * range to cover), and waiting for the whole sweep is what left 527
194
+ * discovered switches unimportable for a day in OneUptime issue #3599. The
195
+ * name is kept because it is the automatic path's identity across the
196
+ * worker, its tests and its logs.
187
197
  *
188
198
  * Returns null when there was nothing to do (scan gone, superseded,
189
199
  * already processed, no import rules, or results too old) and the run's
190
200
  * counters otherwise. Throws only on unexpected failures — the caller
191
201
  * (the worker sweep) isolates those per scan.
192
202
  *
193
- * The marker protocol, and why every stamp is a compare-and-set on
194
- * (status, completedAt): the ingest endpoint clears the marker in the same
195
- * write that stores new results, so "marker is NULL" always means "the
196
- * results now on the row have not been processed". If new results land
197
- * while this pass is reading the old ones, the CAS misses, the marker
198
- * stays NULL, and the next tick processes the new upload — the stamp can
199
- * never retire results it did not see, and the jsonb write-back can never
200
- * clobber a newer host list. A truncated pass that created something
201
- * stamps nothing on purpose: the NULL marker is what makes the next tick
202
- * resume. (A truncated pass where every create FAILED stamps anyway — see
203
+ * The marker protocol, and why every stamp is a compare-and-set on the run
204
+ * state this pass read: the ingest endpoint clears the marker in the same
205
+ * write that stores new results partial uploads included so "marker is
206
+ * NULL" always means "the results now on the row have not been processed".
207
+ * If new results land while this pass is reading the old ones, the CAS
208
+ * misses, the marker stays NULL, and the next tick processes the new upload
209
+ * — the stamp can never retire results it did not see, and the jsonb
210
+ * write-back can never clobber a newer host list. A truncated pass that
211
+ * created something stamps nothing on purpose: the NULL marker is what
212
+ * makes the next tick resume. (A truncated pass where every create FAILED stamps anyway — see
203
213
  * the zero-progress note at the stamp below.)
204
214
  */
205
215
  @CaptureSpan()
@@ -213,13 +223,21 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
213
223
  await NetworkDeviceDiscoveryScanService.findOneBy({
214
224
  query: {
215
225
  _id: data.scanId,
216
- status: "Completed",
226
+ status: QueryHelper.any(DISCOVERY_SCAN_IMPORTABLE_STATUSES),
217
227
  },
218
228
  select: {
219
229
  _id: true,
220
230
  projectId: true,
221
231
  status: true,
222
232
  completedAt: true,
233
+ /*
234
+ * The two counters a running scan's partial uploads move. They are
235
+ * not read for anything; they are the version token stampScan's
236
+ * compare-and-set uses to tell "the results I evaluated" from "the
237
+ * results that landed while I was evaluating".
238
+ */
239
+ scannedHostCount: true,
240
+ respondedHostCount: true,
223
241
  autoImportProcessedAt: true,
224
242
  discoveredDevices: true,
225
243
  ...AUTO_IMPORT_SCAN_CREDENTIAL_SELECT,
@@ -538,11 +556,21 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
538
556
  await NetworkDeviceDiscoveryScanService.findBy({
539
557
  query: {
540
558
  projectId: data.projectId,
541
- status: "Completed",
559
+ /*
560
+ * A scan that is still sweeping counts too: its partial results are
561
+ * already on the row, and "Run Now found 25 hosts while 527 sat in
562
+ * the Devices list" was exactly the report (OneUptime issue #3599).
563
+ */
564
+ status: QueryHelper.any(DISCOVERY_SCAN_IMPORTABLE_STATUSES),
542
565
  },
543
566
  select: {
544
567
  _id: true,
545
568
  },
569
+ /*
570
+ * Newest results first. An in-progress scan has no completedAt, and
571
+ * Postgres orders NULLs first under DESC — which is the right place
572
+ * for it: its results are the freshest the project has.
573
+ */
546
574
  sort: {
547
575
  completedAt: SortOrder.Descending,
548
576
  },
@@ -564,13 +592,16 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
564
592
  query: {
565
593
  _id: scanStub.id!,
566
594
  projectId: data.projectId,
567
- status: "Completed",
595
+ status: QueryHelper.any(DISCOVERY_SCAN_IMPORTABLE_STATUSES),
568
596
  },
569
597
  select: {
570
598
  _id: true,
571
599
  projectId: true,
572
600
  status: true,
573
601
  completedAt: true,
602
+ // The version token stampScan's compare-and-set uses; see there.
603
+ scannedHostCount: true,
604
+ respondedHostCount: true,
574
605
  discoveredDevices: true,
575
606
  ...AUTO_IMPORT_SCAN_CREDENTIAL_SELECT,
576
607
  },
@@ -1566,20 +1597,20 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
1566
1597
  /*
1567
1598
  * The one write this engine makes to the scan row: retire the consumed
1568
1599
  * hosts in the stored jsonb (so the Review dialog stops offering them) and
1569
- * stamp the processed marker — in a single hook-free compare-and-set on
1570
- * (status, completedAt), for the reasons on processCompletedScan. The
1600
+ * stamp the processed marker — in a single hook-free compare-and-set on the
1601
+ * run state that was read, for the reasons on processCompletedScan. The
1571
1602
  * claim endpoint's hook-free contract is why this must never go through
1572
1603
  * updateOneById: the scan service deliberately has no update-success hooks
1573
1604
  * to piggyback on, and this write must not fire the full pipeline on every
1574
1605
  * worker tick.
1575
1606
  *
1576
1607
  * The CAS defends against exactly one concurrent writer — the ingest
1577
- * endpoint, which rewrites completedAt with every upload. It cannot
1578
- * defend against another ENGINE write (which changes neither status nor
1579
- * completedAt), and does not need to: every path that reaches this method
1580
- * holds the sweep lock (the worker for its whole sweep, Run Now for a
1581
- * real run; dry runs never write), so the full-array replace below always
1582
- * has the row's only engine writer. Weaken that invariant and this
1608
+ * endpoint, which rewrites completedAt with a final upload and the host
1609
+ * counters with a partial one. It cannot defend against another ENGINE
1610
+ * write (which changes none of those columns), and does not need to: every
1611
+ * path that reaches this method holds the sweep lock (the worker for its
1612
+ * whole sweep, Run Now for a real run; dry runs never write), so the
1613
+ * full-array replace below always has the row's only engine writer. Weaken that invariant and this
1583
1614
  * becomes last-writer-wins on the isAlreadyRegistered flips.
1584
1615
  */
1585
1616
  private async stampScan(data: {
@@ -1632,8 +1663,30 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
1632
1663
  // Cast: the model's JSON column makes DeepPartial recursion blow up.
1633
1664
  data: payload as unknown as QueryDeepPartialEntity<NetworkDeviceDiscoveryScan>,
1634
1665
  expectedData: {
1635
- status: "Completed",
1666
+ /*
1667
+ * The scan's own status, not the literal "Completed" this used to
1668
+ * pin. A scan that is still sweeping is importable now (issue
1669
+ * #3599), and its status is exactly the thing that changes when its
1670
+ * run ends — so reading it off the row keeps the guard doing what it
1671
+ * always did rather than making an In Progress stamp always miss.
1672
+ */
1673
+ status: data.scan.status ?? null,
1636
1674
  completedAt: data.scan.completedAt || null,
1675
+ /*
1676
+ * The counters a running scan's partial uploads move, so a partial
1677
+ * landing between the read and this write is caught the way a
1678
+ * completion is: the stamp misses, the marker stays NULL, and the
1679
+ * next tick processes the newer host list.
1680
+ *
1681
+ * Not a perfect version token for an in-progress scan — the
1682
+ * ICMP-filtered fallback pass finds hosts without advancing
1683
+ * scannedHostCount, so two partials can carry both counts unchanged.
1684
+ * The consequence is bounded and self-healing: one batch of hosts
1685
+ * waits for the next partial upload (which clears the marker again),
1686
+ * and the run's final result clears it unconditionally.
1687
+ */
1688
+ scannedHostCount: data.scan.scannedHostCount ?? null,
1689
+ respondedHostCount: data.scan.respondedHostCount ?? null,
1637
1690
  } as unknown as QueryDeepPartialEntity<NetworkDeviceDiscoveryScan>,
1638
1691
  });
1639
1692
  }
@@ -1653,6 +1653,28 @@ These are no longer recorded against the project and have to be cancelled by han
1653
1653
  return createdItem;
1654
1654
  }
1655
1655
 
1656
+ /*
1657
+ * NOTE ON THE TWO-TIER SCALE, and what it costs downstream.
1658
+ *
1659
+ * This seeds TWO alert severities (High 1 / Low 2) while
1660
+ * `addDefaultIncidentSeverity` immediately below seeds THREE
1661
+ * (Critical Incident 1 / Major Incident 2 / Minor Incident 3). That
1662
+ * asymmetry is load-bearing for monitor recommendations:
1663
+ * `MonitorRecommendationSeverityMapper` maps a recommendation's declared
1664
+ * `Critical` onto rank 1 and `Warning` onto rank 2, so on a default project
1665
+ * a Warning template opens a "Major Incident" but an alert whose severity
1666
+ * reads "Low" — which is how an alert email can say SEVERITY: Low for a
1667
+ * catalog card badged Warning.
1668
+ *
1669
+ * If a third alert tier is ever added here to close that gap, it CANNOT
1670
+ * ship alone. This function only seeds names a project does not already
1671
+ * have, so existing projects would keep the two-tier scale and map Warning
1672
+ * differently from new ones indefinitely. It needs a paired data migration
1673
+ * over every existing project — see
1674
+ * App/FeatureSet/Workers/DataMigrations/AddDefaultAlertSeverityAndStateToExistingProjects.ts
1675
+ * for the shape — and that migration has to decide what to do about the
1676
+ * `order` of a "Low" row a project may have reordered or renamed itself.
1677
+ */
1656
1678
  @CaptureSpan()
1657
1679
  public async addDefaultAlertSeverity(createdItem: Model): Promise<Model> {
1658
1680
  const projectId: ObjectID = createdItem.id!;
@@ -0,0 +1,73 @@
1
+ import DatabaseService, { EntityManager } from "./DatabaseService";
2
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
3
+ import UserNotificationSetting from "../../Models/DatabaseModels/UserNotificationSetting";
4
+ import { ROUTINE_EMAIL_EVENT_TYPES } from "../../Types/NotificationSetting/RoutineEmailEvents";
5
+ import ObjectID from "../../Types/ObjectID";
6
+
7
+ export class Service extends DatabaseService<UserNotificationSetting> {
8
+ public constructor() {
9
+ super(UserNotificationSetting);
10
+ }
11
+
12
+ /*
13
+ * The API authorizes the authenticated user's own settings before calling
14
+ * this method. Every statement remains scoped to that user and project.
15
+ */
16
+ @CaptureSpan()
17
+ public async reduceRoutineEmails(data: {
18
+ userId: ObjectID;
19
+ projectId: ObjectID;
20
+ }): Promise<void> {
21
+ await this.executeTransaction(async (manager: EntityManager) => {
22
+ /*
23
+ * There is no unique constraint on (user, project, event). Serializing
24
+ * preset requests also protects the missing-row insert on a double click.
25
+ */
26
+ await manager.query(
27
+ "SELECT pg_advisory_xact_lock(hashtextextended($1, 0))",
28
+ [
29
+ `routine-email-settings:${data.projectId.toString()}:${data.userId.toString()}`,
30
+ ],
31
+ );
32
+
33
+ const parameters: [string, string, ReadonlyArray<string>] = [
34
+ data.userId.toString(),
35
+ data.projectId.toString(),
36
+ ROUTINE_EMAIL_EVENT_TYPES,
37
+ ];
38
+
39
+ /*
40
+ * Update every matching row, including historical duplicates. Changing
41
+ * only email avoids overwriting another channel edited concurrently.
42
+ */
43
+ await manager.query(
44
+ `UPDATE "UserNotificationSetting"
45
+ SET "alertByEmail" = false, "updatedAt" = now(), "version" = "version" + 1
46
+ WHERE "userId" = $1 AND "projectId" = $2
47
+ AND "eventType" = ANY($3::text[])
48
+ AND "deletedAt" IS NULL AND "alertByEmail" = true`,
49
+ parameters,
50
+ );
51
+
52
+ /*
53
+ * Persist an explicit opt-out for missing events so later default
54
+ * seeding sees the user's choice. Other channels keep their false defaults.
55
+ */
56
+ await manager.query(
57
+ `INSERT INTO "UserNotificationSetting"
58
+ ("userId", "projectId", "eventType", "alertByEmail", "createdByUserId", "version")
59
+ SELECT $1::uuid, $2::uuid, event."eventType", false, $1::uuid, 1
60
+ FROM unnest($3::text[]) AS event("eventType")
61
+ WHERE NOT EXISTS (
62
+ SELECT 1 FROM "UserNotificationSetting" setting
63
+ WHERE setting."userId" = $1 AND setting."projectId" = $2
64
+ AND setting."eventType" = event."eventType"
65
+ AND setting."deletedAt" IS NULL
66
+ )`,
67
+ parameters,
68
+ );
69
+ });
70
+ }
71
+ }
72
+
73
+ export default new Service();
@@ -1,5 +1,6 @@
1
1
  import DatabaseService from "./DatabaseService";
2
2
  import Model from "../../Models/DatabaseModels/RumSessionReplayView";
3
+ import QueryHelper from "../Types/Database/QueryHelper";
3
4
  import ColumnLength from "../../Types/Database/ColumnLength";
4
5
  import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
5
6
  import ObjectID from "../../Types/ObjectID";
@@ -19,6 +20,45 @@ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
19
20
  * modelled on, the whole point of the audit is that it outlives the
20
21
  * recording it describes.
21
22
  */
23
+
24
+ /*
25
+ * The heartbeat cadence the player reports on. secondsWatched is floored
26
+ * to it so a chatty client costs at most one write per bucket, and the
27
+ * figure shown to viewers ("watched 1m 30s") never pretends to more
28
+ * precision than the heartbeat had.
29
+ */
30
+ export const SESSION_REPLAY_WATCH_BUCKET_SECONDS: number = 15;
31
+
32
+ /*
33
+ * Ceiling on one view's watched time: the longest session the recorder
34
+ * will ever produce, at the slowest speed anyone would watch it, with
35
+ * headroom for pauses. A client cannot report more than this; the audit
36
+ * figure is a privacy control shown to other viewers, and an unbounded
37
+ * number would let a buggy or hostile client render a nonsense one.
38
+ */
39
+ export const SESSION_REPLAY_MAX_SECONDS_WATCHED: number = 24 * 60 * 60;
40
+
41
+ /*
42
+ * Floor a client-reported figure to the heartbeat bucket and clamp it.
43
+ * Module-level so the route and the service agree on the one rounding
44
+ * rule without the route reaching for the class behind the instance.
45
+ */
46
+ export function normalizeSecondsWatched(secondsWatched: number): number {
47
+ if (!Number.isFinite(secondsWatched) || secondsWatched <= 0) {
48
+ return 0;
49
+ }
50
+
51
+ const clamped: number = Math.min(
52
+ secondsWatched,
53
+ SESSION_REPLAY_MAX_SECONDS_WATCHED,
54
+ );
55
+
56
+ return (
57
+ Math.floor(clamped / SESSION_REPLAY_WATCH_BUCKET_SECONDS) *
58
+ SESSION_REPLAY_WATCH_BUCKET_SECONDS
59
+ );
60
+ }
61
+
22
62
  export class Service extends DatabaseService<Model> {
23
63
  public constructor() {
24
64
  super(Model);
@@ -64,12 +104,13 @@ export class Service extends DatabaseService<Model> {
64
104
  }
65
105
 
66
106
  /*
67
- * All three come straight off an untrusted request: a header, or a
107
+ * All four come straight off an untrusted request: a header, or a
68
108
  * free-text field in the body. Truncated rather than validated because
69
109
  * failing the audit write would fail the playback it is auditing, and
70
110
  * DatabaseService.checkMaxLengthOfFields throws on anything longer
71
- * than the column. An oversized user agent must not be able to stop a
72
- * read from being recorded.
111
+ * than the column. An oversized user agent - or a fingerprint longer
112
+ * than its ShortText column - must not be able to stop a read from
113
+ * being recorded.
73
114
  */
74
115
  if (data.ipAddress) {
75
116
  item.ipAddress = data.ipAddress.substring(0, ColumnLength.ShortText);
@@ -88,7 +129,8 @@ export class Service extends DatabaseService<Model> {
88
129
  }
89
130
 
90
131
  if (data.linkedExceptionFingerprint) {
91
- item.linkedExceptionFingerprint = data.linkedExceptionFingerprint;
132
+ item.linkedExceptionFingerprint =
133
+ data.linkedExceptionFingerprint.substring(0, ColumnLength.ShortText);
92
134
  }
93
135
 
94
136
  return await this.create({
@@ -98,47 +140,85 @@ export class Service extends DatabaseService<Model> {
98
140
  }
99
141
 
100
142
  /*
101
- * Advance how much of the recording was actually watched, from the
102
- * player's throttled heartbeat.
103
- *
104
- * Monotonic on purpose: the heartbeat carries a cumulative total, and a
105
- * player that seeks backwards or reloads would otherwise walk the
106
- * recorded figure back down and make a full viewing look like a glance.
143
+ * The caller's OWN view row, or null. The heartbeat and the manifest
144
+ * refresh both need "does this viewId belong to this user, this
145
+ * project, and (for the refresh) this session" answered in one lookup,
146
+ * and both must refuse somebody else's row indistinguishably from a
147
+ * missing one: secondsWatched is a privacy control, and the refresh
148
+ * would otherwise let a caller reuse a colleague's audit row.
107
149
  */
108
150
  @CaptureSpan()
109
- public async recordSecondsWatched(data: {
151
+ public async findOwnView(data: {
110
152
  viewId: ObjectID;
111
153
  projectId: ObjectID;
112
- secondsWatched: number;
113
- }): Promise<void> {
114
- if (!Number.isFinite(data.secondsWatched) || data.secondsWatched <= 0) {
115
- return;
116
- }
117
-
118
- const existing: Model | null = await this.findOneBy({
154
+ viewedByUserId: ObjectID;
155
+ sessionId?: string | undefined;
156
+ }): Promise<Model | null> {
157
+ return await this.findOneBy({
119
158
  query: {
120
159
  _id: data.viewId.toString(),
121
160
  projectId: data.projectId,
161
+ viewedByUserId: data.viewedByUserId,
162
+ ...(data.sessionId !== undefined && { sessionId: data.sessionId }),
122
163
  },
123
164
  select: {
124
165
  _id: true,
166
+ rumApplicationId: true,
167
+ sessionId: true,
125
168
  secondsWatched: true,
126
169
  },
127
170
  props: { isRoot: true },
128
171
  });
172
+ }
173
+
174
+ /*
175
+ * Advance how much of the recording was actually watched.
176
+ *
177
+ * SEMANTICS: secondsWatched is the cumulative number of seconds of
178
+ * footage the player has PLAYED for this view - accumulated client-side
179
+ * only while playback is running, scaled by speed - not the furthest
180
+ * offset the playhead reached. Dragging the scrubber to the end of a
181
+ * recording is not watching it, and the audit figure is shown to other
182
+ * viewers as "who watched how much", so it must not over-report.
183
+ *
184
+ * Monotonic on purpose: the heartbeat carries a cumulative total, and a
185
+ * player that reloads would otherwise walk the recorded figure back
186
+ * down and make a full viewing look like a glance. The guard is in the
187
+ * UPDATE's own predicate (secondsWatched < new value) rather than in a
188
+ * read-then-write, so two heartbeats racing for the same row cannot
189
+ * regress it; a heartbeat that does not advance writes nothing.
190
+ *
191
+ * When the caller already holds the row's current figure (the route
192
+ * reads it in the same lookup that proves ownership) it passes it as
193
+ * currentSecondsWatched and a non-advancing heartbeat costs no query at
194
+ * all.
195
+ */
196
+ @CaptureSpan()
197
+ public async recordSecondsWatched(data: {
198
+ viewId: ObjectID;
199
+ projectId: ObjectID;
200
+ secondsWatched: number;
201
+ currentSecondsWatched?: number | undefined;
202
+ }): Promise<void> {
203
+ const seconds: number = normalizeSecondsWatched(data.secondsWatched);
129
204
 
130
- if (!existing) {
205
+ if (seconds <= 0) {
131
206
  return;
132
207
  }
133
208
 
134
- const seconds: number = Math.floor(data.secondsWatched);
135
-
136
- if ((existing.secondsWatched || 0) >= seconds) {
209
+ if (
210
+ data.currentSecondsWatched !== undefined &&
211
+ data.currentSecondsWatched >= seconds
212
+ ) {
137
213
  return;
138
214
  }
139
215
 
140
- await this.updateOneById({
141
- id: data.viewId,
216
+ await this.updateOneBy({
217
+ query: {
218
+ _id: data.viewId.toString(),
219
+ projectId: data.projectId,
220
+ secondsWatched: QueryHelper.lessThanOrNull(seconds),
221
+ },
142
222
  data: {
143
223
  secondsWatched: seconds,
144
224
  },
@@ -1,9 +1,107 @@
1
1
  import DatabaseService from "./DatabaseService";
2
2
  import Model from "../../Models/DatabaseModels/ScheduledMaintenanceCustomField";
3
+ import ObjectID from "../../Types/ObjectID";
4
+ import CreateBy from "../Types/Database/CreateBy";
5
+ import UpdateBy from "../Types/Database/UpdateBy";
6
+ import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
7
+ import { backfillMappedCustomFieldValues } from "../Utils/CustomField/CustomFieldDefinitionMappingHooks";
8
+ import {
9
+ validateCustomFieldMappingOnCreate,
10
+ validateCustomFieldMappingOnUpdate,
11
+ } from "../Utils/CustomField/CustomFieldMappingValidator";
12
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
3
13
 
14
+ /*
15
+ * A scheduled maintenance custom field can take its value from the same field
16
+ * on the event's monitors instead of being typed in again
17
+ * (OneUptime/oneuptime#3549). These hooks are the two halves of that
18
+ * configuration being saved: refusing a mapping that could never resolve, and
19
+ * filling in the events that already exist once one is saved.
20
+ */
4
21
  export class Service extends DatabaseService<Model> {
5
22
  public constructor() {
6
23
  super(Model);
7
24
  }
25
+
26
+ @CaptureSpan()
27
+ protected override async onBeforeCreate(
28
+ createBy: CreateBy<Model>,
29
+ ): Promise<OnCreate<Model>> {
30
+ await validateCustomFieldMappingOnCreate({
31
+ definitionModelType: Model,
32
+ createBy: createBy,
33
+ });
34
+
35
+ return { createBy, carryForward: null };
36
+ }
37
+
38
+ @CaptureSpan()
39
+ protected override async onBeforeUpdate(
40
+ updateBy: UpdateBy<Model>,
41
+ ): Promise<OnUpdate<Model>> {
42
+ await validateCustomFieldMappingOnUpdate({
43
+ definitionModelType: Model,
44
+ definitionService: this,
45
+ updateBy: updateBy,
46
+ });
47
+
48
+ return { updateBy, carryForward: null };
49
+ }
50
+
51
+ @CaptureSpan()
52
+ protected override async onCreateSuccess(
53
+ _onCreate: OnCreate<Model>,
54
+ createdItem: Model,
55
+ ): Promise<Model> {
56
+ backfillMappedCustomFieldValues({
57
+ definitionModelType: Model,
58
+ projectId: createdItem.projectId,
59
+ definitionName: "scheduled maintenance custom field",
60
+ });
61
+
62
+ return createdItem;
63
+ }
64
+
65
+ @CaptureSpan()
66
+ protected override async onUpdateSuccess(
67
+ onUpdate: OnUpdate<Model>,
68
+ updatedItemIds: Array<ObjectID>,
69
+ ): Promise<OnUpdate<Model>> {
70
+ if (updatedItemIds.length > 0) {
71
+ backfillMappedCustomFieldValues({
72
+ definitionModelType: Model,
73
+ projectId: await this.getProjectIdForBackfill(onUpdate, updatedItemIds),
74
+ definitionName: "scheduled maintenance custom field",
75
+ });
76
+ }
77
+
78
+ return onUpdate;
79
+ }
80
+
81
+ /*
82
+ * `props.tenantId` is set on every dashboard write but not on internal
83
+ * root-scoped ones, so fall back to the row itself rather than skipping the
84
+ * backfill for a mapping that was changed by a script.
85
+ */
86
+ private async getProjectIdForBackfill(
87
+ onUpdate: OnUpdate<Model>,
88
+ updatedItemIds: Array<ObjectID>,
89
+ ): Promise<ObjectID | undefined> {
90
+ const tenantId: ObjectID | undefined = onUpdate.updateBy.props.tenantId as
91
+ | ObjectID
92
+ | undefined;
93
+
94
+ if (tenantId) {
95
+ return tenantId;
96
+ }
97
+
98
+ const item: Model | null = await this.findOneById({
99
+ id: updatedItemIds[0]!,
100
+ select: { projectId: true },
101
+ props: { isRoot: true },
102
+ });
103
+
104
+ return item?.projectId;
105
+ }
8
106
  }
9
107
  export default new Service();
@@ -6,6 +6,8 @@ import CreateBy from "../Types/Database/CreateBy";
6
6
  import DeleteBy from "../Types/Database/DeleteBy";
7
7
  import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
8
8
  import DatabaseService from "./DatabaseService";
9
+ import ScheduledMaintenanceCustomField from "../../Models/DatabaseModels/ScheduledMaintenanceCustomField";
10
+ import CustomFieldMappingService from "./CustomFieldMappingService";
9
11
  import MonitorService from "./MonitorService";
10
12
  import ScheduledMaintenanceOwnerTeamService from "./ScheduledMaintenanceOwnerTeamService";
11
13
  import ScheduledMaintenanceOwnerUserService from "./ScheduledMaintenanceOwnerUserService";
@@ -609,6 +611,17 @@ ${resourcesAffected ? `**Resources Affected:** ${resourcesAffected}` : ""}
609
611
 
610
612
  await this.validateProjectScopedReferences(updateBy);
611
613
 
614
+ /*
615
+ * Re-apply mapped custom field values. Covers the Custom Fields modal
616
+ * saving the whole bag back over a mapped value, and the event's monitors
617
+ * changing — both change what a mapped field should hold, and folding the
618
+ * answer into this payload keeps it one write with a truthful audit entry.
619
+ */
620
+ await CustomFieldMappingService.applyMappingsToUpdate({
621
+ definitionModelType: ScheduledMaintenanceCustomField,
622
+ updateBy: updateBy,
623
+ });
624
+
612
625
  return {
613
626
  updateBy,
614
627
  carryForward: null,
@@ -937,6 +950,19 @@ ${resourcesAffected ? `**Resources Affected:** ${resourcesAffected}` : ""}
937
950
  StatusPageSubscriberNotificationStatus.Pending;
938
951
  }
939
952
 
953
+ /*
954
+ * Custom fields configured to inherit from the event's monitors are
955
+ * stamped here rather than in onCreateSuccess: `customFields` is a column
956
+ * on this row and the onCreateSuccess chain is un-awaited, so a value
957
+ * written there would be missing from the event the caller gets back.
958
+ * Written not to throw — a field failing to inherit must not stop an event
959
+ * from being scheduled.
960
+ */
961
+ await CustomFieldMappingService.applyMappingsToCreate({
962
+ definitionModelType: ScheduledMaintenanceCustomField,
963
+ createBy: createBy,
964
+ });
965
+
940
966
  return { createBy, carryForward: null };
941
967
  }
942
968
 
@@ -1562,6 +1588,12 @@ ${scheduledMaintenance.description || "No description provided."}
1562
1588
  onUpdate: OnUpdate<Model>,
1563
1589
  updatedItemIds: ObjectID[],
1564
1590
  ): Promise<OnUpdate<Model>> {
1591
+ CustomFieldMappingService.restampAfterMultiRowUpdate({
1592
+ definitionModelType: ScheduledMaintenanceCustomField,
1593
+ updateBy: onUpdate.updateBy,
1594
+ updatedItemIds: updatedItemIds,
1595
+ });
1596
+
1565
1597
  /*
1566
1598
  * Rescheduling the planned window is the whole point of making these
1567
1599
  * fields editable, so the numbers derived from them have to move. Without