@oneuptime/common 13.0.1 → 13.0.4

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 (781) hide show
  1. package/Models/AnalyticsModels/RumSession.ts +34 -0
  2. package/Models/DatabaseModels/AlertEpisodeLabelRule.ts +2 -2
  3. package/Models/DatabaseModels/AlertEpisodeOnCallRule.ts +2 -2
  4. package/Models/DatabaseModels/AlertEpisodeOwnerRule.ts +2 -2
  5. package/Models/DatabaseModels/AlertEpisodePrivacyRule.ts +2 -2
  6. package/Models/DatabaseModels/AlertGroupingRule.ts +2 -2
  7. package/Models/DatabaseModels/AlertLabelRule.ts +2 -2
  8. package/Models/DatabaseModels/AlertOnCallRule.ts +2 -2
  9. package/Models/DatabaseModels/AlertOwnerRule.ts +2 -2
  10. package/Models/DatabaseModels/AlertPrivacyRule.ts +2 -2
  11. package/Models/DatabaseModels/AlertReminderRule.ts +6 -4
  12. package/Models/DatabaseModels/AutoRemediationRule.ts +2 -2
  13. package/Models/DatabaseModels/CephClusterLabelRule.ts +2 -2
  14. package/Models/DatabaseModels/CephClusterOwnerRule.ts +2 -2
  15. package/Models/DatabaseModels/CloudResourceLabelRule.ts +2 -2
  16. package/Models/DatabaseModels/CloudResourceOwnerRule.ts +2 -2
  17. package/Models/DatabaseModels/DashboardLabelRule.ts +2 -2
  18. package/Models/DatabaseModels/DashboardOwnerRule.ts +2 -2
  19. package/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.ts +11 -0
  20. package/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.ts +44 -0
  21. package/Models/DatabaseModels/DockerHostLabelRule.ts +2 -2
  22. package/Models/DatabaseModels/DockerHostOwnerRule.ts +2 -2
  23. package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +2 -2
  24. package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +2 -2
  25. package/Models/DatabaseModels/HostLabelRule.ts +2 -2
  26. package/Models/DatabaseModels/HostOwnerRule.ts +2 -2
  27. package/Models/DatabaseModels/IncidentEpisodeLabelRule.ts +2 -2
  28. package/Models/DatabaseModels/IncidentEpisodeOnCallRule.ts +2 -2
  29. package/Models/DatabaseModels/IncidentEpisodeOwnerRule.ts +2 -2
  30. package/Models/DatabaseModels/IncidentEpisodePrivacyRule.ts +2 -2
  31. package/Models/DatabaseModels/IncidentGroupingRule.ts +2 -2
  32. package/Models/DatabaseModels/IncidentLabelRule.ts +2 -2
  33. package/Models/DatabaseModels/IncidentOnCallRule.ts +2 -2
  34. package/Models/DatabaseModels/IncidentOwnerRule.ts +2 -2
  35. package/Models/DatabaseModels/IncidentPrivacyRule.ts +2 -2
  36. package/Models/DatabaseModels/IncidentReminderRule.ts +6 -4
  37. package/Models/DatabaseModels/IncidentSlaRule.ts +2 -2
  38. package/Models/DatabaseModels/IncomingCallPolicy.ts +3 -4
  39. package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +2 -2
  40. package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +2 -2
  41. package/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.ts +254 -0
  42. package/Models/DatabaseModels/Index.ts +2 -0
  43. package/Models/DatabaseModels/IoTFleetLabelRule.ts +2 -2
  44. package/Models/DatabaseModels/IoTFleetOwnerRule.ts +2 -2
  45. package/Models/DatabaseModels/KubernetesClusterLabelRule.ts +2 -2
  46. package/Models/DatabaseModels/KubernetesClusterOwnerRule.ts +2 -2
  47. package/Models/DatabaseModels/MonitorLabelRule.ts +2 -2
  48. package/Models/DatabaseModels/MonitorOwnerRule.ts +2 -2
  49. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +2 -2
  50. package/Models/DatabaseModels/NetworkDeviceLabelRule.ts +2 -2
  51. package/Models/DatabaseModels/NetworkDeviceOwnerRule.ts +2 -2
  52. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +2 -2
  53. package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +2 -2
  54. package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +2 -2
  55. package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +2 -2
  56. package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +2 -2
  57. package/Models/DatabaseModels/PodmanHostLabelRule.ts +2 -2
  58. package/Models/DatabaseModels/PodmanHostOwnerRule.ts +2 -2
  59. package/Models/DatabaseModels/ProxmoxClusterLabelRule.ts +2 -2
  60. package/Models/DatabaseModels/ProxmoxClusterOwnerRule.ts +2 -2
  61. package/Models/DatabaseModels/RumApplicationLabelRule.ts +2 -2
  62. package/Models/DatabaseModels/RumApplicationOwnerRule.ts +2 -2
  63. package/Models/DatabaseModels/RunbookLabelRule.ts +2 -2
  64. package/Models/DatabaseModels/RunbookOwnerRule.ts +2 -2
  65. package/Models/DatabaseModels/RunbookRule.ts +2 -2
  66. package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +2 -2
  67. package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +2 -2
  68. package/Models/DatabaseModels/ScheduledMaintenanceReminderRule.ts +6 -4
  69. package/Models/DatabaseModels/ServerlessFunctionLabelRule.ts +2 -2
  70. package/Models/DatabaseModels/ServerlessFunctionOwnerRule.ts +2 -2
  71. package/Models/DatabaseModels/ServiceLabelRule.ts +2 -2
  72. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +283 -4
  73. package/Models/DatabaseModels/ServiceOwnerRule.ts +2 -2
  74. package/Models/DatabaseModels/StatusPageLabelRule.ts +2 -2
  75. package/Models/DatabaseModels/StatusPageMonitorRule.ts +2 -2
  76. package/Models/DatabaseModels/StatusPageOwnerRule.ts +2 -2
  77. package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +2 -2
  78. package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +2 -2
  79. package/Models/DatabaseModels/WorkflowLabelRule.ts +2 -2
  80. package/Models/DatabaseModels/WorkflowOwnerRule.ts +2 -2
  81. package/Server/API/TelemetryAPI.ts +323 -2
  82. package/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.ts +111 -0
  83. package/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.ts +644 -0
  84. package/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.ts +72 -0
  85. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  86. package/Server/Middleware/MultipartFormData.ts +46 -21
  87. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +21 -0
  88. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +21 -0
  89. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +21 -0
  90. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +21 -0
  91. package/Server/Services/AlertGroupingEngineService.ts +27 -0
  92. package/Server/Services/AlertLabelRuleEngineService.ts +27 -0
  93. package/Server/Services/AlertOnCallRuleEngineService.ts +27 -0
  94. package/Server/Services/AlertOwnerRuleEngineService.ts +27 -0
  95. package/Server/Services/AlertPrivacyRuleEngineService.ts +27 -0
  96. package/Server/Services/AlertReminderRuleService.ts +65 -33
  97. package/Server/Services/AutoRemediationRuleEngineService.ts +90 -8
  98. package/Server/Services/CephClusterLabelRuleEngineService.ts +20 -0
  99. package/Server/Services/CephClusterOwnerRuleEngineService.ts +20 -0
  100. package/Server/Services/CloudResourceLabelRuleEngineService.ts +20 -0
  101. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +20 -0
  102. package/Server/Services/DashboardLabelRuleEngineService.ts +20 -0
  103. package/Server/Services/DashboardOwnerRuleEngineService.ts +20 -0
  104. package/Server/Services/DatabaseService.ts +409 -6
  105. package/Server/Services/DockerHostLabelRuleEngineService.ts +20 -0
  106. package/Server/Services/DockerHostOwnerRuleEngineService.ts +20 -0
  107. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +23 -0
  108. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +23 -0
  109. package/Server/Services/HostLabelRuleEngineService.ts +13 -0
  110. package/Server/Services/HostOwnerRuleEngineService.ts +13 -0
  111. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +21 -0
  112. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +21 -0
  113. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +21 -0
  114. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +21 -0
  115. package/Server/Services/IncidentGroupingEngineService.ts +64 -13
  116. package/Server/Services/IncidentLabelRuleEngineService.ts +64 -9
  117. package/Server/Services/IncidentOnCallRuleEngineService.ts +64 -10
  118. package/Server/Services/IncidentOwnerRuleEngineService.ts +64 -10
  119. package/Server/Services/IncidentPrivacyRuleEngineService.ts +64 -10
  120. package/Server/Services/IncidentReminderRuleService.ts +66 -34
  121. package/Server/Services/IncidentSlaRuleService.ts +55 -12
  122. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +20 -0
  123. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +20 -0
  124. package/Server/Services/IncomingCallPolicyPhoneNumberService.ts +184 -0
  125. package/Server/Services/IncomingCallPolicyService.ts +276 -5
  126. package/Server/Services/Index.ts +2 -0
  127. package/Server/Services/IoTFleetLabelRuleEngineService.ts +20 -0
  128. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +20 -0
  129. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +23 -0
  130. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +23 -0
  131. package/Server/Services/LabelService.ts +50 -7
  132. package/Server/Services/MonitorLabelRuleEngineService.ts +20 -0
  133. package/Server/Services/MonitorOwnerRuleEngineService.ts +20 -0
  134. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +2 -0
  135. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +93 -1
  136. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +26 -0
  137. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +25 -0
  138. package/Server/Services/NetworkDeviceService.ts +2 -0
  139. package/Server/Services/NetworkSiteAssignmentRuleService.ts +90 -1
  140. package/Server/Services/NetworkSiteService.ts +242 -29
  141. package/Server/Services/NetworkSiteTypeService.ts +177 -77
  142. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +20 -0
  143. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +20 -0
  144. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +22 -0
  145. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +22 -0
  146. package/Server/Services/PodmanHostLabelRuleEngineService.ts +20 -0
  147. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +20 -0
  148. package/Server/Services/ProjectCallSMSConfigService.ts +156 -7
  149. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +25 -0
  150. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +25 -0
  151. package/Server/Services/RumApplicationLabelRuleEngineService.ts +22 -0
  152. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +22 -0
  153. package/Server/Services/RunbookLabelRuleEngineService.ts +20 -0
  154. package/Server/Services/RunbookOwnerRuleEngineService.ts +20 -0
  155. package/Server/Services/RunbookRuleEngineService.ts +18 -1
  156. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +62 -10
  157. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +62 -11
  158. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +48 -18
  159. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +25 -0
  160. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +25 -0
  161. package/Server/Services/ServiceLabelRuleEngineService.ts +20 -0
  162. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +675 -12
  163. package/Server/Services/ServiceLevelObjectiveService.ts +55 -13
  164. package/Server/Services/ServiceOwnerRuleEngineService.ts +20 -0
  165. package/Server/Services/StatusPageLabelRuleEngineService.ts +20 -0
  166. package/Server/Services/StatusPageMonitorRuleEngineService.ts +31 -2
  167. package/Server/Services/StatusPageMonitorRuleService.ts +34 -1
  168. package/Server/Services/StatusPageOwnerRuleEngineService.ts +20 -0
  169. package/Server/Services/UserService.ts +23 -50
  170. package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +25 -0
  171. package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +25 -0
  172. package/Server/Services/WorkflowLabelRuleEngineService.ts +20 -0
  173. package/Server/Services/WorkflowOwnerRuleEngineService.ts +20 -0
  174. package/Server/Static/Brand/README.md +10 -5
  175. package/Server/Static/Brand/favicons/oneuptime-up-v1.svg +8 -0
  176. package/Server/Types/Database/QueryHelper.ts +88 -0
  177. package/Server/Utils/AI/Toolbox/SloTools.ts +19 -2
  178. package/Server/Utils/IncomingCallPhoneNumber.ts +29 -16
  179. package/Server/Utils/Profiling.ts +13 -1
  180. package/Server/Utils/Rules/MonitorRuleCriteriaCache.ts +38 -0
  181. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +498 -0
  182. package/Server/Utils/Telemetry.ts +3 -1
  183. package/Server/Utils/VendorAssets.ts +3 -0
  184. package/Tests/App/Dashboard/AIInsightViewTriage.test.tsx +348 -0
  185. package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +476 -0
  186. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +25 -0
  187. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +449 -24
  188. package/Tests/App/Dashboard/DashboardPersistentSideMenuLayouts.test.tsx +702 -0
  189. package/Tests/App/Dashboard/ExceptionsLandingRedirect.test.tsx +63 -0
  190. package/Tests/App/Dashboard/FeedOrdering.test.ts +150 -0
  191. package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +279 -100
  192. package/Tests/App/Dashboard/InventoryItemSideMenu.test.tsx +155 -0
  193. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +11 -0
  194. package/Tests/App/Dashboard/PasskeySettings.test.tsx +215 -71
  195. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +347 -0
  196. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +263 -0
  197. package/Tests/App/Dashboard/ResourceFeed.test.tsx +413 -17
  198. package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +138 -0
  199. package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +940 -0
  200. package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +378 -0
  201. package/Tests/App/Dashboard/TelemetryIngestionKeyForm.test.tsx +735 -0
  202. package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +275 -108
  203. package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +13 -3
  204. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +127 -4
  205. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -4
  206. package/Tests/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.test.ts +362 -0
  207. package/Tests/Models/DatabaseModels/RuleBaseModel.test.ts +69 -0
  208. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +181 -0
  209. package/Tests/Server/API/SessionReplayAPI.test.ts +1303 -145
  210. package/Tests/Server/API/UserTwoFactorSelfService.test.ts +407 -0
  211. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +611 -0
  212. package/Tests/Server/Middleware/MultipartFormData.test.ts +61 -3
  213. package/Tests/Server/Middleware/TelemetryIngestionDisabled.test.ts +211 -0
  214. package/Tests/Server/Services/AlertIncidentRuleCriteriaEngineServices.test.ts +651 -0
  215. package/Tests/Server/Services/AutoRemediationRuleEngineService.test.ts +79 -0
  216. package/Tests/Server/Services/DatabaseServiceRelationOnlyRuleRollout.test.ts +330 -0
  217. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +522 -0
  218. package/Tests/Server/Services/IncidentSlaRuleCriteriaCorrelation.test.ts +99 -0
  219. package/Tests/Server/Services/IncomingCallPolicyPhoneNumberService.test.ts +1540 -0
  220. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +179 -2
  221. package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +170 -0
  222. package/Tests/Server/Services/NetworkSiteService.test.ts +559 -53
  223. package/Tests/Server/Services/NetworkSiteTypeService.test.ts +122 -55
  224. package/Tests/Server/Services/ReminderRuleCriteria.test.ts +173 -0
  225. package/Tests/Server/Services/ResourceRuleCriteriaEngineServices.test.ts +170 -0
  226. package/Tests/Server/Services/ScheduledMaintenanceRuleCriteriaCorrelation.test.ts +154 -0
  227. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +2450 -470
  228. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +464 -121
  229. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +281 -0
  230. package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +132 -0
  231. package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +159 -14
  232. package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +6 -8
  233. package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +203 -34
  234. package/Tests/Server/Types/Database/QueryHelperJsonArrayObjects.test.ts +128 -0
  235. package/Tests/Server/Utils/AI/SloTools.test.ts +190 -1
  236. package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +461 -0
  237. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +25 -0
  238. package/Tests/Server/Utils/Billing/BillingFailureNoticeThrottle.test.ts +359 -0
  239. package/Tests/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.test.ts +318 -0
  240. package/Tests/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.test.ts +220 -0
  241. package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +1043 -0
  242. package/Tests/Server/Utils/Execute.test.ts +302 -0
  243. package/Tests/Server/Utils/GracefulShutdown.test.ts +565 -0
  244. package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +36 -20
  245. package/Tests/Server/Utils/LoggerCore.test.ts +597 -0
  246. package/Tests/Server/Utils/Monitor/MonitorTemplateUtil.test.ts +1109 -0
  247. package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +750 -0
  248. package/Tests/Server/Utils/ProductAnalytics.test.ts +404 -0
  249. package/Tests/Server/Utils/Profiling.test.ts +366 -0
  250. package/Tests/Server/Utils/Rules/MonitorRuleCriteriaCache.test.ts +99 -0
  251. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +558 -0
  252. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +711 -0
  253. package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +522 -0
  254. package/Tests/Server/Utils/VendorAssets.test.ts +17 -0
  255. package/Tests/Types/Dashboard/DashboardTemplateEditorialInvariants.test.ts +659 -0
  256. package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +97 -0
  257. package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +1179 -0
  258. package/Tests/Types/Database/AccessControl/OwnedThrough.test.ts +136 -0
  259. package/Tests/Types/OnCallDutyPolicy/LayerUtilCorePaths.test.ts +1014 -0
  260. package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveRotation.test.ts +9 -6
  261. package/Tests/Types/Rules/RuleCriteriaFieldRegistry.test.ts +276 -0
  262. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +180 -1
  263. package/Tests/Types/Telemetry/LlmConventions.test.ts +495 -0
  264. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +13 -6
  265. package/Tests/UI/Components/Alert.test.tsx +532 -93
  266. package/Tests/UI/Components/Feed.test.tsx +241 -0
  267. package/Tests/UI/Components/Forms/BasicFormStepNavigation.test.tsx +368 -0
  268. package/Tests/UI/Components/Forms/FormSummary.test.tsx +454 -0
  269. package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +290 -0
  270. package/Tests/UI/Components/Forms/ModelFormRuleCriteria.test.tsx +331 -0
  271. package/Tests/UI/Components/IconOpticalSize.test.tsx +79 -31
  272. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +6 -6
  273. package/Tests/UI/Components/NavBar.test.tsx +91 -2
  274. package/Tests/UI/Components/PencilButton.test.tsx +211 -0
  275. package/Tests/UI/Components/RuleCriteria/RuleCriteriaBuilder.test.tsx +510 -0
  276. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +350 -0
  277. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +50 -0
  278. package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +329 -0
  279. package/Tests/UI/Components/useFeedItems.test.tsx +107 -0
  280. package/Tests/UI/Rum/ChunkLoader.test.ts +401 -0
  281. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +1 -1
  282. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +7 -1
  283. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +2 -0
  284. package/Tests/UI/Rum/ReplayEngine.test.ts +1069 -5
  285. package/Tests/UI/Rum/ReplayHeader.test.tsx +579 -2
  286. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +23 -5
  287. package/Tests/UI/Rum/ReplayRail.test.tsx +143 -1
  288. package/Tests/UI/Rum/ReplayRenderBudget.test.tsx +338 -0
  289. package/Tests/UI/Rum/ReplaySignals.test.ts +179 -0
  290. package/Tests/UI/Rum/ReplayStage.test.tsx +210 -3
  291. package/Tests/UI/Rum/ReplayTimeline.test.tsx +180 -1
  292. package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +405 -0
  293. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +13 -16
  294. package/Tests/UI/Rum/SessionReplayFacets.test.tsx +199 -0
  295. package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +58 -21
  296. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +2 -0
  297. package/Tests/UI/Rum/SessionReplayTable.test.tsx +717 -4
  298. package/Tests/UI/Rum/SessionReplayUsersPage.test.tsx +435 -0
  299. package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +577 -0
  300. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +1 -1
  301. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -1
  302. package/Tests/UI/Utils/LabelRuleImportExport.test.ts +192 -0
  303. package/Tests/UI/Utils/Navigation.test.ts +30 -0
  304. package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +880 -0
  305. package/Tests/Utils/LabelRuleImportExport.test.ts +158 -0
  306. package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +93 -0
  307. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +138 -0
  308. package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +174 -0
  309. package/Tests/Utils/Rules/RuleCriteriaMatcher.test.ts +1424 -0
  310. package/Tests/Utils/Rum/SessionIdentity.test.ts +72 -0
  311. package/Tests/Utils/Rum/SessionReplayHealth.test.ts +884 -0
  312. package/Tests/Utils/Slo/SloBurnRateRuleState.test.ts +374 -28
  313. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +118 -0
  314. package/Types/Dashboard/DashboardTemplates.ts +465 -0
  315. package/Types/OnCallDutyPolicy/Layer.ts +12 -0
  316. package/Types/Rules/RuleCriteria.ts +51 -0
  317. package/Types/Rules/RuleCriteriaFieldRegistry.ts +449 -0
  318. package/Types/Rum/SessionReplay.ts +75 -0
  319. package/Types/Rum/SessionReplayApi.ts +93 -0
  320. package/UI/Components/Alerts/Alert.tsx +102 -72
  321. package/UI/Components/Button/Button.tsx +4 -1
  322. package/UI/Components/Dropdown/Dropdown.tsx +2 -0
  323. package/UI/Components/Feed/Feed.tsx +15 -0
  324. package/UI/Components/Feed/useFeedItems.ts +227 -0
  325. package/UI/Components/Forms/BasicForm.tsx +42 -21
  326. package/UI/Components/Forms/ModelForm.tsx +80 -1
  327. package/UI/Components/Icon/Icon.tsx +3 -35
  328. package/UI/Components/ModelTable/ModelTable.tsx +19 -0
  329. package/UI/Components/Navbar/NavBar.tsx +1 -0
  330. package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +735 -0
  331. package/UI/Components/RuleCriteria/RuleCriteriaModelForm.tsx +209 -0
  332. package/UI/Components/RuleCriteria/RuleCriteriaModelTable.tsx +205 -0
  333. package/UI/Components/RuleCriteria/RuleCriteriaSummary.tsx +123 -0
  334. package/UI/Components/Table/Table.tsx +3 -0
  335. package/UI/Components/Table/TableBody.tsx +3 -0
  336. package/UI/Components/Table/TableRow.tsx +8 -2
  337. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +14 -2
  338. package/UI/Styles/Theme.css +1 -0
  339. package/UI/Utils/LabelRuleImportExport.ts +114 -6
  340. package/UI/Utils/Navigation.ts +1 -2
  341. package/UI/esbuild-config.js +46 -0
  342. package/Utils/Faker.ts +93 -6
  343. package/Utils/LabelRuleImportExport.ts +295 -2
  344. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +108 -8
  345. package/Utils/NetworkSite/CidrMatchUtil.ts +102 -0
  346. package/Utils/NetworkSite/TypeHierarchyUtil.ts +152 -2
  347. package/Utils/Rules/RuleCriteriaMatcher.ts +931 -0
  348. package/Utils/Rum/SessionIdentity.ts +16 -0
  349. package/Utils/Slo/SloBurnRateRuleState.ts +87 -33
  350. package/Utils/Telemetry/OriginAllowList.ts +74 -0
  351. package/build/dist/Models/AnalyticsModels/RumSession.js +32 -0
  352. package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
  353. package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js +2 -2
  354. package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js.map +1 -1
  355. package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js +2 -2
  356. package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js +2 -2
  358. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js +2 -2
  360. package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +2 -2
  362. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/AlertLabelRule.js +2 -2
  364. package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/AlertOnCallRule.js +2 -2
  366. package/build/dist/Models/DatabaseModels/AlertOnCallRule.js.map +1 -1
  367. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +2 -2
  368. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
  369. package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js +2 -2
  370. package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js.map +1 -1
  371. package/build/dist/Models/DatabaseModels/AlertReminderRule.js +6 -5
  372. package/build/dist/Models/DatabaseModels/AlertReminderRule.js.map +1 -1
  373. package/build/dist/Models/DatabaseModels/AutoRemediationRule.js +2 -2
  374. package/build/dist/Models/DatabaseModels/AutoRemediationRule.js.map +1 -1
  375. package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js +2 -2
  376. package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js.map +1 -1
  377. package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js +2 -2
  378. package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js.map +1 -1
  379. package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js +2 -2
  380. package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js.map +1 -1
  381. package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js +2 -2
  382. package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js.map +1 -1
  383. package/build/dist/Models/DatabaseModels/DashboardLabelRule.js +2 -2
  384. package/build/dist/Models/DatabaseModels/DashboardLabelRule.js.map +1 -1
  385. package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js +2 -2
  386. package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js.map +1 -1
  387. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js +12 -0
  388. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js.map +1 -0
  389. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js +50 -0
  390. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js.map +1 -0
  391. package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js +2 -2
  392. package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js.map +1 -1
  393. package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js +2 -2
  394. package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js.map +1 -1
  395. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +2 -2
  396. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -1
  397. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +2 -2
  398. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -1
  399. package/build/dist/Models/DatabaseModels/HostLabelRule.js +2 -2
  400. package/build/dist/Models/DatabaseModels/HostLabelRule.js.map +1 -1
  401. package/build/dist/Models/DatabaseModels/HostOwnerRule.js +2 -2
  402. package/build/dist/Models/DatabaseModels/HostOwnerRule.js.map +1 -1
  403. package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js +2 -2
  404. package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js.map +1 -1
  405. package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js +2 -2
  406. package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js.map +1 -1
  407. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js +2 -2
  408. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js.map +1 -1
  409. package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js +2 -2
  410. package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js.map +1 -1
  411. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +2 -2
  412. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
  413. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +2 -2
  414. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
  415. package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js +2 -2
  416. package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js.map +1 -1
  417. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +2 -2
  418. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
  419. package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js +2 -2
  420. package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js.map +1 -1
  421. package/build/dist/Models/DatabaseModels/IncidentReminderRule.js +6 -5
  422. package/build/dist/Models/DatabaseModels/IncidentReminderRule.js.map +1 -1
  423. package/build/dist/Models/DatabaseModels/IncidentSlaRule.js +2 -2
  424. package/build/dist/Models/DatabaseModels/IncidentSlaRule.js.map +1 -1
  425. package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js +3 -4
  426. package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js.map +1 -1
  427. package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +2 -2
  428. package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
  429. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +2 -2
  430. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
  431. package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js +277 -0
  432. package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js.map +1 -0
  433. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  434. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  435. package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js +2 -2
  436. package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js.map +1 -1
  437. package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js +2 -2
  438. package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js.map +1 -1
  439. package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js +2 -2
  440. package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js.map +1 -1
  441. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js +2 -2
  442. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js.map +1 -1
  443. package/build/dist/Models/DatabaseModels/MonitorLabelRule.js +2 -2
  444. package/build/dist/Models/DatabaseModels/MonitorLabelRule.js.map +1 -1
  445. package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js +2 -2
  446. package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js.map +1 -1
  447. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +2 -2
  448. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  449. package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js +2 -2
  450. package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js.map +1 -1
  451. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js +2 -2
  452. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js.map +1 -1
  453. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +2 -2
  454. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
  455. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +2 -2
  456. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
  457. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +2 -2
  458. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
  459. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +2 -2
  460. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
  461. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +2 -2
  462. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
  463. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +2 -2
  464. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -1
  465. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +2 -2
  466. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -1
  467. package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js +2 -2
  468. package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js.map +1 -1
  469. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js +2 -2
  470. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js.map +1 -1
  471. package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js +2 -2
  472. package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js.map +1 -1
  473. package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js +2 -2
  474. package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js.map +1 -1
  475. package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +2 -2
  476. package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
  477. package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +2 -2
  478. package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
  479. package/build/dist/Models/DatabaseModels/RunbookRule.js +2 -2
  480. package/build/dist/Models/DatabaseModels/RunbookRule.js.map +1 -1
  481. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +2 -2
  482. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
  483. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +2 -2
  484. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
  485. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js +6 -5
  486. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js.map +1 -1
  487. package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js +2 -2
  488. package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js.map +1 -1
  489. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js +2 -2
  490. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js.map +1 -1
  491. package/build/dist/Models/DatabaseModels/ServiceLabelRule.js +2 -2
  492. package/build/dist/Models/DatabaseModels/ServiceLabelRule.js.map +1 -1
  493. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +281 -4
  494. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
  495. package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js +2 -2
  496. package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js.map +1 -1
  497. package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +2 -2
  498. package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
  499. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +2 -2
  500. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -1
  501. package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +2 -2
  502. package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
  503. package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +2 -2
  504. package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -1
  505. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +2 -2
  506. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -1
  507. package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +2 -2
  508. package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
  509. package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +2 -2
  510. package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
  511. package/build/dist/Server/API/TelemetryAPI.js +211 -4
  512. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  513. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js +60 -0
  514. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js.map +1 -0
  515. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js +301 -0
  516. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js.map +1 -0
  517. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js +30 -0
  518. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js.map +1 -0
  519. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  520. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  521. package/build/dist/Server/Middleware/MultipartFormData.js +38 -21
  522. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  523. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +17 -0
  524. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  525. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +17 -0
  526. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  527. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +17 -0
  528. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  529. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +17 -0
  530. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  531. package/build/dist/Server/Services/AlertGroupingEngineService.js +21 -0
  532. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  533. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +21 -0
  534. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  535. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +21 -0
  536. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  537. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +21 -0
  538. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  539. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +21 -0
  540. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  541. package/build/dist/Server/Services/AlertReminderRuleService.js +44 -26
  542. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  543. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +54 -11
  544. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  545. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +16 -0
  546. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  547. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +16 -0
  548. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  549. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +16 -0
  550. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  551. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +16 -0
  552. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  553. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +16 -0
  554. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  555. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +16 -0
  556. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  557. package/build/dist/Server/Services/DatabaseService.js +235 -10
  558. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  559. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +16 -0
  560. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  561. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +16 -0
  562. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  563. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +16 -0
  564. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  565. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +16 -0
  566. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  567. package/build/dist/Server/Services/HostLabelRuleEngineService.js +12 -0
  568. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  569. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +12 -0
  570. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  571. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +17 -0
  572. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  573. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +17 -0
  574. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  575. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +17 -0
  576. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  577. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +17 -0
  578. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  579. package/build/dist/Server/Services/IncidentGroupingEngineService.js +39 -13
  580. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  581. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +39 -9
  582. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  583. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +39 -10
  584. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  585. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +39 -10
  586. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  587. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +39 -10
  588. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  589. package/build/dist/Server/Services/IncidentReminderRuleService.js +44 -26
  590. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  591. package/build/dist/Server/Services/IncidentSlaRuleService.js +33 -12
  592. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  593. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +16 -0
  594. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  595. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +16 -0
  596. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  597. package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js +127 -0
  598. package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js.map +1 -0
  599. package/build/dist/Server/Services/IncomingCallPolicyService.js +187 -4
  600. package/build/dist/Server/Services/IncomingCallPolicyService.js.map +1 -1
  601. package/build/dist/Server/Services/Index.js +2 -0
  602. package/build/dist/Server/Services/Index.js.map +1 -1
  603. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +16 -0
  604. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  605. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +16 -0
  606. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  607. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +16 -0
  608. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  609. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +16 -0
  610. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  611. package/build/dist/Server/Services/LabelService.js +39 -7
  612. package/build/dist/Server/Services/LabelService.js.map +1 -1
  613. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +16 -0
  614. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  615. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +16 -0
  616. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  617. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +2 -0
  618. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  619. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +57 -1
  620. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  621. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +17 -0
  622. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  623. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +16 -0
  624. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  625. package/build/dist/Server/Services/NetworkDeviceService.js +2 -0
  626. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  627. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +56 -1
  628. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -1
  629. package/build/dist/Server/Services/NetworkSiteService.js +187 -22
  630. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  631. package/build/dist/Server/Services/NetworkSiteTypeService.js +126 -51
  632. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
  633. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +16 -0
  634. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  635. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +16 -0
  636. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  637. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +16 -0
  638. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  639. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +16 -0
  640. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  641. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +16 -0
  642. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  643. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +16 -0
  644. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  645. package/build/dist/Server/Services/ProjectCallSMSConfigService.js +115 -6
  646. package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
  647. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +16 -0
  648. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  649. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +16 -0
  650. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  651. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +16 -0
  652. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  653. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +16 -0
  654. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  655. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +16 -0
  656. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  657. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +16 -0
  658. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  659. package/build/dist/Server/Services/RunbookRuleEngineService.js +12 -0
  660. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  661. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +38 -9
  662. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  663. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +38 -10
  664. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  665. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +32 -14
  666. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  667. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +16 -0
  668. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  669. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +16 -0
  670. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  671. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +16 -0
  672. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  673. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +554 -12
  674. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
  675. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +50 -14
  676. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  677. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +16 -0
  678. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  679. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +16 -0
  680. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  681. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +25 -2
  682. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  683. package/build/dist/Server/Services/StatusPageMonitorRuleService.js +19 -1
  684. package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -1
  685. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +16 -0
  686. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  687. package/build/dist/Server/Services/UserService.js +14 -49
  688. package/build/dist/Server/Services/UserService.js.map +1 -1
  689. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +16 -0
  690. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
  691. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +16 -0
  692. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
  693. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +16 -0
  694. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  695. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +16 -0
  696. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  697. package/build/dist/Server/Types/Database/QueryHelper.js +67 -0
  698. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  699. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +21 -4
  700. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  701. package/build/dist/Server/Utils/IncomingCallPhoneNumber.js +9 -3
  702. package/build/dist/Server/Utils/IncomingCallPhoneNumber.js.map +1 -1
  703. package/build/dist/Server/Utils/Profiling.js +10 -1
  704. package/build/dist/Server/Utils/Profiling.js.map +1 -1
  705. package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js +30 -0
  706. package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js.map +1 -0
  707. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +344 -0
  708. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  709. package/build/dist/Server/Utils/Telemetry.js +1 -1
  710. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  711. package/build/dist/Server/Utils/VendorAssets.js +2 -0
  712. package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
  713. package/build/dist/Types/Dashboard/DashboardTemplates.js +425 -0
  714. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  715. package/build/dist/Types/OnCallDutyPolicy/Layer.js +11 -0
  716. package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
  717. package/build/dist/Types/Rules/RuleCriteria.js +18 -0
  718. package/build/dist/Types/Rules/RuleCriteria.js.map +1 -0
  719. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +435 -0
  720. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -0
  721. package/build/dist/Types/Rum/SessionReplay.js +64 -0
  722. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  723. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
  724. package/build/dist/UI/Components/Alerts/Alert.js +63 -41
  725. package/build/dist/UI/Components/Alerts/Alert.js.map +1 -1
  726. package/build/dist/UI/Components/Button/Button.js +3 -1
  727. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  728. package/build/dist/UI/Components/Dropdown/Dropdown.js +1 -1
  729. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  730. package/build/dist/UI/Components/Feed/Feed.js +4 -1
  731. package/build/dist/UI/Components/Feed/Feed.js.map +1 -1
  732. package/build/dist/UI/Components/Feed/useFeedItems.js +137 -0
  733. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -0
  734. package/build/dist/UI/Components/Forms/BasicForm.js +38 -19
  735. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  736. package/build/dist/UI/Components/Forms/ModelForm.js +65 -1
  737. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  738. package/build/dist/UI/Components/Icon/Icon.js +3 -35
  739. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  740. package/build/dist/UI/Components/ModelTable/ModelTable.js +12 -1
  741. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  742. package/build/dist/UI/Components/Navbar/NavBar.js +1 -0
  743. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  744. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +383 -0
  745. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -0
  746. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js +124 -0
  747. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js.map +1 -0
  748. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js +126 -0
  749. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js.map +1 -0
  750. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js +63 -0
  751. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js.map +1 -0
  752. package/build/dist/UI/Components/Table/Table.js +1 -1
  753. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  754. package/build/dist/UI/Components/Table/TableBody.js +4 -2
  755. package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
  756. package/build/dist/UI/Components/Table/TableRow.js +3 -2
  757. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  758. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +14 -2
  759. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +1 -1
  760. package/build/dist/UI/Utils/LabelRuleImportExport.js +81 -5
  761. package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -1
  762. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  763. package/build/dist/Utils/Faker.js +76 -6
  764. package/build/dist/Utils/Faker.js.map +1 -1
  765. package/build/dist/Utils/LabelRuleImportExport.js +157 -3
  766. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  767. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +81 -5
  768. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  769. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +77 -0
  770. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
  771. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +109 -2
  772. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -1
  773. package/build/dist/Utils/Rules/RuleCriteriaMatcher.js +526 -0
  774. package/build/dist/Utils/Rules/RuleCriteriaMatcher.js.map +1 -0
  775. package/build/dist/Utils/Rum/SessionIdentity.js +13 -1
  776. package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
  777. package/build/dist/Utils/Slo/SloBurnRateRuleState.js +28 -15
  778. package/build/dist/Utils/Slo/SloBurnRateRuleState.js.map +1 -1
  779. package/build/dist/Utils/Telemetry/OriginAllowList.js +61 -0
  780. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
  781. package/package.json +20 -20
@@ -0,0 +1,880 @@
1
+ import Includes from "../../../Types/BaseDatabase/Includes";
2
+ import DashboardBaseComponent from "../../../Types/Dashboard/DashboardComponents/DashboardBaseComponent";
3
+ import DashboardComponentType from "../../../Types/Dashboard/DashboardComponentType";
4
+ import {
5
+ DashboardTemplateType,
6
+ getTemplateConfig,
7
+ } from "../../../Types/Dashboard/DashboardTemplates";
8
+ import DashboardVariable, {
9
+ DashboardVariableType,
10
+ } from "../../../Types/Dashboard/DashboardVariable";
11
+ import DashboardViewConfig from "../../../Types/Dashboard/DashboardViewConfig";
12
+ import MetricQueryConfigData from "../../../Types/Metrics/MetricQueryConfigData";
13
+ import MetricQueryData from "../../../Types/Metrics/MetricQueryData";
14
+ import DashboardModelQueryInterpolation, {
15
+ AttributeToColumnMap,
16
+ } from "../../../Utils/Dashboard/ModelQueryVariableInterpolation";
17
+ import DashboardVariableInterpolation, {
18
+ ResolvedVariableValue,
19
+ } from "../../../Utils/Dashboard/VariableInterpolation";
20
+ import { describe, expect, test } from "@jest/globals";
21
+
22
+ /*
23
+ * What the SLO template's Monitor variable actually scopes, established by
24
+ * running the real interpolation code over the real template config rather
25
+ * than by reading the template's comments.
26
+ *
27
+ * The template is two halves. Objective Health and Error Budget Trends read
28
+ * one ServiceLevelObjective by stored id; Monitor Health reads two metric
29
+ * series. Only the second half is reachable by a dashboard variable, and
30
+ * getting that boundary wrong throws nothing — it ships a dashboard whose
31
+ * halves silently disagree about what is selected: uptime narrowed to one
32
+ * monitor, the SLI tile beside it still reporting the whole objective, and
33
+ * no indication which number answers which question.
34
+ *
35
+ * The template's declarative facts — widget inventory, titles, layout,
36
+ * unconfigured SLO ids — are pinned in
37
+ * Common/Tests/Types/Dashboard/SloDashboardTemplate.test.ts. This file only
38
+ * asserts behaviour under DashboardVariableInterpolation (metric widgets)
39
+ * and DashboardModelQueryInterpolation (Postgres-backed list widgets).
40
+ */
41
+
42
+ /*
43
+ * The attribute key MonitorMetricUtil.buildAttributes stamps onto
44
+ * `oneuptime.monitor.online` and `oneuptime.monitor.response.time`. It is a
45
+ * BARE key: metric attributes written by OneUptime's own monitor workers are
46
+ * not OTel collector resource attributes and carry no prefix.
47
+ */
48
+ const MONITOR_ATTRIBUTE: string = "monitorName";
49
+
50
+ /*
51
+ * The two plausible mis-spellings of that binding. Both fail SILENTLY, which
52
+ * is why they are pinned here rather than left to review:
53
+ *
54
+ * - "resource.monitorName" is the prefix collector-sourced resource
55
+ * attributes carry. Nothing writes it for these two series, so the
56
+ * variable's picker would offer no options at all and any value forced
57
+ * into it would filter on an attribute no row has — every monitor widget
58
+ * renders empty, with no error anywhere.
59
+ *
60
+ * - "monitorNames" is the PLURAL key IncidentService stamps on incident
61
+ * metrics, comma-joined ("api-gateway,web-frontend"). It really exists in
62
+ * the metric store, so the picker would even populate — with comma-joined
63
+ * lists rather than monitor names — and an IN test for a single monitor
64
+ * would match none of the uptime rows, emptying exactly the widgets this
65
+ * variable exists to scope.
66
+ */
67
+ const PREFIXED_MONITOR_ATTRIBUTE: string = "resource.monitorName";
68
+ const PLURAL_MONITOR_ATTRIBUTE: string = "monitorNames";
69
+
70
+ /*
71
+ * Two picks on purpose. An objective is normally backed by several monitors,
72
+ * so a single pick would not exercise what the variable is multi-select for.
73
+ */
74
+ const PICKED_MONITORS: Array<string> = ["api-gateway", "web-frontend"];
75
+
76
+ /*
77
+ * An attribute the reader could plausibly have added to a widget by hand
78
+ * before using the toolbar. It has to survive every clear/pick cycle: the
79
+ * Monitor variable owns exactly one key and must not tidy up its neighbours.
80
+ */
81
+ const UNRELATED_ATTRIBUTE: string = "probeName";
82
+
83
+ // -- Helpers ---------------------------------------------------------------
84
+
85
+ type WidgetArguments = Record<string, unknown>;
86
+
87
+ function getConfig(): DashboardViewConfig {
88
+ const config: DashboardViewConfig | null = getTemplateConfig(
89
+ DashboardTemplateType.Slo,
90
+ );
91
+
92
+ expect(config).not.toBeNull();
93
+ return mutateForFailureCheck(config as DashboardViewConfig);
94
+ }
95
+
96
+ // TEMPORARY mutation harness - removed before commit.
97
+ function mutateForFailureCheck(
98
+ config: DashboardViewConfig,
99
+ ): DashboardViewConfig {
100
+ const mutation: string = process.env["SLO_TEST_MUTATION"] || "";
101
+ const variable: DashboardVariable = (config.variables ||
102
+ [])[0] as DashboardVariable;
103
+
104
+ if (mutation === "prefixedKey") {
105
+ variable.attributeKey = "resource.monitorName";
106
+ }
107
+
108
+ if (mutation === "multiDefault") {
109
+ variable.defaultValue = "api-gateway";
110
+ }
111
+
112
+ if (mutation === "singleSelectDefault") {
113
+ variable.isMultiSelect = false;
114
+ variable.defaultValue = "api-gateway";
115
+ }
116
+
117
+ if (mutation === "sloGainsQuery") {
118
+ const slo: DashboardBaseComponent = config.components.filter(
119
+ (component: DashboardBaseComponent): boolean => {
120
+ return component.componentType === DashboardComponentType.Slo;
121
+ },
122
+ )[0] as DashboardBaseComponent;
123
+ (slo.arguments as WidgetArguments)["metricQueryConfig"] = {
124
+ metricQueryData: {
125
+ filterData: { metricName: "x", aggegationType: "Avg" },
126
+ },
127
+ };
128
+ }
129
+
130
+ if (mutation === "storedFilter") {
131
+ const widget: DashboardBaseComponent = config.components.filter(
132
+ (component: DashboardBaseComponent): boolean => {
133
+ return component.componentType === DashboardComponentType.Value;
134
+ },
135
+ )[0] as DashboardBaseComponent;
136
+ const queryConfig: WidgetArguments = (widget.arguments as WidgetArguments)[
137
+ "metricQueryConfig"
138
+ ] as WidgetArguments;
139
+ const queryData: WidgetArguments = queryConfig[
140
+ "metricQueryData"
141
+ ] as WidgetArguments;
142
+ (queryData["filterData"] as WidgetArguments)["attributes"] = {
143
+ monitorName: "api-gateway",
144
+ };
145
+ }
146
+
147
+ if (mutation === "dropAValueWidget") {
148
+ const index: number = config.components.findIndex(
149
+ (component: DashboardBaseComponent): boolean => {
150
+ return component.componentType === DashboardComponentType.Value;
151
+ },
152
+ );
153
+ config.components.splice(index, 1);
154
+ }
155
+
156
+ return config;
157
+ }
158
+
159
+ /*
160
+ * The variable is selected by being the template's ONLY one, never by its
161
+ * attribute key — selecting it by the key would make the tests that pin the
162
+ * key true by construction.
163
+ */
164
+ function monitorVariable(config: DashboardViewConfig): DashboardVariable {
165
+ const variables: Array<DashboardVariable> = config.variables || [];
166
+
167
+ expect(variables).toHaveLength(1);
168
+ return variables[0] as DashboardVariable;
169
+ }
170
+
171
+ function withSelection(
172
+ variable: DashboardVariable,
173
+ selectedValues: Array<string>,
174
+ ): DashboardVariable {
175
+ return { ...variable, selectedValues: selectedValues };
176
+ }
177
+
178
+ function argumentsOf(component: DashboardBaseComponent): WidgetArguments {
179
+ return (component.arguments as WidgetArguments | undefined) || {};
180
+ }
181
+
182
+ /*
183
+ * Titles are the only stable handle on a template widget — componentIds are
184
+ * regenerated on every getTemplateConfig call and array positions shift
185
+ * whenever a row is inserted. Each widget family stores its title under a
186
+ * different argument key.
187
+ */
188
+ const TITLE_ARGUMENT_KEYS: Array<string> = [
189
+ "title",
190
+ "chartTitle",
191
+ "gaugeTitle",
192
+ "tableTitle",
193
+ "widgetTitle",
194
+ "text",
195
+ ];
196
+
197
+ function titleOf(component: DashboardBaseComponent): string {
198
+ const args: WidgetArguments = argumentsOf(component);
199
+
200
+ for (const key of TITLE_ARGUMENT_KEYS) {
201
+ const value: unknown = args[key];
202
+
203
+ if (typeof value === "string") {
204
+ return value;
205
+ }
206
+ }
207
+
208
+ return "";
209
+ }
210
+
211
+ /*
212
+ * Every metric query a widget owns. Chart widgets may carry an additional
213
+ * `metricQueryConfigs` array beside the primary config, and
214
+ * DashboardChartComponent interpolates all of them, so both are collected —
215
+ * a second query added to a chart later is covered without editing here.
216
+ */
217
+ function queryConfigsOf(
218
+ component: DashboardBaseComponent,
219
+ ): Array<MetricQueryConfigData> {
220
+ const args: WidgetArguments = argumentsOf(component);
221
+ const configs: Array<MetricQueryConfigData> = [];
222
+ const primary: unknown = args["metricQueryConfig"];
223
+
224
+ if (primary) {
225
+ configs.push(primary as MetricQueryConfigData);
226
+ }
227
+
228
+ const additional: unknown = args["metricQueryConfigs"];
229
+
230
+ if (Array.isArray(additional)) {
231
+ configs.push(...(additional as Array<MetricQueryConfigData>));
232
+ }
233
+
234
+ return configs;
235
+ }
236
+
237
+ // The widgets a TelemetryAttribute variable can reach at all.
238
+ function widgetsWithMetricQuery(
239
+ config: DashboardViewConfig,
240
+ ): Array<DashboardBaseComponent> {
241
+ return config.components.filter(
242
+ (component: DashboardBaseComponent): boolean => {
243
+ return queryConfigsOf(component).length > 0;
244
+ },
245
+ );
246
+ }
247
+
248
+ function widgetsWithoutMetricQuery(
249
+ config: DashboardViewConfig,
250
+ ): Array<DashboardBaseComponent> {
251
+ return config.components.filter(
252
+ (component: DashboardBaseComponent): boolean => {
253
+ return queryConfigsOf(component).length === 0;
254
+ },
255
+ );
256
+ }
257
+
258
+ function componentsOfType(
259
+ config: DashboardViewConfig,
260
+ componentType: DashboardComponentType,
261
+ ): Array<DashboardBaseComponent> {
262
+ return config.components.filter(
263
+ (component: DashboardBaseComponent): boolean => {
264
+ return component.componentType === componentType;
265
+ },
266
+ );
267
+ }
268
+
269
+ function filterDataOf(queryConfig: MetricQueryConfigData): WidgetArguments {
270
+ return queryConfig.metricQueryData?.filterData as
271
+ | WidgetArguments
272
+ | undefined as WidgetArguments;
273
+ }
274
+
275
+ function attributesOf(queryConfig: MetricQueryConfigData): WidgetArguments {
276
+ const filterData: WidgetArguments = filterDataOf(queryConfig) || {};
277
+
278
+ return (filterData["attributes"] as WidgetArguments | undefined) || {};
279
+ }
280
+
281
+ /*
282
+ * A widget's attribute filter rendered as one line, so a failing expectation
283
+ * names the offending key and operator instead of dumping an object graph.
284
+ * `Includes` renders as IN(...) and anything else as a plain assignment —
285
+ * that distinction is load-bearing: the server's WHERE-builder emits
286
+ * `attributes[key] IN (...)` only for an actual Includes instance, so a
287
+ * plain array smuggled in here would read as `= a,b` and fail.
288
+ */
289
+ function describeAttributes(queryConfig: MetricQueryConfigData): string {
290
+ const attributes: WidgetArguments = attributesOf(queryConfig);
291
+ const keys: Array<string> = Object.keys(attributes).sort();
292
+
293
+ if (keys.length === 0) {
294
+ return "no attribute filter";
295
+ }
296
+
297
+ return keys
298
+ .map((key: string): string => {
299
+ const value: unknown = attributes[key];
300
+
301
+ if (value instanceof Includes) {
302
+ const values: Array<string> = value.values as Array<string>;
303
+ return `${key} IN (${values.join(", ")})`;
304
+ }
305
+
306
+ return `${key} = ${String(value)}`;
307
+ })
308
+ .join("; ");
309
+ }
310
+
311
+ function describeResolved(resolved: ResolvedVariableValue | undefined): string {
312
+ if (!resolved) {
313
+ return "All";
314
+ }
315
+
316
+ if (resolved.multi) {
317
+ return `IN (${resolved.multi.join(", ")})`;
318
+ }
319
+
320
+ return `= ${String(resolved.scalar)}`;
321
+ }
322
+
323
+ /*
324
+ * The predicate every scoped widget must end up with, written once so the
325
+ * expectation for each widget is "<title>: <this>".
326
+ */
327
+ const EXPECTED_PREDICATE: string = `${MONITOR_ATTRIBUTE} IN (${PICKED_MONITORS.join(
328
+ ", ",
329
+ )})`;
330
+
331
+ /*
332
+ * Applies the variables to every query a widget owns and labels the outcome
333
+ * with the widget's title.
334
+ */
335
+ function describeWidgetUnderVariables(
336
+ component: DashboardBaseComponent,
337
+ variables: Array<DashboardVariable>,
338
+ ): string {
339
+ const applied: Array<string> = queryConfigsOf(component).map(
340
+ (queryConfig: MetricQueryConfigData): string => {
341
+ return describeAttributes(
342
+ DashboardVariableInterpolation.applyToQueryConfig(
343
+ queryConfig,
344
+ variables,
345
+ ),
346
+ );
347
+ },
348
+ );
349
+
350
+ return `${titleOf(component)}: ${applied.join(" | ")}`;
351
+ }
352
+
353
+ function describeWidgetAsShipped(component: DashboardBaseComponent): string {
354
+ const shipped: Array<string> = queryConfigsOf(component).map(
355
+ (queryConfig: MetricQueryConfigData): string => {
356
+ return describeAttributes(queryConfig);
357
+ },
358
+ );
359
+
360
+ return `${titleOf(component)}: ${shipped.join(" | ")}`;
361
+ }
362
+
363
+ function typesPresentIn(
364
+ components: Array<DashboardBaseComponent>,
365
+ ): Array<string> {
366
+ return Array.from(
367
+ new Set(
368
+ components.map((component: DashboardBaseComponent): string => {
369
+ return component.componentType;
370
+ }),
371
+ ),
372
+ ).sort();
373
+ }
374
+
375
+ function typeBreakdownOf(
376
+ components: Array<DashboardBaseComponent>,
377
+ ): Array<string> {
378
+ const counts: Record<string, number> = {};
379
+
380
+ for (const component of components) {
381
+ counts[component.componentType] =
382
+ (counts[component.componentType] || 0) + 1;
383
+ }
384
+
385
+ return Object.keys(counts)
386
+ .sort()
387
+ .map((componentType: string): string => {
388
+ return `${componentType} x ${counts[componentType]}`;
389
+ });
390
+ }
391
+
392
+ /*
393
+ * A saved-dashboard state the template itself never ships: a widget whose
394
+ * stored config already carries an attribute filter, because the reader
395
+ * added one in the widget's own settings before touching the toolbar. Built
396
+ * from a real template query config so the surrounding shape (metricName and
397
+ * the misspelled `aggegationType` key the fetch layer reads) is the real one.
398
+ */
399
+ function withStoredAttributes(
400
+ queryConfig: MetricQueryConfigData,
401
+ attributes: WidgetArguments,
402
+ ): MetricQueryConfigData {
403
+ const filterData: WidgetArguments = filterDataOf(queryConfig) || {};
404
+
405
+ return {
406
+ ...queryConfig,
407
+ metricQueryData: {
408
+ ...queryConfig.metricQueryData,
409
+ filterData: {
410
+ ...filterData,
411
+ attributes: attributes,
412
+ },
413
+ } as unknown as MetricQueryData,
414
+ };
415
+ }
416
+
417
+ // -- Tests -----------------------------------------------------------------
418
+
419
+ describe("SLO template Monitor variable scoping", () => {
420
+ describe("the binding itself", () => {
421
+ /*
422
+ * The variable only reaches a metric query through
423
+ * applyToAttributes' TelemetryAttribute filter. Any other type — a
424
+ * CustomList or Query variable bound to the same key — renders an
425
+ * identical toolbar picker and scopes nothing.
426
+ */
427
+ test("is a TelemetryAttribute variable bound to the bare monitorName key", () => {
428
+ const variable: DashboardVariable = monitorVariable(getConfig());
429
+
430
+ expect(
431
+ `${variable.name} -> ${variable.type} on ${variable.attributeKey}`,
432
+ ).toBe(
433
+ `monitor -> ${DashboardVariableType.TelemetryAttribute} on ${MONITOR_ATTRIBUTE}`,
434
+ );
435
+ expect(variable.attributeKey).not.toBe(PREFIXED_MONITOR_ATTRIBUTE);
436
+ expect(variable.attributeKey).not.toBe(PLURAL_MONITOR_ATTRIBUTE);
437
+ });
438
+
439
+ /*
440
+ * The key the variable is declared with is the key the predicate is
441
+ * written under — asserted from the interpolation output rather than
442
+ * from the declaration, because that output is what the fetch layer
443
+ * compiles into `attributes['monitorName'] IN (...)`.
444
+ */
445
+ test("writes its predicate under that same bare key and no other", () => {
446
+ const config: DashboardViewConfig = getConfig();
447
+ const widgets: Array<DashboardBaseComponent> =
448
+ widgetsWithMetricQuery(config);
449
+
450
+ expect(widgets.length).toBeGreaterThan(0);
451
+
452
+ const keysWritten: Set<string> = new Set<string>();
453
+
454
+ for (const widget of widgets) {
455
+ for (const queryConfig of queryConfigsOf(widget)) {
456
+ const applied: MetricQueryConfigData =
457
+ DashboardVariableInterpolation.applyToQueryConfig(queryConfig, [
458
+ withSelection(monitorVariable(config), PICKED_MONITORS),
459
+ ]);
460
+
461
+ for (const key of Object.keys(attributesOf(applied))) {
462
+ keysWritten.add(key);
463
+ }
464
+ }
465
+ }
466
+
467
+ expect(Array.from(keysWritten).sort()).toEqual([MONITOR_ATTRIBUTE]);
468
+ });
469
+
470
+ /*
471
+ * Multi-select is not cosmetic. The toolbar's multi picker writes
472
+ * `selectedValues`, and resolveValue reads that list ONLY when
473
+ * isMultiSelect is set — flip the flag and every pick the reader makes
474
+ * is dropped on the floor while the picker keeps showing them.
475
+ */
476
+ test("is multi-select, which is what makes selectedValues resolve at all", () => {
477
+ const config: DashboardViewConfig = getConfig();
478
+ const picked: DashboardVariable = withSelection(
479
+ monitorVariable(config),
480
+ PICKED_MONITORS,
481
+ );
482
+ const asSingleSelect: DashboardVariable = {
483
+ ...picked,
484
+ isMultiSelect: false,
485
+ };
486
+
487
+ expect(
488
+ `multi=${describeResolved(
489
+ DashboardVariableInterpolation.resolveValue(picked),
490
+ )} single=${describeResolved(
491
+ DashboardVariableInterpolation.resolveValue(asSingleSelect),
492
+ )}`,
493
+ ).toBe(`multi=IN (${PICKED_MONITORS.join(", ")}) single=All`);
494
+ });
495
+
496
+ /*
497
+ * Why the template ships no defaultValue, in the two ways it could be
498
+ * added:
499
+ *
500
+ * - On this multi-select it is dead config. resolveValue never consults
501
+ * defaultValue for a multi-select, so the author gets no scoping and
502
+ * no warning that the field did nothing.
503
+ * - Switched to single-select, the same default is worse than dead: it
504
+ * applies on first render, so a freshly created dashboard reports one
505
+ * monitor's uptime beside SLO tiles that report the whole objective.
506
+ */
507
+ test("ships no defaultValue", () => {
508
+ const variable: DashboardVariable = monitorVariable(getConfig());
509
+
510
+ expect(
511
+ `${variable.name} multiSelect=${variable.isMultiSelect === true} default=${
512
+ variable.defaultValue ?? "(none)"
513
+ }`,
514
+ ).toBe("monitor multiSelect=true default=(none)");
515
+ });
516
+
517
+ test("a defaultValue added to this multi-select would never apply", () => {
518
+ const variable: DashboardVariable = {
519
+ ...monitorVariable(getConfig()),
520
+ defaultValue: PICKED_MONITORS[0] as string,
521
+ };
522
+
523
+ expect(
524
+ describeResolved(DashboardVariableInterpolation.resolveValue(variable)),
525
+ ).toBe("All");
526
+ });
527
+ });
528
+
529
+ describe("with nothing selected the dashboard is project-wide", () => {
530
+ test("the untouched variable resolves to All", () => {
531
+ const variable: DashboardVariable = monitorVariable(getConfig());
532
+
533
+ expect(
534
+ `${variable.name}: ${describeResolved(
535
+ DashboardVariableInterpolation.resolveValue(variable),
536
+ )}`,
537
+ ).toBe("monitor: All");
538
+ });
539
+
540
+ /*
541
+ * The same statement at the level the reader actually sees: no widget's
542
+ * query gains a filter, and applyToQueryConfig hands back the very same
543
+ * object so the memoised widgets do not refetch on mount.
544
+ *
545
+ * This is also the test that catches a default being added to the
546
+ * template: a single-select default would turn every line below into
547
+ * "monitorName = ...".
548
+ */
549
+ test("no metric widget's query changes at all", () => {
550
+ const config: DashboardViewConfig = getConfig();
551
+ const variable: DashboardVariable = monitorVariable(config);
552
+ const widgets: Array<DashboardBaseComponent> =
553
+ widgetsWithMetricQuery(config);
554
+
555
+ expect(widgets.length).toBeGreaterThan(0);
556
+
557
+ const outcomes: Array<string> = widgets.map(
558
+ (widget: DashboardBaseComponent): string => {
559
+ const results: Array<string> = queryConfigsOf(widget).map(
560
+ (queryConfig: MetricQueryConfigData): string => {
561
+ const applied: MetricQueryConfigData =
562
+ DashboardVariableInterpolation.applyToQueryConfig(queryConfig, [
563
+ variable,
564
+ ]);
565
+
566
+ return applied === queryConfig
567
+ ? "unchanged"
568
+ : describeAttributes(applied);
569
+ },
570
+ );
571
+
572
+ return `${titleOf(widget)}: ${results.join(" | ")}`;
573
+ },
574
+ );
575
+
576
+ expect(outcomes).toEqual(
577
+ widgets.map((widget: DashboardBaseComponent): string => {
578
+ return `${titleOf(widget)}: unchanged`;
579
+ }),
580
+ );
581
+ });
582
+
583
+ test("and the widgets ship with no attribute filter of their own", () => {
584
+ const config: DashboardViewConfig = getConfig();
585
+ const widgets: Array<DashboardBaseComponent> =
586
+ widgetsWithMetricQuery(config);
587
+
588
+ expect(widgets.length).toBeGreaterThan(0);
589
+ expect(widgets.map(describeWidgetAsShipped)).toEqual(
590
+ widgets.map((widget: DashboardBaseComponent): string => {
591
+ return `${titleOf(widget)}: no attribute filter`;
592
+ }),
593
+ );
594
+ });
595
+ });
596
+
597
+ describe("with monitors picked", () => {
598
+ /*
599
+ * The scoped half of the dashboard, established from the config rather
600
+ * than from a list of titles: exactly the widgets that own a metric
601
+ * query are the widgets a TelemetryAttribute variable can reach, and on
602
+ * this template those are the three Monitor Health value tiles and the
603
+ * two monitor charts.
604
+ */
605
+ test("the reachable widgets are exactly the three Value tiles and two Charts", () => {
606
+ const config: DashboardViewConfig = getConfig();
607
+ const widgets: Array<DashboardBaseComponent> =
608
+ widgetsWithMetricQuery(config);
609
+
610
+ expect(typeBreakdownOf(widgets)).toEqual([
611
+ `${DashboardComponentType.Chart} x 2`,
612
+ `${DashboardComponentType.Value} x 3`,
613
+ ]);
614
+ });
615
+
616
+ test("every one of them gains an Includes predicate on monitorName", () => {
617
+ const config: DashboardViewConfig = getConfig();
618
+ const picked: DashboardVariable = withSelection(
619
+ monitorVariable(config),
620
+ PICKED_MONITORS,
621
+ );
622
+ const widgets: Array<DashboardBaseComponent> =
623
+ widgetsWithMetricQuery(config);
624
+
625
+ expect(widgets.length).toBeGreaterThan(0);
626
+ expect(
627
+ widgets.map((widget: DashboardBaseComponent): string => {
628
+ return describeWidgetUnderVariables(widget, [picked]);
629
+ }),
630
+ ).toEqual(
631
+ widgets.map((widget: DashboardBaseComponent): string => {
632
+ return `${titleOf(widget)}: ${EXPECTED_PREDICATE}`;
633
+ }),
634
+ );
635
+ });
636
+
637
+ /*
638
+ * Scoping must not cost the widget its identity. `metricName` says which
639
+ * series to read and the aggregation is stored under the MISSPELLED key
640
+ * `aggegationType` — that misspelling is the contract the fetch layer
641
+ * reads, so a rewrite that dropped or corrected it would return an
642
+ * unaggregated (or empty) result for a widget that still looks right.
643
+ */
644
+ test("the scoped query keeps its metric name and its aggegationType key", () => {
645
+ const config: DashboardViewConfig = getConfig();
646
+ const picked: DashboardVariable = withSelection(
647
+ monitorVariable(config),
648
+ PICKED_MONITORS,
649
+ );
650
+ const widgets: Array<DashboardBaseComponent> =
651
+ widgetsWithMetricQuery(config);
652
+
653
+ expect(widgets.length).toBeGreaterThan(0);
654
+
655
+ const before: Array<string> = [];
656
+ const after: Array<string> = [];
657
+
658
+ for (const widget of widgets) {
659
+ for (const queryConfig of queryConfigsOf(widget)) {
660
+ const shipped: WidgetArguments = filterDataOf(queryConfig);
661
+ const applied: WidgetArguments = filterDataOf(
662
+ DashboardVariableInterpolation.applyToQueryConfig(queryConfig, [
663
+ picked,
664
+ ]),
665
+ );
666
+
667
+ before.push(
668
+ `${titleOf(widget)}: ${String(shipped["metricName"])} / ${String(
669
+ shipped["aggegationType"],
670
+ )}`,
671
+ );
672
+ after.push(
673
+ `${titleOf(widget)}: ${String(applied["metricName"])} / ${String(
674
+ applied["aggegationType"],
675
+ )}`,
676
+ );
677
+ }
678
+ }
679
+
680
+ expect(after).toEqual(before);
681
+ // Guards the comparison above from passing on two lists of undefineds.
682
+ for (const line of before) {
683
+ expect(line).not.toContain("undefined");
684
+ }
685
+ });
686
+
687
+ /*
688
+ * Interpolation is a render-time transform. If it wrote back into the
689
+ * component's stored arguments, the first selection would be baked into
690
+ * the dashboard the next time it was saved — and clearing the toolbar
691
+ * afterwards would not undo it, because "All" only removes the filter
692
+ * from the copy it is building.
693
+ */
694
+ test("the stored template config is never written back to", () => {
695
+ const config: DashboardViewConfig = getConfig();
696
+ const picked: DashboardVariable = withSelection(
697
+ monitorVariable(config),
698
+ PICKED_MONITORS,
699
+ );
700
+ const widgets: Array<DashboardBaseComponent> =
701
+ widgetsWithMetricQuery(config);
702
+
703
+ expect(widgets.length).toBeGreaterThan(0);
704
+
705
+ const shipped: Array<string> = widgets.map(describeWidgetAsShipped);
706
+
707
+ for (const widget of widgets) {
708
+ DashboardVariableInterpolation.applyToQueryConfigs(
709
+ queryConfigsOf(widget),
710
+ [picked],
711
+ );
712
+ }
713
+
714
+ expect(widgets.map(describeWidgetAsShipped)).toEqual(shipped);
715
+ expect(shipped).toEqual(
716
+ widgets.map((widget: DashboardBaseComponent): string => {
717
+ return `${titleOf(widget)}: no attribute filter`;
718
+ }),
719
+ );
720
+ });
721
+ });
722
+
723
+ describe("the widgets the variable cannot reach", () => {
724
+ /*
725
+ * The unscoped half. A Slo widget resolves one objective from the
726
+ * serviceLevelObjectiveId stored on it and issues no metric query, so
727
+ * there is nothing for a TelemetryAttribute variable to interpolate —
728
+ * picking a monitor narrows the uptime row and leaves every SLO number
729
+ * reporting the whole objective, which is the correct reading of both.
730
+ */
731
+ test("no Slo widget owns a metric query", () => {
732
+ const config: DashboardViewConfig = getConfig();
733
+ const sloWidgets: Array<DashboardBaseComponent> = componentsOfType(
734
+ config,
735
+ DashboardComponentType.Slo,
736
+ );
737
+
738
+ expect(sloWidgets.length).toBeGreaterThan(0);
739
+ expect(
740
+ sloWidgets.map((widget: DashboardBaseComponent): string => {
741
+ return `${titleOf(widget)}: ${queryConfigsOf(widget).length} metric queries`;
742
+ }),
743
+ ).toEqual(
744
+ sloWidgets.map((widget: DashboardBaseComponent): string => {
745
+ return `${titleOf(widget)}: 0 metric queries`;
746
+ }),
747
+ );
748
+ });
749
+
750
+ /*
751
+ * Stated as a closed set so a widget family added to this template later
752
+ * has to be classified deliberately: everything outside the metric half
753
+ * is a Text row, an Slo widget, or one of the three Postgres-backed
754
+ * lists. All of them are immune to the Monitor variable, and the lists
755
+ * are additionally project-wide and time-range-free — which is why they
756
+ * are titled "All Monitors" / "Latest ..." rather than anything that
757
+ * implies the toolbar narrows them.
758
+ */
759
+ test("the unreachable widgets are only text rows, Slo widgets and the model-backed lists", () => {
760
+ const config: DashboardViewConfig = getConfig();
761
+ const widgets: Array<DashboardBaseComponent> =
762
+ widgetsWithoutMetricQuery(config);
763
+
764
+ expect(widgets.length).toBeGreaterThan(0);
765
+ expect(typesPresentIn(widgets)).toEqual(
766
+ [
767
+ DashboardComponentType.AlertList,
768
+ DashboardComponentType.IncidentList,
769
+ DashboardComponentType.MonitorList,
770
+ DashboardComponentType.Slo,
771
+ DashboardComponentType.Text,
772
+ ].sort(),
773
+ );
774
+ });
775
+
776
+ /*
777
+ * The list widgets query Postgres by column, not by OTel attribute, so
778
+ * they are interpolated — if at all — through
779
+ * DashboardModelQueryInterpolation, which writes a predicate only for
780
+ * attribute keys the widget itself declares a column for. None of the
781
+ * three lists on this template declares one for `monitorName` (the list
782
+ * components never call the helper, and the public-dashboard monitor
783
+ * policy ships no attributeToColumn map), so a picked Monitor variable
784
+ * leaves their queries byte-identical.
785
+ *
786
+ * The second half of the test is what keeps the first from being
787
+ * vacuous: the very same variable DOES write a predicate the moment a
788
+ * map claims the key, so what withholds it is the missing mapping and
789
+ * not something inert about the variable.
790
+ */
791
+ test("a picked Monitor variable writes no model-query predicate unless a widget maps the key", () => {
792
+ const config: DashboardViewConfig = getConfig();
793
+ const picked: DashboardVariable = withSelection(
794
+ monitorVariable(config),
795
+ PICKED_MONITORS,
796
+ );
797
+ const query: Record<string, unknown> = { projectId: "project-1" };
798
+
799
+ const unmapped: AttributeToColumnMap = { "host.name": "hostname" };
800
+ expect(
801
+ DashboardModelQueryInterpolation.applyToQuery(
802
+ query,
803
+ [picked],
804
+ unmapped,
805
+ ),
806
+ ).toBe(query);
807
+
808
+ const mapped: AttributeToColumnMap = { [MONITOR_ATTRIBUTE]: "name" };
809
+ const scoped: Record<string, unknown> =
810
+ DashboardModelQueryInterpolation.applyToQuery(query, [picked], mapped);
811
+
812
+ expect(scoped["name"]).toBeInstanceOf(Includes);
813
+ expect((scoped["name"] as Includes).values).toEqual(PICKED_MONITORS);
814
+ });
815
+ });
816
+
817
+ describe("clearing the selection", () => {
818
+ /*
819
+ * The failure this prevents: the popover reads "All" the instant the
820
+ * last pick is removed, so anything still filtered at that moment is
821
+ * filtered behind a control that says it is not. A stored filter on the
822
+ * variable's own key is therefore dropped, not merely left alone —
823
+ * while every other attribute on the widget is left exactly as the
824
+ * reader set it.
825
+ */
826
+ test("removes a stored monitorName filter and keeps the reader's other attributes", () => {
827
+ const config: DashboardViewConfig = getConfig();
828
+ const widget: DashboardBaseComponent = widgetsWithMetricQuery(
829
+ config,
830
+ )[0] as DashboardBaseComponent;
831
+ const storedQuery: MetricQueryConfigData = withStoredAttributes(
832
+ queryConfigsOf(widget)[0] as MetricQueryConfigData,
833
+ {
834
+ [MONITOR_ATTRIBUTE]: "api-gateway",
835
+ [UNRELATED_ATTRIBUTE]: "us-west",
836
+ },
837
+ );
838
+
839
+ const cleared: MetricQueryConfigData =
840
+ DashboardVariableInterpolation.applyToQueryConfig(storedQuery, [
841
+ withSelection(monitorVariable(config), []),
842
+ ]);
843
+
844
+ expect(`${titleOf(widget)}: ${describeAttributes(storedQuery)}`).toBe(
845
+ `${titleOf(widget)}: ${MONITOR_ATTRIBUTE} = api-gateway; ${UNRELATED_ATTRIBUTE} = us-west`,
846
+ );
847
+ expect(`${titleOf(widget)}: ${describeAttributes(cleared)}`).toBe(
848
+ `${titleOf(widget)}: ${UNRELATED_ATTRIBUTE} = us-west`,
849
+ );
850
+ });
851
+
852
+ /*
853
+ * The other direction, so the removal above cannot be mistaken for the
854
+ * variable simply never writing: re-picking replaces the stale scalar
855
+ * with the IN predicate rather than leaving both, or ANDing them.
856
+ */
857
+ test("re-picking replaces a stale scalar rather than adding to it", () => {
858
+ const config: DashboardViewConfig = getConfig();
859
+ const widget: DashboardBaseComponent = widgetsWithMetricQuery(
860
+ config,
861
+ )[0] as DashboardBaseComponent;
862
+ const storedQuery: MetricQueryConfigData = withStoredAttributes(
863
+ queryConfigsOf(widget)[0] as MetricQueryConfigData,
864
+ {
865
+ [MONITOR_ATTRIBUTE]: "some-other-monitor",
866
+ [UNRELATED_ATTRIBUTE]: "us-west",
867
+ },
868
+ );
869
+
870
+ const scoped: MetricQueryConfigData =
871
+ DashboardVariableInterpolation.applyToQueryConfig(storedQuery, [
872
+ withSelection(monitorVariable(config), PICKED_MONITORS),
873
+ ]);
874
+
875
+ expect(`${titleOf(widget)}: ${describeAttributes(scoped)}`).toBe(
876
+ `${titleOf(widget)}: ${EXPECTED_PREDICATE}; ${UNRELATED_ATTRIBUTE} = us-west`,
877
+ );
878
+ });
879
+ });
880
+ });