@oneuptime/common 11.7.4 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (872) hide show
  1. package/Models/AnalyticsModels/ExceptionInstance.ts +67 -0
  2. package/Models/AnalyticsModels/Index.ts +10 -0
  3. package/Models/AnalyticsModels/Log.ts +60 -0
  4. package/Models/AnalyticsModels/RumSession.ts +1401 -0
  5. package/Models/AnalyticsModels/RumSessionChunk.ts +798 -0
  6. package/Models/AnalyticsModels/Span.ts +60 -0
  7. package/Models/DatabaseModels/AIAgentTaskPullRequest.ts +52 -0
  8. package/Models/DatabaseModels/AIRun.ts +31 -0
  9. package/Models/DatabaseModels/Alert.ts +29 -0
  10. package/Models/DatabaseModels/AlertCustomField.ts +1 -1
  11. package/Models/DatabaseModels/AlertFeed.ts +1 -0
  12. package/Models/DatabaseModels/AutoRemediationRule.ts +989 -0
  13. package/Models/DatabaseModels/AutoRemediationSuggestion.ts +874 -0
  14. package/Models/DatabaseModels/CodeRepository.ts +129 -0
  15. package/Models/DatabaseModels/GlobalConfig.ts +312 -0
  16. package/Models/DatabaseModels/Incident.ts +29 -0
  17. package/Models/DatabaseModels/IncidentCustomField.ts +1 -1
  18. package/Models/DatabaseModels/IncidentFeed.ts +1 -0
  19. package/Models/DatabaseModels/Index.ts +21 -8
  20. package/Models/DatabaseModels/InstanceHealthLog.ts +8 -0
  21. package/Models/DatabaseModels/MonitorCustomField.ts +1 -1
  22. package/Models/DatabaseModels/MonitorStatus.ts +1 -1
  23. package/Models/DatabaseModels/NetworkDeviceLabelRule.ts +2 -2
  24. package/Models/DatabaseModels/NetworkDeviceOwnerRule.ts +2 -2
  25. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +1 -1
  26. package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +1 -1
  27. package/Models/DatabaseModels/Project.ts +231 -0
  28. package/Models/DatabaseModels/RumApplication.ts +906 -0
  29. package/Models/DatabaseModels/RumSessionErasureRequest.ts +561 -0
  30. package/Models/DatabaseModels/RumSessionPin.ts +457 -0
  31. package/Models/DatabaseModels/RumSessionReplayView.ts +406 -0
  32. package/Models/DatabaseModels/RunbookCredential.ts +673 -0
  33. package/Models/DatabaseModels/RunbookSecret.ts +7 -7
  34. package/Models/DatabaseModels/{RunbookAgent.ts → Runner.ts} +206 -46
  35. package/Models/DatabaseModels/{RunbookAgentJob.ts → RunnerJob.ts} +151 -18
  36. package/Models/DatabaseModels/{RunbookAgentOwnerTeam.ts → RunnerOwnerTeam.ts} +41 -43
  37. package/Models/DatabaseModels/{RunbookAgentOwnerUser.ts → RunnerOwnerUser.ts} +41 -43
  38. package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +1 -1
  39. package/Models/DatabaseModels/StatusPageCustomField.ts +1 -1
  40. package/Models/DatabaseModels/TeamCustomField.ts +1 -1
  41. package/Models/DatabaseModels/TeamMemberCustomField.ts +1 -1
  42. package/Server/API/AIAgentDataAPI.ts +179 -48
  43. package/Server/API/AIAgentTaskAPI.ts +36 -37
  44. package/Server/API/AIAgentTaskLogAPI.ts +19 -33
  45. package/Server/API/AutoRemediationAPI.ts +557 -0
  46. package/Server/API/BaseAnalyticsAPI.ts +4 -1
  47. package/Server/API/CommonAPI.ts +35 -0
  48. package/Server/API/DashboardAPI.ts +340 -15
  49. package/Server/API/TelemetryAPI.ts +1622 -3
  50. package/Server/API/UserIncomingCallNumberAPI.ts +31 -0
  51. package/Server/DatabaseConfig.ts +26 -1
  52. package/Server/EnvironmentConfig.ts +13 -0
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/1785417351021-AddSessionReplay.ts +293 -0
  54. package/Server/Infrastructure/Postgres/SchemaMigrations/1785491583874-EnableSessionReplayByDefault.ts +67 -0
  55. package/Server/Infrastructure/Postgres/SchemaMigrations/1785496223183-AddMonitorSummaryToIncidentAndAlert.ts +33 -0
  56. package/Server/Infrastructure/Postgres/SchemaMigrations/1785516996695-AddSessionReplayReliabilityColumns.ts +40 -0
  57. package/Server/Infrastructure/Postgres/SchemaMigrations/1785533806494-AddSessionReplayCorrelationColumns.ts +54 -0
  58. package/Server/Infrastructure/Postgres/SchemaMigrations/1785749674203-AddRedisAndPostgresHealthNotificationColumns.ts +104 -0
  59. package/Server/Infrastructure/Postgres/SchemaMigrations/1785763818197-AddAutoRemediation.ts +349 -0
  60. package/Server/Infrastructure/Postgres/SchemaMigrations/1785768089408-AddRemediationVerification.ts +67 -0
  61. package/Server/Infrastructure/Postgres/SchemaMigrations/1785776960660-AddRunnerCapabilities.ts +23 -0
  62. package/Server/Infrastructure/Postgres/SchemaMigrations/1785790000000-AddIncidentInvestigationGating.ts +42 -0
  63. package/Server/Infrastructure/Postgres/SchemaMigrations/1785800000000-AddRunbookCredential.ts +84 -0
  64. package/Server/Infrastructure/Postgres/SchemaMigrations/1785810000000-RenameRunbookAgentToRunner.ts +152 -0
  65. package/Server/Infrastructure/Postgres/SchemaMigrations/1785860000000-SessionReplayDefaultToSensitiveInputMasking.ts +81 -0
  66. package/Server/Infrastructure/Postgres/SchemaMigrations/1785870000000-AddAiCommandRemediation.ts +151 -0
  67. package/Server/Infrastructure/Postgres/SchemaMigrations/1785880000000-AlignRunnerSchemaWithEntities.ts +597 -0
  68. package/Server/Infrastructure/Postgres/SchemaMigrations/1785890000000-AddFixVerificationAndAutomaticCodeFixes.ts +71 -0
  69. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +32 -0
  70. package/Server/Services/AIRunService.ts +10 -0
  71. package/Server/Services/AIService.ts +30 -0
  72. package/Server/Services/AlertService.ts +41 -4
  73. package/Server/Services/AlertSeverityService.ts +25 -11
  74. package/Server/Services/AlertStateService.ts +25 -11
  75. package/Server/Services/AutoRemediationRuleEngineService.ts +1101 -0
  76. package/Server/Services/{RunbookAgentOwnerTeamService.ts → AutoRemediationRuleService.ts} +1 -1
  77. package/Server/Services/AutoRemediationSuggestionService.ts +183 -0
  78. package/Server/Services/BillingService.ts +50 -1
  79. package/Server/Services/DatabaseService.ts +92 -4
  80. package/Server/Services/IncidentService.ts +56 -4
  81. package/Server/Services/IncidentSeverityService.ts +25 -11
  82. package/Server/Services/IncidentStateService.ts +25 -11
  83. package/Server/Services/Index.ts +19 -0
  84. package/Server/Services/MonitorService.ts +24 -0
  85. package/Server/Services/MonitorStatusService.ts +25 -11
  86. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +18 -19
  87. package/Server/Services/NetworkDeviceLabelRuleService.ts +39 -0
  88. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +18 -19
  89. package/Server/Services/NetworkDeviceOwnerRuleService.ts +37 -0
  90. package/Server/Services/NetworkDeviceService.ts +172 -21
  91. package/Server/Services/NetworkSiteAssignmentRuleService.ts +92 -12
  92. package/Server/Services/NetworkSiteService.ts +27 -10
  93. package/Server/Services/ProjectService.ts +47 -0
  94. package/Server/Services/RumApplicationService.ts +240 -1
  95. package/Server/Services/RumSessionChunkService.ts +11 -0
  96. package/Server/Services/RumSessionErasureRequestService.ts +197 -0
  97. package/Server/Services/RumSessionPinService.ts +213 -0
  98. package/Server/Services/RumSessionReplayViewService.ts +201 -0
  99. package/Server/Services/RumSessionService.ts +123 -0
  100. package/Server/Services/RunbookCredentialService.ts +76 -0
  101. package/Server/Services/{RunbookAgentJobService.ts → RunnerJobService.ts} +202 -51
  102. package/Server/Services/{RunbookAgentOwnerUserService.ts → RunnerOwnerTeamService.ts} +1 -1
  103. package/Server/Services/RunnerOwnerUserService.ts +10 -0
  104. package/Server/Services/RunnerService.ts +172 -0
  105. package/Server/Services/ScheduledMaintenanceStateService.ts +25 -11
  106. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +15 -1
  107. package/Server/Services/ServiceService.ts +8 -2
  108. package/Server/Services/StatusPageService.ts +240 -36
  109. package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +20 -1
  110. package/Server/Services/TelemetryExceptionService.ts +3 -16
  111. package/Server/Services/TelemetryUsageBillingService.ts +33 -2
  112. package/Server/Services/TraceAggregationService.ts +196 -32
  113. package/Server/Types/Billing/MeteredPlan/AllMeteredPlans.ts +17 -0
  114. package/Server/Types/Billing/MeteredPlan/ServerMeteredPlan.ts +10 -0
  115. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +63 -7
  116. package/Server/Utils/AI/CodeFix/CodeFixAgentAuth.ts +128 -0
  117. package/Server/Utils/AI/CodeFix/CodeFixAgentAvailability.ts +54 -0
  118. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +17 -10
  119. package/Server/Utils/AI/CodeFix/CodeFixRunQueue.ts +8 -6
  120. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +943 -0
  121. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +866 -0
  122. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +823 -0
  123. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +103 -12
  124. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +75 -17
  125. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +28 -6
  126. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +202 -12
  127. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +264 -14
  128. package/Server/Utils/AI/SRE/Insights/Triage.ts +2 -7
  129. package/Server/Utils/AI/SRE/InvestigationGrader.ts +5 -24
  130. package/Server/Utils/AI/SRE/InvestigationQueue.ts +259 -20
  131. package/Server/Utils/AI/SRE/PostedRootCause.ts +82 -0
  132. package/Server/Utils/AI/SRE/README.md +3 -2
  133. package/Server/Utils/AI/SRE/RemediationHandoff.ts +82 -0
  134. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +6 -19
  135. package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +2 -2
  136. package/Server/Utils/Alert/AlertPrivacyFilter.ts +58 -0
  137. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +604 -0
  138. package/Server/Utils/AutoRemediation/RemediationVerifier.ts +619 -0
  139. package/Server/Utils/CorsOptions.ts +52 -0
  140. package/Server/Utils/Database/RelationIdUtil.ts +68 -0
  141. package/Server/Utils/Incident/IncidentPrivacyFilter.ts +60 -0
  142. package/Server/Utils/InstanceHealth/PostgresHealth.ts +286 -0
  143. package/Server/Utils/InstanceHealth/RedisHealth.ts +434 -0
  144. package/Server/Utils/Monitor/MonitorAlert.ts +20 -0
  145. package/Server/Utils/Monitor/MonitorIncident.ts +20 -0
  146. package/Server/Utils/Monitor/MonitorResource.ts +19 -0
  147. package/Server/Utils/Monitor/MonitorSummaryCapture.ts +104 -0
  148. package/Server/Utils/NetworkDevice/RulePatternValidator.ts +44 -0
  149. package/Server/Utils/OpenAPI.ts +2 -1
  150. package/Server/Utils/Runbook/RunbookExecutePermission.ts +94 -0
  151. package/Server/Utils/SessionReplay/SessionReplayErasureTombstone.ts +128 -0
  152. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +586 -0
  153. package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +188 -0
  154. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1449 -0
  155. package/Server/Utils/SessionReplay/SessionReplayRetention.ts +114 -0
  156. package/Server/Utils/SessionReplay/SessionReplayTargeting.ts +144 -0
  157. package/Server/Utils/SessionReplay/SessionReplayUsage.ts +92 -0
  158. package/Server/Utils/StartServer.ts +47 -3
  159. package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +44 -10
  160. package/Tests/App/Dashboard/AddWidgetModal.test.tsx +557 -0
  161. package/Tests/App/Dashboard/WidgetCatalog.test.ts +479 -0
  162. package/Tests/App/StatusPage/BulkAddStatusPageMonitors.test.ts +343 -0
  163. package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +320 -0
  164. package/Tests/Models/AnalyticsModels/RumSessionSchema.test.ts +455 -0
  165. package/Tests/Models/AnalyticsModels/SessionIdCorrelation.test.ts +158 -0
  166. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +447 -0
  167. package/Tests/Models/RunnerVersionLabel.test.ts +223 -0
  168. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +1287 -0
  169. package/Tests/Server/API/LegacyRunbookAgentRoutes.test.ts +117 -0
  170. package/Tests/Server/API/SessionReplayAPI.test.ts +2093 -0
  171. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +429 -0
  172. package/Tests/Server/API/UserSmsApi.test.ts +68 -2
  173. package/Tests/Server/DatabaseConfig.test.ts +150 -0
  174. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +2 -2
  175. package/Tests/Server/Infrastructure/ProcessSignalDelivery.test.ts +2 -3
  176. package/Tests/Server/Services/AIRunCodeFixClaimScoping.test.ts +100 -0
  177. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +8 -0
  178. package/Tests/Server/Services/AutoRemediationCommandRuleEngine.test.ts +334 -0
  179. package/Tests/Server/Services/AutoRemediationRuleEngineService.test.ts +517 -0
  180. package/Tests/Server/Services/BillingService.test.ts +158 -1
  181. package/Tests/Server/Services/DatabaseServiceEmptyUpdate.test.ts +24 -2
  182. package/Tests/Server/Services/DatabaseServiceSanitizeUpdateData.test.ts +17 -10
  183. package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +128 -0
  184. package/Tests/Server/Services/DatabaseServiceUpdateWriteRouting.test.ts +178 -0
  185. package/Tests/Server/Services/DatabaseServiceUpdateWriteRoutingMonitor.test.ts +206 -0
  186. package/Tests/Server/Services/MonitorServiceOperationalStatusSelection.test.ts +145 -0
  187. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +726 -0
  188. package/Tests/Server/Services/NetworkDeviceSiteAssignment.test.ts +570 -9
  189. package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +94 -1
  190. package/Tests/Server/Services/NetworkSiteService.test.ts +85 -0
  191. package/Tests/Server/Services/RumApplicationReplayHealth.test.ts +114 -0
  192. package/Tests/Server/Services/RunbookCredentialService.test.ts +657 -0
  193. package/Tests/Server/Services/SessionReplayCreatePath.test.ts +376 -0
  194. package/Tests/Server/Services/SessionReplayGateCacheInvalidation.test.ts +211 -0
  195. package/Tests/Server/Services/SessionReplayMetering.test.ts +174 -0
  196. package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +555 -0
  197. package/Tests/Server/Services/TelemetryExceptionAIFixReadiness.test.ts +25 -4
  198. package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +17 -2
  199. package/Tests/Server/Services/TraceAggregationService.test.ts +48 -0
  200. package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +855 -0
  201. package/Tests/Server/Services/UpdateOneByIdKeepsRowId.test.ts +38 -27
  202. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +44 -0
  203. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +475 -0
  204. package/Tests/Server/Utils/AI/CodeFix/CodeFixAgentAuth.test.ts +257 -0
  205. package/Tests/Server/Utils/AI/CodeFix/CodeFixAgentAvailability.test.ts +236 -0
  206. package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +44 -6
  207. package/Tests/Server/Utils/AI/CodeFixRunQueue.test.ts +47 -1
  208. package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +2 -2
  209. package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +294 -0
  210. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +2 -2
  211. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +47 -3
  212. package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +233 -0
  213. package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +463 -0
  214. package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
  215. package/Tests/Server/Utils/AI/RemediationAllowlistNormalization.test.ts +248 -0
  216. package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +1008 -0
  217. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +887 -0
  218. package/Tests/Server/Utils/AI/RemediationHandoff.test.ts +306 -0
  219. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +745 -0
  220. package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +291 -0
  221. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +1050 -0
  222. package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +350 -0
  223. package/Tests/Server/Utils/AutoRemediation/RemediationVerifier.test.ts +341 -0
  224. package/Tests/Server/Utils/CorsOptions.test.ts +119 -0
  225. package/Tests/Server/Utils/Database/RelationIdUtil.test.ts +120 -0
  226. package/Tests/Server/Utils/Database/ResolveReferenceId.test.ts +60 -0
  227. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +337 -0
  228. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +671 -0
  229. package/Tests/Server/Utils/Monitor/MonitorSummaryCapture.test.ts +205 -0
  230. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +313 -0
  231. package/Tests/Server/Utils/PushNotificationUtil.test.ts +228 -0
  232. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +177 -0
  233. package/Tests/Server/Utils/SessionReplay/SessionReplayOriginAllowlist.test.ts +108 -0
  234. package/Tests/Server/Utils/SessionReplay/SessionReplayRetention.test.ts +229 -0
  235. package/Tests/Server/Utils/SessionReplay/SessionReplayTargeting.test.ts +246 -0
  236. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +110 -0
  237. package/Tests/Types/AI/AIRunStatus.test.ts +25 -0
  238. package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +1063 -0
  239. package/Tests/Types/BaseDatabase/AggregationType.test.ts +56 -0
  240. package/Tests/Types/CustomField/CustomFieldDropdownOption.test.ts +227 -0
  241. package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +811 -0
  242. package/Tests/Types/Dashboard/RumDashboardTemplate.test.ts +1238 -0
  243. package/Tests/Types/Day/DayOfWeek.test.ts +46 -0
  244. package/Tests/Types/Docker/DockerInventoryExtractor.test.ts +249 -0
  245. package/Tests/Types/Kubernetes/KubernetesInventoryExtractor.test.ts +231 -0
  246. package/Tests/Types/Kubernetes/KubernetesRightSizing.test.ts +323 -0
  247. package/Tests/Types/Metrics/MetricDownsamplingRetentionDays.test.ts +77 -0
  248. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +42 -14
  249. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +2 -2
  250. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +3 -2
  251. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +1 -1
  252. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +6 -3
  253. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +285 -0
  254. package/Tests/Types/Podman/PodmanInventoryExtractor.test.ts +159 -0
  255. package/Tests/Types/Runbook/RunbookExecutionDeadline.test.ts +268 -0
  256. package/Tests/Types/Runbook/RunbookStepType.test.ts +242 -0
  257. package/Tests/Types/Telemetry/TelemetryRetentionConfig.test.ts +225 -0
  258. package/Tests/Types/Text.test.ts +60 -0
  259. package/Tests/UI/Components/AutocompleteTextInputMenu.test.tsx +555 -0
  260. package/Tests/UI/Components/BulkLabelActions.test.tsx +1502 -0
  261. package/Tests/UI/Components/BulkOwnerActions.test.tsx +1255 -0
  262. package/Tests/UI/Components/CustomFields/DropdownOptionsInput.test.tsx +228 -0
  263. package/Tests/UI/Components/Detail/DropdownColors.test.tsx +128 -0
  264. package/Tests/UI/Components/Dropdown/DropdownValueBadge.test.tsx +60 -0
  265. package/Tests/UI/Components/FilterModalOperatorMenu.test.tsx +674 -0
  266. package/Tests/UI/Components/Forms/ColorPicker.test.tsx +48 -0
  267. package/Tests/UI/Components/Forms/ColorPickerPopup.test.tsx +222 -0
  268. package/Tests/UI/Components/Forms/IconPickerPopup.test.tsx +270 -0
  269. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +125 -6
  270. package/Tests/UI/Components/OperatorSelectorFilterTypes.test.tsx +1595 -0
  271. package/Tests/UI/Components/OperatorSelectorKeyboard.test.tsx +851 -0
  272. package/Tests/UI/Components/OperatorSelectorMenu.test.tsx +1229 -0
  273. package/Tests/UI/Components/Pagination.test.tsx +85 -0
  274. package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +248 -0
  275. package/Tests/UI/Rum/ChunkLoader.test.ts +790 -0
  276. package/Tests/UI/Rum/ReplayScrubber.test.tsx +236 -0
  277. package/Tests/UI/Rum/ReplayStage.test.tsx +606 -0
  278. package/Tests/UI/Utils/Timezone.test.ts +86 -0
  279. package/Tests/UI/Utils/UseClockTick.test.tsx +276 -0
  280. package/Tests/Utils/AiRemediation/CommandPolicy.test.ts +1063 -0
  281. package/Tests/Utils/Dashboard/ClockWidgetFormat.test.ts +1374 -0
  282. package/Tests/Utils/Dashboard/DashboardClockComponent.test.ts +362 -0
  283. package/Tests/Utils/Dashboard/DashboardHtmlComponent.test.ts +217 -0
  284. package/Tests/Utils/Dashboard/HtmlWidgetDocument.test.ts +656 -0
  285. package/Tests/Utils/Dashboard/ValueWidgetLayout.test.ts +1007 -0
  286. package/Tests/Utils/Metrics/MetricSeriesScope.test.ts +1197 -0
  287. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +839 -0
  288. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +69 -0
  289. package/Tests/Utils/Rules/RulePatternMatchUtil.test.ts +274 -0
  290. package/Tests/Utils/Rum/ChunkMath.test.ts +286 -0
  291. package/Tests/Utils/Rum/Masking.test.ts +186 -0
  292. package/Tests/Utils/Rum/SessionIdentity.test.ts +272 -0
  293. package/Tests/Utils/Rum/SessionSampling.test.ts +164 -0
  294. package/Tests/Utils/Rum/UrlScrubber.test.ts +175 -0
  295. package/Tests/Utils/StatusPage/Report.test.ts +708 -0
  296. package/Tests/Utils/ValueFormatter.test.ts +299 -1
  297. package/Types/AI/AIRunStatus.ts +18 -7
  298. package/Types/AI/AIRunType.ts +18 -0
  299. package/Types/AI/FixVerificationStatus.ts +21 -0
  300. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +16 -0
  301. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +304 -0
  302. package/Types/AutoRemediation/AutoRemediationExecutionMode.ts +17 -0
  303. package/Types/AutoRemediation/AutoRemediationSuggestionStatus.ts +35 -0
  304. package/Types/AutoRemediation/AutoRemediationSuggestionType.ts +17 -0
  305. package/Types/AutoRemediation/AutoRemediationTriggerEntity.ts +11 -0
  306. package/Types/AutoRemediation/AutoRemediationVerificationStatus.ts +21 -0
  307. package/Types/CustomField/CustomFieldDropdownOption.ts +190 -0
  308. package/Types/Dashboard/DashboardComponentType.ts +2 -0
  309. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +4 -0
  310. package/Types/Dashboard/DashboardComponents/DashboardClockComponent.ts +45 -0
  311. package/Types/Dashboard/DashboardComponents/DashboardHtmlComponent.ts +27 -0
  312. package/Types/Dashboard/DashboardComponents/DashboardValueComponent.ts +8 -0
  313. package/Types/Dashboard/DashboardTemplates.ts +516 -0
  314. package/Types/Date.ts +6 -0
  315. package/Types/Email/EmailTemplateType.ts +2 -0
  316. package/Types/Kubernetes/KubernetesRightSizing.ts +353 -0
  317. package/Types/MeteredPlan/ProductType.ts +1 -0
  318. package/Types/Monitor/MonitorStepMetricMonitor.ts +27 -1
  319. package/Types/Monitor/MonitorSteps.ts +5 -0
  320. package/Types/Monitor/MonitorSummarySnapshot.ts +88 -0
  321. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +52 -10
  322. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +7 -5
  323. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +101 -20
  324. package/Types/Monitor/RumAlertTemplates.ts +386 -0
  325. package/Types/Permission.ts +204 -24
  326. package/Types/Rum/SessionReplay.ts +452 -0
  327. package/Types/Rum/SessionReplayCaptureTrigger.ts +26 -0
  328. package/Types/Rum/SessionReplayConsentMode.ts +27 -0
  329. package/Types/Rum/SessionReplayMaskingMode.ts +86 -0
  330. package/Types/Rum/SessionReplayTriggerReason.ts +31 -0
  331. package/Types/Runbook/RunbookCredentialType.ts +6 -0
  332. package/Types/Runbook/RunbookStep.ts +66 -1
  333. package/Types/Runbook/RunbookStepType.ts +26 -0
  334. package/Types/Runbook/RunnerJobOrigin.ts +20 -0
  335. package/Types/Runbook/{RunbookAgentJobStatus.ts → RunnerJobStatus.ts} +2 -2
  336. package/Types/StatusPage/StatusPageReport.ts +99 -0
  337. package/Types/Telemetry/TelemetryRetentionConfig.ts +18 -1
  338. package/Types/Text.ts +33 -0
  339. package/UI/Components/AutocompleteTextInput/AutocompleteTextInput.tsx +260 -75
  340. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +99 -9
  341. package/UI/Components/BulkUpdate/BulkOwnerActions.tsx +11 -0
  342. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +19 -14
  343. package/UI/Components/CustomFields/DropdownOptionsInput.tsx +144 -54
  344. package/UI/Components/Detail/Detail.tsx +9 -22
  345. package/UI/Components/Dropdown/Dropdown.tsx +2 -5
  346. package/UI/Components/Dropdown/DropdownMenuZIndex.ts +7 -0
  347. package/UI/Components/Dropdown/DropdownValueBadge.tsx +61 -0
  348. package/UI/Components/Filters/OperatorSelector.tsx +350 -39
  349. package/UI/Components/Forms/Fields/ColorPicker.tsx +60 -27
  350. package/UI/Components/Forms/Fields/IconPicker.tsx +89 -60
  351. package/UI/Components/Forms/Validation.ts +9 -4
  352. package/UI/Components/List/List.tsx +1 -0
  353. package/UI/Components/ModelTable/CustomFieldColumns.tsx +41 -32
  354. package/UI/Components/Pagination/Pagination.tsx +33 -10
  355. package/UI/Components/Table/Table.tsx +1 -0
  356. package/UI/Types/UseAnchoredFieldPopup.ts +321 -0
  357. package/UI/Utils/Dropdown.ts +26 -0
  358. package/UI/Utils/Timezone.ts +18 -2
  359. package/UI/Utils/UseClockTick.ts +78 -0
  360. package/Utils/AiRemediation/CommandPolicy.ts +398 -0
  361. package/Utils/Dashboard/ClockWidgetFormat.ts +604 -0
  362. package/Utils/Dashboard/Components/DashboardClockComponent.ts +181 -0
  363. package/Utils/Dashboard/Components/DashboardHtmlComponent.ts +162 -0
  364. package/Utils/Dashboard/Components/DashboardValueComponent.ts +12 -1
  365. package/Utils/Dashboard/Components/Index.ts +14 -0
  366. package/Utils/Dashboard/HtmlWidgetDocument.ts +309 -0
  367. package/Utils/Dashboard/ValueWidgetLayout.ts +471 -0
  368. package/Utils/Metrics/MetricSeriesScope.ts +301 -0
  369. package/Utils/Monitor/MonitorSummarySnapshotUtil.ts +593 -0
  370. package/Utils/NetworkSite/CidrMatchUtil.ts +30 -17
  371. package/Utils/Rules/RulePatternMatchUtil.ts +103 -0
  372. package/Utils/Rum/ChunkMath.ts +211 -0
  373. package/Utils/Rum/Masking.ts +168 -0
  374. package/Utils/Rum/SessionIdentity.ts +230 -0
  375. package/Utils/Rum/SessionSampling.ts +108 -0
  376. package/Utils/Rum/UrlScrubber.ts +185 -0
  377. package/Utils/Schema/ModelSchema.ts +27 -3
  378. package/Utils/StatusPage/Report.ts +304 -0
  379. package/Utils/ValueFormatter.ts +300 -54
  380. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +63 -0
  381. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
  382. package/build/dist/Models/AnalyticsModels/Index.js +10 -0
  383. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  384. package/build/dist/Models/AnalyticsModels/Log.js +56 -0
  385. package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
  386. package/build/dist/Models/AnalyticsModels/RumSession.js +1159 -0
  387. package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -0
  388. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +670 -0
  389. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -0
  390. package/build/dist/Models/AnalyticsModels/Span.js +56 -0
  391. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  392. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +54 -0
  393. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -1
  394. package/build/dist/Models/DatabaseModels/AIRun.js +32 -0
  395. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  396. package/build/dist/Models/DatabaseModels/Alert.js +30 -0
  397. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  398. package/build/dist/Models/DatabaseModels/AlertCustomField.js +1 -1
  399. package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
  400. package/build/dist/Models/DatabaseModels/AlertFeed.js +1 -0
  401. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  402. package/build/dist/Models/DatabaseModels/AutoRemediationRule.js +998 -0
  403. package/build/dist/Models/DatabaseModels/AutoRemediationRule.js.map +1 -0
  404. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +917 -0
  405. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -0
  406. package/build/dist/Models/DatabaseModels/CodeRepository.js +132 -0
  407. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  408. package/build/dist/Models/DatabaseModels/GlobalConfig.js +327 -0
  409. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  410. package/build/dist/Models/DatabaseModels/Incident.js +30 -0
  411. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  412. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +1 -1
  413. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  414. package/build/dist/Models/DatabaseModels/IncidentFeed.js +1 -0
  415. package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
  416. package/build/dist/Models/DatabaseModels/Index.js +20 -8
  417. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  418. package/build/dist/Models/DatabaseModels/InstanceHealthLog.js +8 -0
  419. package/build/dist/Models/DatabaseModels/InstanceHealthLog.js.map +1 -1
  420. package/build/dist/Models/DatabaseModels/MonitorCustomField.js +1 -1
  421. package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
  422. package/build/dist/Models/DatabaseModels/MonitorStatus.js +1 -1
  423. package/build/dist/Models/DatabaseModels/MonitorStatus.js.map +1 -1
  424. package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js +2 -2
  425. package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js.map +1 -1
  426. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js +2 -2
  427. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js.map +1 -1
  428. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +1 -1
  429. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
  430. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +1 -1
  431. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
  432. package/build/dist/Models/DatabaseModels/Project.js +235 -0
  433. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  434. package/build/dist/Models/DatabaseModels/RumApplication.js +930 -0
  435. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  436. package/build/dist/Models/DatabaseModels/RumSessionErasureRequest.js +591 -0
  437. package/build/dist/Models/DatabaseModels/RumSessionErasureRequest.js.map +1 -0
  438. package/build/dist/Models/DatabaseModels/RumSessionPin.js +483 -0
  439. package/build/dist/Models/DatabaseModels/RumSessionPin.js.map +1 -0
  440. package/build/dist/Models/DatabaseModels/RumSessionReplayView.js +433 -0
  441. package/build/dist/Models/DatabaseModels/RumSessionReplayView.js.map +1 -0
  442. package/build/dist/Models/DatabaseModels/RunbookCredential.js +693 -0
  443. package/build/dist/Models/DatabaseModels/RunbookCredential.js.map +1 -0
  444. package/build/dist/Models/DatabaseModels/RunbookSecret.js +8 -8
  445. package/build/dist/Models/DatabaseModels/RunbookSecret.js.map +1 -1
  446. package/build/dist/Models/DatabaseModels/{RunbookAgent.js → Runner.js} +235 -70
  447. package/build/dist/Models/DatabaseModels/Runner.js.map +1 -0
  448. package/build/dist/Models/DatabaseModels/{RunbookAgentJob.js → RunnerJob.js} +173 -40
  449. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -0
  450. package/build/dist/Models/DatabaseModels/{RunbookAgentOwnerTeam.js → RunnerOwnerTeam.js} +57 -57
  451. package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js.map +1 -0
  452. package/build/dist/Models/DatabaseModels/{RunbookAgentOwnerUser.js → RunnerOwnerUser.js} +57 -57
  453. package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js.map +1 -0
  454. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +1 -1
  455. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
  456. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +1 -1
  457. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
  458. package/build/dist/Models/DatabaseModels/TeamCustomField.js +1 -1
  459. package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
  460. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +1 -1
  461. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
  462. package/build/dist/Server/API/AIAgentDataAPI.js +130 -45
  463. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  464. package/build/dist/Server/API/AIAgentTaskAPI.js +26 -36
  465. package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
  466. package/build/dist/Server/API/AIAgentTaskLogAPI.js +11 -28
  467. package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -1
  468. package/build/dist/Server/API/AutoRemediationAPI.js +416 -0
  469. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -0
  470. package/build/dist/Server/API/BaseAnalyticsAPI.js +4 -1
  471. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  472. package/build/dist/Server/API/CommonAPI.js +24 -0
  473. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  474. package/build/dist/Server/API/DashboardAPI.js +265 -6
  475. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  476. package/build/dist/Server/API/TelemetryAPI.js +940 -3
  477. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  478. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +18 -0
  479. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  480. package/build/dist/Server/DatabaseConfig.js +23 -4
  481. package/build/dist/Server/DatabaseConfig.js.map +1 -1
  482. package/build/dist/Server/EnvironmentConfig.js +8 -0
  483. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  484. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785417351021-AddSessionReplay.js +106 -0
  485. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785417351021-AddSessionReplay.js.map +1 -0
  486. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785491583874-EnableSessionReplayByDefault.js +37 -0
  487. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785491583874-EnableSessionReplayByDefault.js.map +1 -0
  488. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785496223183-AddMonitorSummaryToIncidentAndAlert.js +18 -0
  489. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785496223183-AddMonitorSummaryToIncidentAndAlert.js.map +1 -0
  490. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785516996695-AddSessionReplayReliabilityColumns.js +29 -0
  491. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785516996695-AddSessionReplayReliabilityColumns.js.map +1 -0
  492. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785533806494-AddSessionReplayCorrelationColumns.js +35 -0
  493. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785533806494-AddSessionReplayCorrelationColumns.js.map +1 -0
  494. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785749674203-AddRedisAndPostgresHealthNotificationColumns.js +40 -0
  495. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785749674203-AddRedisAndPostgresHealthNotificationColumns.js.map +1 -0
  496. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785763818197-AddAutoRemediation.js +128 -0
  497. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785763818197-AddAutoRemediation.js.map +1 -0
  498. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785768089408-AddRemediationVerification.js +28 -0
  499. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785768089408-AddRemediationVerification.js.map +1 -0
  500. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785776960660-AddRunnerCapabilities.js +14 -0
  501. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785776960660-AddRunnerCapabilities.js.map +1 -0
  502. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785790000000-AddIncidentInvestigationGating.js +27 -0
  503. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785790000000-AddIncidentInvestigationGating.js.map +1 -0
  504. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785800000000-AddRunbookCredential.js +44 -0
  505. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785800000000-AddRunbookCredential.js.map +1 -0
  506. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785810000000-RenameRunbookAgentToRunner.js +88 -0
  507. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785810000000-RenameRunbookAgentToRunner.js.map +1 -0
  508. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785860000000-SessionReplayDefaultToSensitiveInputMasking.js +59 -0
  509. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785860000000-SessionReplayDefaultToSensitiveInputMasking.js.map +1 -0
  510. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785870000000-AddAiCommandRemediation.js +76 -0
  511. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785870000000-AddAiCommandRemediation.js.map +1 -0
  512. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785880000000-AlignRunnerSchemaWithEntities.js +214 -0
  513. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785880000000-AlignRunnerSchemaWithEntities.js.map +1 -0
  514. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785890000000-AddFixVerificationAndAutomaticCodeFixes.js +44 -0
  515. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785890000000-AddFixVerificationAndAutomaticCodeFixes.js.map +1 -0
  516. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +32 -0
  517. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  518. package/build/dist/Server/Services/AIRunService.js +1 -4
  519. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  520. package/build/dist/Server/Services/AIService.js +26 -0
  521. package/build/dist/Server/Services/AIService.js.map +1 -1
  522. package/build/dist/Server/Services/AlertService.js +37 -4
  523. package/build/dist/Server/Services/AlertService.js.map +1 -1
  524. package/build/dist/Server/Services/AlertSeverityService.js +24 -11
  525. package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
  526. package/build/dist/Server/Services/AlertStateService.js +24 -11
  527. package/build/dist/Server/Services/AlertStateService.js.map +1 -1
  528. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +917 -0
  529. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -0
  530. package/build/dist/Server/Services/{RunbookAgentOwnerTeamService.js → AutoRemediationRuleService.js} +2 -2
  531. package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -0
  532. package/build/dist/Server/Services/AutoRemediationSuggestionService.js +127 -0
  533. package/build/dist/Server/Services/AutoRemediationSuggestionService.js.map +1 -0
  534. package/build/dist/Server/Services/BillingService.js +45 -1
  535. package/build/dist/Server/Services/BillingService.js.map +1 -1
  536. package/build/dist/Server/Services/DatabaseService.js +72 -4
  537. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  538. package/build/dist/Server/Services/IncidentService.js +52 -4
  539. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  540. package/build/dist/Server/Services/IncidentSeverityService.js +24 -11
  541. package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
  542. package/build/dist/Server/Services/IncidentStateService.js +24 -11
  543. package/build/dist/Server/Services/IncidentStateService.js.map +1 -1
  544. package/build/dist/Server/Services/Index.js +18 -0
  545. package/build/dist/Server/Services/Index.js.map +1 -1
  546. package/build/dist/Server/Services/MonitorService.js +24 -0
  547. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  548. package/build/dist/Server/Services/MonitorStatusService.js +25 -11
  549. package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
  550. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +12 -11
  551. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  552. package/build/dist/Server/Services/NetworkDeviceLabelRuleService.js +43 -0
  553. package/build/dist/Server/Services/NetworkDeviceLabelRuleService.js.map +1 -1
  554. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +12 -11
  555. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  556. package/build/dist/Server/Services/NetworkDeviceOwnerRuleService.js +41 -0
  557. package/build/dist/Server/Services/NetworkDeviceOwnerRuleService.js.map +1 -1
  558. package/build/dist/Server/Services/NetworkDeviceService.js +129 -20
  559. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  560. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +67 -10
  561. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -1
  562. package/build/dist/Server/Services/NetworkSiteService.js +19 -8
  563. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  564. package/build/dist/Server/Services/ProjectService.js +43 -0
  565. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  566. package/build/dist/Server/Services/RumApplicationService.js +202 -0
  567. package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
  568. package/build/dist/Server/Services/RumSessionChunkService.js +9 -0
  569. package/build/dist/Server/Services/RumSessionChunkService.js.map +1 -0
  570. package/build/dist/Server/Services/RumSessionErasureRequestService.js +190 -0
  571. package/build/dist/Server/Services/RumSessionErasureRequestService.js.map +1 -0
  572. package/build/dist/Server/Services/RumSessionPinService.js +208 -0
  573. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -0
  574. package/build/dist/Server/Services/RumSessionReplayViewService.js +180 -0
  575. package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -0
  576. package/build/dist/Server/Services/RumSessionService.js +102 -0
  577. package/build/dist/Server/Services/RumSessionService.js.map +1 -0
  578. package/build/dist/Server/Services/RunbookCredentialService.js +67 -0
  579. package/build/dist/Server/Services/RunbookCredentialService.js.map +1 -0
  580. package/build/dist/Server/Services/{RunbookAgentJobService.js → RunnerJobService.js} +158 -46
  581. package/build/dist/Server/Services/RunnerJobService.js.map +1 -0
  582. package/build/dist/Server/Services/{RunbookAgentOwnerUserService.js → RunnerOwnerTeamService.js} +2 -2
  583. package/build/dist/Server/Services/RunnerOwnerTeamService.js.map +1 -0
  584. package/build/dist/Server/Services/RunnerOwnerUserService.js +9 -0
  585. package/build/dist/Server/Services/RunnerOwnerUserService.js.map +1 -0
  586. package/build/dist/Server/Services/RunnerService.js +168 -0
  587. package/build/dist/Server/Services/RunnerService.js.map +1 -0
  588. package/build/dist/Server/Services/ScheduledMaintenanceStateService.js +24 -11
  589. package/build/dist/Server/Services/ScheduledMaintenanceStateService.js.map +1 -1
  590. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +15 -1
  591. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  592. package/build/dist/Server/Services/ServiceService.js +8 -2
  593. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  594. package/build/dist/Server/Services/StatusPageService.js +173 -16
  595. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  596. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +17 -1
  597. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
  598. package/build/dist/Server/Services/TelemetryExceptionService.js +3 -16
  599. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  600. package/build/dist/Server/Services/TelemetryUsageBillingService.js +31 -3
  601. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  602. package/build/dist/Server/Services/TraceAggregationService.js +106 -2
  603. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  604. package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js +16 -0
  605. package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js.map +1 -1
  606. package/build/dist/Server/Types/Billing/MeteredPlan/ServerMeteredPlan.js +9 -0
  607. package/build/dist/Server/Types/Billing/MeteredPlan/ServerMeteredPlan.js.map +1 -1
  608. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +38 -6
  609. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  610. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js +104 -0
  611. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js.map +1 -0
  612. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAvailability.js +54 -0
  613. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAvailability.js.map +1 -0
  614. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +11 -7
  615. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  616. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js +3 -4
  617. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js.map +1 -1
  618. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +724 -0
  619. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -0
  620. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +668 -0
  621. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -0
  622. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +657 -0
  623. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -0
  624. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +52 -7
  625. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  626. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +53 -5
  627. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  628. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +25 -6
  629. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
  630. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +131 -17
  631. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
  632. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +200 -5
  633. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  634. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js +2 -7
  635. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js.map +1 -1
  636. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +4 -17
  637. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
  638. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +203 -19
  639. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  640. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js +89 -0
  641. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -0
  642. package/build/dist/Server/Utils/AI/SRE/RemediationHandoff.js +82 -0
  643. package/build/dist/Server/Utils/AI/SRE/RemediationHandoff.js.map +1 -0
  644. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +4 -19
  645. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
  646. package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js +2 -2
  647. package/build/dist/Server/Utils/Alert/AlertPrivacyFilter.js +36 -0
  648. package/build/dist/Server/Utils/Alert/AlertPrivacyFilter.js.map +1 -1
  649. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +498 -0
  650. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -0
  651. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +492 -0
  652. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -0
  653. package/build/dist/Server/Utils/CorsOptions.js +47 -0
  654. package/build/dist/Server/Utils/CorsOptions.js.map +1 -0
  655. package/build/dist/Server/Utils/Database/RelationIdUtil.js +51 -0
  656. package/build/dist/Server/Utils/Database/RelationIdUtil.js.map +1 -0
  657. package/build/dist/Server/Utils/Incident/IncidentPrivacyFilter.js +38 -0
  658. package/build/dist/Server/Utils/Incident/IncidentPrivacyFilter.js.map +1 -1
  659. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +194 -0
  660. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +1 -0
  661. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +292 -0
  662. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -0
  663. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +9 -0
  664. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  665. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +9 -0
  666. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  667. package/build/dist/Server/Utils/Monitor/MonitorResource.js +16 -0
  668. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  669. package/build/dist/Server/Utils/Monitor/MonitorSummaryCapture.js +92 -0
  670. package/build/dist/Server/Utils/Monitor/MonitorSummaryCapture.js.map +1 -0
  671. package/build/dist/Server/Utils/NetworkDevice/RulePatternValidator.js +27 -0
  672. package/build/dist/Server/Utils/NetworkDevice/RulePatternValidator.js.map +1 -0
  673. package/build/dist/Server/Utils/OpenAPI.js +2 -1
  674. package/build/dist/Server/Utils/OpenAPI.js.map +1 -1
  675. package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js +67 -0
  676. package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js.map +1 -0
  677. package/build/dist/Server/Utils/SessionReplay/SessionReplayErasureTombstone.js +98 -0
  678. package/build/dist/Server/Utils/SessionReplay/SessionReplayErasureTombstone.js.map +1 -0
  679. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +378 -0
  680. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -0
  681. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js +137 -0
  682. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -0
  683. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +998 -0
  684. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -0
  685. package/build/dist/Server/Utils/SessionReplay/SessionReplayRetention.js +59 -0
  686. package/build/dist/Server/Utils/SessionReplay/SessionReplayRetention.js.map +1 -0
  687. package/build/dist/Server/Utils/SessionReplay/SessionReplayTargeting.js +98 -0
  688. package/build/dist/Server/Utils/SessionReplay/SessionReplayTargeting.js.map +1 -0
  689. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +69 -0
  690. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -0
  691. package/build/dist/Server/Utils/StartServer.js +40 -3
  692. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  693. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +27 -6
  694. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
  695. package/build/dist/Types/AI/AIRunStatus.js +17 -5
  696. package/build/dist/Types/AI/AIRunStatus.js.map +1 -1
  697. package/build/dist/Types/AI/AIRunType.js +18 -0
  698. package/build/dist/Types/AI/AIRunType.js.map +1 -1
  699. package/build/dist/Types/AI/FixVerificationStatus.js +22 -0
  700. package/build/dist/Types/AI/FixVerificationStatus.js.map +1 -0
  701. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +16 -0
  702. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  703. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +192 -0
  704. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -0
  705. package/build/dist/Types/AutoRemediation/AutoRemediationExecutionMode.js +18 -0
  706. package/build/dist/Types/AutoRemediation/AutoRemediationExecutionMode.js.map +1 -0
  707. package/build/dist/Types/AutoRemediation/AutoRemediationSuggestionStatus.js +31 -0
  708. package/build/dist/Types/AutoRemediation/AutoRemediationSuggestionStatus.js.map +1 -0
  709. package/build/dist/Types/AutoRemediation/AutoRemediationSuggestionType.js +18 -0
  710. package/build/dist/Types/AutoRemediation/AutoRemediationSuggestionType.js.map +1 -0
  711. package/build/dist/Types/AutoRemediation/AutoRemediationTriggerEntity.js +12 -0
  712. package/build/dist/Types/AutoRemediation/AutoRemediationTriggerEntity.js.map +1 -0
  713. package/build/dist/Types/AutoRemediation/AutoRemediationVerificationStatus.js +22 -0
  714. package/build/dist/Types/AutoRemediation/AutoRemediationVerificationStatus.js.map +1 -0
  715. package/build/dist/Types/CustomField/CustomFieldDropdownOption.js +110 -0
  716. package/build/dist/Types/CustomField/CustomFieldDropdownOption.js.map +1 -0
  717. package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
  718. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  719. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +4 -0
  720. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  721. package/build/dist/Types/Dashboard/DashboardComponents/DashboardClockComponent.js +19 -0
  722. package/build/dist/Types/Dashboard/DashboardComponents/DashboardClockComponent.js.map +1 -0
  723. package/build/dist/Types/Dashboard/DashboardComponents/DashboardHtmlComponent.js +2 -0
  724. package/build/dist/Types/Dashboard/DashboardComponents/DashboardHtmlComponent.js.map +1 -0
  725. package/build/dist/Types/Dashboard/DashboardTemplates.js +487 -0
  726. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  727. package/build/dist/Types/Date.js +6 -0
  728. package/build/dist/Types/Date.js.map +1 -1
  729. package/build/dist/Types/Email/EmailTemplateType.js +2 -0
  730. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  731. package/build/dist/Types/Kubernetes/KubernetesRightSizing.js +229 -0
  732. package/build/dist/Types/Kubernetes/KubernetesRightSizing.js.map +1 -0
  733. package/build/dist/Types/MeteredPlan/ProductType.js +1 -0
  734. package/build/dist/Types/MeteredPlan/ProductType.js.map +1 -1
  735. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +12 -2
  736. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
  737. package/build/dist/Types/Monitor/MonitorSteps.js +5 -0
  738. package/build/dist/Types/Monitor/MonitorSteps.js.map +1 -1
  739. package/build/dist/Types/Monitor/MonitorSummarySnapshot.js +13 -0
  740. package/build/dist/Types/Monitor/MonitorSummarySnapshot.js.map +1 -0
  741. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +40 -8
  742. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  743. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +4 -3
  744. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  745. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +50 -10
  746. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  747. package/build/dist/Types/Monitor/RumAlertTemplates.js +297 -0
  748. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -0
  749. package/build/dist/Types/Permission.js +184 -24
  750. package/build/dist/Types/Permission.js.map +1 -1
  751. package/build/dist/Types/Rum/SessionReplay.js +155 -0
  752. package/build/dist/Types/Rum/SessionReplay.js.map +1 -0
  753. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +26 -0
  754. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -0
  755. package/build/dist/Types/Rum/SessionReplayConsentMode.js +27 -0
  756. package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -0
  757. package/build/dist/Types/Rum/SessionReplayMaskingMode.js +79 -0
  758. package/build/dist/Types/Rum/SessionReplayMaskingMode.js.map +1 -0
  759. package/build/dist/Types/Rum/SessionReplayTriggerReason.js +28 -0
  760. package/build/dist/Types/Rum/SessionReplayTriggerReason.js.map +1 -0
  761. package/build/dist/Types/Runbook/RunbookCredentialType.js +7 -0
  762. package/build/dist/Types/Runbook/RunbookCredentialType.js.map +1 -0
  763. package/build/dist/Types/Runbook/RunbookStep.js +20 -1
  764. package/build/dist/Types/Runbook/RunbookStep.js.map +1 -1
  765. package/build/dist/Types/Runbook/RunbookStepType.js +24 -0
  766. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  767. package/build/dist/Types/Runbook/RunnerJobOrigin.js +21 -0
  768. package/build/dist/Types/Runbook/RunnerJobOrigin.js.map +1 -0
  769. package/build/dist/Types/Runbook/RunnerJobStatus.js +22 -0
  770. package/build/dist/Types/Runbook/RunnerJobStatus.js.map +1 -0
  771. package/build/dist/Types/StatusPage/StatusPageReport.js +22 -0
  772. package/build/dist/Types/StatusPage/StatusPageReport.js.map +1 -0
  773. package/build/dist/Types/Telemetry/TelemetryRetentionConfig.js.map +1 -1
  774. package/build/dist/Types/Text.js +29 -0
  775. package/build/dist/Types/Text.js.map +1 -1
  776. package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js +143 -28
  777. package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js.map +1 -1
  778. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +82 -9
  779. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  780. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js +11 -0
  781. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js.map +1 -1
  782. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +11 -13
  783. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  784. package/build/dist/UI/Components/CustomFields/DropdownOptionsInput.js +76 -45
  785. package/build/dist/UI/Components/CustomFields/DropdownOptionsInput.js.map +1 -1
  786. package/build/dist/UI/Components/Detail/Detail.js +3 -8
  787. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  788. package/build/dist/UI/Components/Dropdown/Dropdown.js +2 -5
  789. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  790. package/build/dist/UI/Components/Dropdown/DropdownMenuZIndex.js +7 -0
  791. package/build/dist/UI/Components/Dropdown/DropdownMenuZIndex.js.map +1 -0
  792. package/build/dist/UI/Components/Dropdown/DropdownValueBadge.js +32 -0
  793. package/build/dist/UI/Components/Dropdown/DropdownValueBadge.js.map +1 -0
  794. package/build/dist/UI/Components/Filters/OperatorSelector.js +210 -20
  795. package/build/dist/UI/Components/Filters/OperatorSelector.js.map +1 -1
  796. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +26 -10
  797. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
  798. package/build/dist/UI/Components/Forms/Fields/IconPicker.js +28 -13
  799. package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
  800. package/build/dist/UI/Components/Forms/Validation.js +9 -5
  801. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  802. package/build/dist/UI/Components/List/List.js +1 -1
  803. package/build/dist/UI/Components/List/List.js.map +1 -1
  804. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +21 -19
  805. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
  806. package/build/dist/UI/Components/Pagination/Pagination.js +14 -3
  807. package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
  808. package/build/dist/UI/Components/Table/Table.js +1 -1
  809. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  810. package/build/dist/UI/Types/UseAnchoredFieldPopup.js +197 -0
  811. package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -0
  812. package/build/dist/UI/Utils/Dropdown.js +18 -0
  813. package/build/dist/UI/Utils/Dropdown.js.map +1 -1
  814. package/build/dist/UI/Utils/Timezone.js +13 -2
  815. package/build/dist/UI/Utils/Timezone.js.map +1 -1
  816. package/build/dist/UI/Utils/UseClockTick.js +41 -0
  817. package/build/dist/UI/Utils/UseClockTick.js.map +1 -0
  818. package/build/dist/Utils/AiRemediation/CommandPolicy.js +303 -0
  819. package/build/dist/Utils/AiRemediation/CommandPolicy.js.map +1 -0
  820. package/build/dist/Utils/Dashboard/ClockWidgetFormat.js +232 -0
  821. package/build/dist/Utils/Dashboard/ClockWidgetFormat.js.map +1 -0
  822. package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js +146 -0
  823. package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js.map +1 -0
  824. package/build/dist/Utils/Dashboard/Components/DashboardHtmlComponent.js +133 -0
  825. package/build/dist/Utils/Dashboard/Components/DashboardHtmlComponent.js.map +1 -0
  826. package/build/dist/Utils/Dashboard/Components/DashboardValueComponent.js +10 -1
  827. package/build/dist/Utils/Dashboard/Components/DashboardValueComponent.js.map +1 -1
  828. package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
  829. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  830. package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js +198 -0
  831. package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js.map +1 -0
  832. package/build/dist/Utils/Dashboard/ValueWidgetLayout.js +276 -0
  833. package/build/dist/Utils/Dashboard/ValueWidgetLayout.js.map +1 -0
  834. package/build/dist/Utils/Metrics/MetricSeriesScope.js +203 -0
  835. package/build/dist/Utils/Metrics/MetricSeriesScope.js.map +1 -0
  836. package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js +382 -0
  837. package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js.map +1 -0
  838. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +13 -7
  839. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
  840. package/build/dist/Utils/Rules/RulePatternMatchUtil.js +87 -0
  841. package/build/dist/Utils/Rules/RulePatternMatchUtil.js.map +1 -0
  842. package/build/dist/Utils/Rum/ChunkMath.js +147 -0
  843. package/build/dist/Utils/Rum/ChunkMath.js.map +1 -0
  844. package/build/dist/Utils/Rum/Masking.js +143 -0
  845. package/build/dist/Utils/Rum/Masking.js.map +1 -0
  846. package/build/dist/Utils/Rum/SessionIdentity.js +161 -0
  847. package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -0
  848. package/build/dist/Utils/Rum/SessionSampling.js +91 -0
  849. package/build/dist/Utils/Rum/SessionSampling.js.map +1 -0
  850. package/build/dist/Utils/Rum/UrlScrubber.js +144 -0
  851. package/build/dist/Utils/Rum/UrlScrubber.js.map +1 -0
  852. package/build/dist/Utils/Schema/ModelSchema.js +28 -3
  853. package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
  854. package/build/dist/Utils/StatusPage/Report.js +194 -0
  855. package/build/dist/Utils/StatusPage/Report.js.map +1 -0
  856. package/build/dist/Utils/ValueFormatter.js +239 -46
  857. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  858. package/jest.config.json +3 -0
  859. package/package.json +1 -1
  860. package/tsconfig.json +19 -1
  861. package/Server/Services/RunbookAgentService.ts +0 -93
  862. package/build/dist/Models/DatabaseModels/RunbookAgent.js.map +0 -1
  863. package/build/dist/Models/DatabaseModels/RunbookAgentJob.js.map +0 -1
  864. package/build/dist/Models/DatabaseModels/RunbookAgentOwnerTeam.js.map +0 -1
  865. package/build/dist/Models/DatabaseModels/RunbookAgentOwnerUser.js.map +0 -1
  866. package/build/dist/Server/Services/RunbookAgentJobService.js.map +0 -1
  867. package/build/dist/Server/Services/RunbookAgentOwnerTeamService.js.map +0 -1
  868. package/build/dist/Server/Services/RunbookAgentOwnerUserService.js.map +0 -1
  869. package/build/dist/Server/Services/RunbookAgentService.js +0 -91
  870. package/build/dist/Server/Services/RunbookAgentService.js.map +0 -1
  871. package/build/dist/Types/Runbook/RunbookAgentJobStatus.js +0 -22
  872. package/build/dist/Types/Runbook/RunbookAgentJobStatus.js.map +0 -1
@@ -0,0 +1,1197 @@
1
+ import IsNull from "../../../Types/BaseDatabase/IsNull";
2
+ import Dictionary from "../../../Types/Dictionary";
3
+ import { JSONObject } from "../../../Types/JSON";
4
+ import MetricQueryConfigData from "../../../Types/Metrics/MetricQueryConfigData";
5
+ import MetricViewData from "../../../Types/Metrics/MetricViewData";
6
+ import {
7
+ DictionaryFilterOperator,
8
+ DictionaryFilterOperatorOption,
9
+ detectOperatorFromValue,
10
+ getOperatorOption,
11
+ } from "../../../UI/Components/Dictionary/DictionaryFilterOperator";
12
+ import MetricSeriesScope, {
13
+ MetricSeriesFilterValue,
14
+ } from "../../../Utils/Metrics/MetricSeriesScope";
15
+ import { describe, expect, test } from "@jest/globals";
16
+
17
+ /*
18
+ * A metric monitor grouped by an attribute (host.name, pod, device) opens
19
+ * ONE incident per breaching group, but every one of those incidents
20
+ * stores the SAME monitor-wide query configs. Charting them verbatim shows
21
+ * every group — so an incident about prod-01 renders a wall of unrelated
22
+ * hosts, and once the Top-N cap trims the result the breaching host can be
23
+ * missing from its own incident page entirely.
24
+ *
25
+ * MetricSeriesScope narrows those configs back to the incident's own
26
+ * series using the labels recorded on the incident. These tests lock the
27
+ * three properties the fix depends on:
28
+ *
29
+ * 1. PER-QUERY intersection. The monitor worker groups every query by
30
+ * the UNION of group-by keys across all queries, so seriesLabels
31
+ * routinely carries keys a given query never grouped by. Filtering a
32
+ * query on a dimension it did not group by would narrow the chart to
33
+ * something the monitor never evaluated.
34
+ * 2. Faithful value translation. "" means "the attribute was absent on
35
+ * this series" — that is the IsEmpty operator, not an equality
36
+ * against the empty string (which the chart's filter sanitizer drops
37
+ * on the floor, silently un-scoping the chart).
38
+ * 3. Identity preservation. React hosts call this on every load; handing
39
+ * back a fresh-but-equal object where nothing changed would churn
40
+ * state and refetch.
41
+ */
42
+
43
+ interface QueryConfigFixture {
44
+ id?: string | undefined;
45
+ groupByAttributeKeys?: Array<string> | undefined;
46
+ attributes?: Dictionary<unknown> | undefined;
47
+ metricName?: string | undefined;
48
+ topN?: number | undefined;
49
+ }
50
+
51
+ function buildQueryConfig(
52
+ fixture: QueryConfigFixture = {},
53
+ ): MetricQueryConfigData {
54
+ return {
55
+ id: fixture.id || "query-id-1",
56
+ metricAliasData: {
57
+ metricVariable: "a",
58
+ title: "",
59
+ description: "",
60
+ legend: "",
61
+ legendUnit: "",
62
+ },
63
+ metricQueryData: {
64
+ filterData: {
65
+ metricName: fixture.metricName || "system.cpu.utilization",
66
+ aggegationType: "Avg",
67
+ ...(fixture.attributes ? { attributes: fixture.attributes } : {}),
68
+ },
69
+ ...(fixture.groupByAttributeKeys
70
+ ? { groupByAttributeKeys: fixture.groupByAttributeKeys }
71
+ : {}),
72
+ ...(fixture.topN === undefined ? {} : { topN: fixture.topN }),
73
+ },
74
+ } as unknown as MetricQueryConfigData;
75
+ }
76
+
77
+ function getAttributes(
78
+ queryConfig: MetricQueryConfigData | undefined,
79
+ ): Dictionary<unknown> {
80
+ return (
81
+ queryConfig?.metricQueryData?.filterData as Dictionary<unknown> | undefined
82
+ )?.["attributes"] as Dictionary<unknown> | undefined as Dictionary<unknown>;
83
+ }
84
+
85
+ describe("MetricSeriesScope.hasSeriesLabels", () => {
86
+ test("is false for undefined, null and the empty object", () => {
87
+ expect(MetricSeriesScope.hasSeriesLabels(undefined)).toBe(false);
88
+ expect(MetricSeriesScope.hasSeriesLabels(null)).toBe(false);
89
+ expect(MetricSeriesScope.hasSeriesLabels({})).toBe(false);
90
+ });
91
+
92
+ test("is true as soon as there is one label", () => {
93
+ expect(MetricSeriesScope.hasSeriesLabels({ "host.name": "prod-01" })).toBe(
94
+ true,
95
+ );
96
+ // Even an unset value still identifies a series.
97
+ expect(MetricSeriesScope.hasSeriesLabels({ "host.name": "" })).toBe(true);
98
+ });
99
+ });
100
+
101
+ describe("MetricSeriesScope.getSeriesFilterAttributesForQuery", () => {
102
+ test("returns nothing when the incident carries no series labels", () => {
103
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
104
+ groupByAttributeKeys: ["host.name"],
105
+ });
106
+
107
+ expect(
108
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
109
+ queryConfig,
110
+ seriesLabels: undefined,
111
+ }),
112
+ ).toEqual({});
113
+ expect(
114
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
115
+ queryConfig,
116
+ seriesLabels: null,
117
+ }),
118
+ ).toEqual({});
119
+ expect(
120
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
121
+ queryConfig,
122
+ seriesLabels: {},
123
+ }),
124
+ ).toEqual({});
125
+ });
126
+
127
+ test("returns nothing for a missing query config", () => {
128
+ expect(
129
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
130
+ queryConfig: undefined,
131
+ seriesLabels: { "host.name": "prod-01" },
132
+ }),
133
+ ).toEqual({});
134
+ expect(
135
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
136
+ queryConfig: null,
137
+ seriesLabels: { "host.name": "prod-01" },
138
+ }),
139
+ ).toEqual({});
140
+ });
141
+
142
+ test("returns nothing when the query is not grouped at all", () => {
143
+ /*
144
+ * An ungrouped query already renders a single line — narrowing it
145
+ * would change what the monitor evaluated.
146
+ */
147
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({});
148
+
149
+ expect(
150
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
151
+ queryConfig,
152
+ seriesLabels: { "host.name": "prod-01" },
153
+ }),
154
+ ).toEqual({});
155
+ });
156
+
157
+ test("maps a grouped key to an exact-equality string filter", () => {
158
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
159
+ groupByAttributeKeys: ["host.name"],
160
+ });
161
+
162
+ expect(
163
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
164
+ queryConfig,
165
+ seriesLabels: { "host.name": "prod-01" },
166
+ }),
167
+ ).toEqual({ "host.name": "prod-01" });
168
+ });
169
+
170
+ test("maps every grouped key when the series is multi-dimensional", () => {
171
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
172
+ groupByAttributeKeys: ["host.name", "service.name"],
173
+ });
174
+
175
+ expect(
176
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
177
+ queryConfig,
178
+ seriesLabels: { "host.name": "prod-01", "service.name": "api" },
179
+ }),
180
+ ).toEqual({ "host.name": "prod-01", "service.name": "api" });
181
+ });
182
+
183
+ test("ignores label keys this query did not group by", () => {
184
+ /*
185
+ * The monitor worker groups EVERY query by the union of group-by keys
186
+ * across all queries, so seriesLabels carries keys a given query never
187
+ * asked for. Filtering on them would scope the chart to something the
188
+ * monitor never evaluated.
189
+ */
190
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
191
+ groupByAttributeKeys: ["host.name"],
192
+ });
193
+
194
+ expect(
195
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
196
+ queryConfig,
197
+ seriesLabels: {
198
+ "host.name": "prod-01",
199
+ "k8s.pod.name": "checkout-abc",
200
+ },
201
+ }),
202
+ ).toEqual({ "host.name": "prod-01" });
203
+ });
204
+
205
+ test("ignores grouped keys the incident's series says nothing about", () => {
206
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
207
+ groupByAttributeKeys: ["host.name", "service.name"],
208
+ });
209
+
210
+ expect(
211
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
212
+ queryConfig,
213
+ seriesLabels: { "host.name": "prod-01" },
214
+ }),
215
+ ).toEqual({ "host.name": "prod-01" });
216
+ });
217
+
218
+ test("translates an empty label value into the IsEmpty operator", () => {
219
+ /*
220
+ * "" is what the series builder writes when the attribute is missing
221
+ * on the sample. An equality filter on "" is dropped by the chart's
222
+ * sanitizer, which would silently un-scope the chart; IsNull compiles
223
+ * to "key absent OR value empty", which is exactly the series.
224
+ */
225
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
226
+ groupByAttributeKeys: ["host.name"],
227
+ });
228
+
229
+ const filters: Dictionary<MetricSeriesFilterValue> =
230
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
231
+ queryConfig,
232
+ seriesLabels: { "host.name": "" },
233
+ });
234
+
235
+ expect(Object.keys(filters)).toEqual(["host.name"]);
236
+ expect(filters["host.name"]).toBeInstanceOf(IsNull);
237
+ });
238
+
239
+ test("treats null and an explicitly-undefined label value as IsEmpty", () => {
240
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
241
+ groupByAttributeKeys: ["host.name"],
242
+ });
243
+
244
+ const withNull: Dictionary<MetricSeriesFilterValue> =
245
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
246
+ queryConfig,
247
+ seriesLabels: { "host.name": null } as unknown as JSONObject,
248
+ });
249
+ expect(withNull["host.name"]).toBeInstanceOf(IsNull);
250
+
251
+ const withUndefined: Dictionary<MetricSeriesFilterValue> =
252
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
253
+ queryConfig,
254
+ seriesLabels: { "host.name": undefined } as unknown as JSONObject,
255
+ });
256
+ expect(withUndefined["host.name"]).toBeInstanceOf(IsNull);
257
+ });
258
+
259
+ test("skips whitespace-only values rather than pretending they are unset", () => {
260
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
261
+ groupByAttributeKeys: ["host.name"],
262
+ });
263
+
264
+ expect(
265
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
266
+ queryConfig,
267
+ seriesLabels: { "host.name": " " },
268
+ }),
269
+ ).toEqual({});
270
+ });
271
+
272
+ test("preserves surrounding whitespace and case on real values", () => {
273
+ /*
274
+ * Attributes are matched byte-exactly against the analytics store, so
275
+ * trimming or lower-casing here would silently chart nothing.
276
+ */
277
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
278
+ groupByAttributeKeys: ["host.name"],
279
+ });
280
+
281
+ expect(
282
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
283
+ queryConfig,
284
+ seriesLabels: { "host.name": " PROD-01 " },
285
+ }),
286
+ ).toEqual({ "host.name": " PROD-01 " });
287
+ });
288
+
289
+ test("stringifies numeric and boolean label values", () => {
290
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
291
+ groupByAttributeKeys: ["http.status_code", "is.canary"],
292
+ });
293
+
294
+ expect(
295
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
296
+ queryConfig,
297
+ seriesLabels: { "http.status_code": 200, "is.canary": false },
298
+ }),
299
+ ).toEqual({ "http.status_code": "200", "is.canary": "false" });
300
+ });
301
+
302
+ test("keeps the zero value — it is a real label, not an empty one", () => {
303
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
304
+ groupByAttributeKeys: ["pool_id"],
305
+ });
306
+
307
+ expect(
308
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
309
+ queryConfig,
310
+ seriesLabels: { pool_id: 0 },
311
+ }),
312
+ ).toEqual({ pool_id: "0" });
313
+ });
314
+
315
+ test("skips non-finite numbers", () => {
316
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
317
+ groupByAttributeKeys: ["weird"],
318
+ });
319
+
320
+ expect(
321
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
322
+ queryConfig,
323
+ seriesLabels: { weird: Number.NaN },
324
+ }),
325
+ ).toEqual({});
326
+ expect(
327
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
328
+ queryConfig,
329
+ seriesLabels: { weird: Number.POSITIVE_INFINITY },
330
+ }),
331
+ ).toEqual({});
332
+ });
333
+
334
+ test("skips array and object label values", () => {
335
+ /*
336
+ * Metric attributes are a Map(String, String); String([1,2]) or
337
+ * "[object Object]" would compile to a predicate matching nothing,
338
+ * which is worse than leaving the chart un-narrowed.
339
+ */
340
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
341
+ groupByAttributeKeys: ["tags", "meta", "when"],
342
+ });
343
+
344
+ expect(
345
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
346
+ queryConfig,
347
+ seriesLabels: {
348
+ tags: ["a", "b"],
349
+ meta: { nested: true },
350
+ when: new Date("2024-01-01T00:00:00.000Z"),
351
+ } as unknown as JSONObject,
352
+ }),
353
+ ).toEqual({});
354
+ });
355
+
356
+ test("keeps dotted and resource-prefixed keys verbatim", () => {
357
+ /*
358
+ * The `resource.` prefix is applied at INGEST, so the group-by
359
+ * dropdown, the stored query config and seriesLabels all agree on the
360
+ * literal key. Adding or stripping it here would address a different
361
+ * map entry and match nothing.
362
+ */
363
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
364
+ groupByAttributeKeys: ["resource.k8s.node.name", "container.name"],
365
+ });
366
+
367
+ expect(
368
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
369
+ queryConfig,
370
+ seriesLabels: {
371
+ "resource.k8s.node.name": "ip-10-0-1-7",
372
+ "container.name": "api.1.xyz",
373
+ },
374
+ }),
375
+ ).toEqual({
376
+ "resource.k8s.node.name": "ip-10-0-1-7",
377
+ "container.name": "api.1.xyz",
378
+ });
379
+ });
380
+
381
+ test("does not treat a bare key as the resource-prefixed one", () => {
382
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
383
+ groupByAttributeKeys: ["resource.host.name"],
384
+ });
385
+
386
+ expect(
387
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
388
+ queryConfig,
389
+ seriesLabels: { "host.name": "prod-01" },
390
+ }),
391
+ ).toEqual({});
392
+ });
393
+
394
+ test("ignores blank group-by keys and collapses duplicates", () => {
395
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
396
+ groupByAttributeKeys: ["", "host.name", "host.name"],
397
+ });
398
+
399
+ const filters: Dictionary<MetricSeriesFilterValue> =
400
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
401
+ queryConfig,
402
+ seriesLabels: { "host.name": "prod-01", "": "ignored" },
403
+ });
404
+
405
+ expect(filters).toEqual({ "host.name": "prod-01" });
406
+ expect(Object.keys(filters)).toHaveLength(1);
407
+ });
408
+
409
+ test("does not pick up inherited prototype keys as labels", () => {
410
+ const queryConfig: MetricQueryConfigData = buildQueryConfig({
411
+ groupByAttributeKeys: ["toString", "constructor"],
412
+ });
413
+
414
+ expect(
415
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
416
+ queryConfig,
417
+ seriesLabels: { "host.name": "prod-01" },
418
+ }),
419
+ ).toEqual({});
420
+ });
421
+ });
422
+
423
+ describe("MetricSeriesScope.scopeQueryConfigsToSeries — identity", () => {
424
+ test("hands back the very same array when there are no series labels", () => {
425
+ const queryConfigs: Array<MetricQueryConfigData> = [
426
+ buildQueryConfig({ groupByAttributeKeys: ["host.name"] }),
427
+ ];
428
+
429
+ expect(
430
+ MetricSeriesScope.scopeQueryConfigsToSeries({
431
+ queryConfigs,
432
+ seriesLabels: undefined,
433
+ }),
434
+ ).toBe(queryConfigs);
435
+ expect(
436
+ MetricSeriesScope.scopeQueryConfigsToSeries({
437
+ queryConfigs,
438
+ seriesLabels: {},
439
+ }),
440
+ ).toBe(queryConfigs);
441
+ });
442
+
443
+ test("hands back the very same array when nothing could be narrowed", () => {
444
+ const queryConfigs: Array<MetricQueryConfigData> = [
445
+ buildQueryConfig({ groupByAttributeKeys: ["host.name"] }),
446
+ ];
447
+
448
+ expect(
449
+ MetricSeriesScope.scopeQueryConfigsToSeries({
450
+ queryConfigs,
451
+ seriesLabels: { "k8s.pod.name": "checkout-abc" },
452
+ }),
453
+ ).toBe(queryConfigs);
454
+ });
455
+
456
+ test("tolerates a missing or empty query config list", () => {
457
+ expect(
458
+ MetricSeriesScope.scopeQueryConfigsToSeries({
459
+ queryConfigs: undefined,
460
+ seriesLabels: { "host.name": "prod-01" },
461
+ }),
462
+ ).toEqual([]);
463
+ expect(
464
+ MetricSeriesScope.scopeQueryConfigsToSeries({
465
+ queryConfigs: null,
466
+ seriesLabels: { "host.name": "prod-01" },
467
+ }),
468
+ ).toEqual([]);
469
+ expect(
470
+ MetricSeriesScope.scopeQueryConfigsToSeries({
471
+ queryConfigs: [],
472
+ seriesLabels: { "host.name": "prod-01" },
473
+ }),
474
+ ).toEqual([]);
475
+ });
476
+ });
477
+
478
+ describe("MetricSeriesScope.scopeQueryConfigsToSeries — narrowing", () => {
479
+ test("pushes the series onto the query's attribute filter", () => {
480
+ const queryConfigs: Array<MetricQueryConfigData> = [
481
+ buildQueryConfig({ groupByAttributeKeys: ["host.name"] }),
482
+ ];
483
+
484
+ const scoped: Array<MetricQueryConfigData> =
485
+ MetricSeriesScope.scopeQueryConfigsToSeries({
486
+ queryConfigs,
487
+ seriesLabels: { "host.name": "prod-01" },
488
+ });
489
+
490
+ expect(scoped).not.toBe(queryConfigs);
491
+ expect(getAttributes(scoped[0])).toEqual({ "host.name": "prod-01" });
492
+ });
493
+
494
+ test("keeps the group-by so the surviving series is still named", () => {
495
+ /*
496
+ * Dropping groupByAttributeKeys would collapse the legend to a bare
497
+ * metric name — the chart would be correct but would no longer say
498
+ * WHICH host it is showing.
499
+ */
500
+ const queryConfigs: Array<MetricQueryConfigData> = [
501
+ buildQueryConfig({ groupByAttributeKeys: ["host.name"] }),
502
+ ];
503
+
504
+ const scoped: Array<MetricQueryConfigData> =
505
+ MetricSeriesScope.scopeQueryConfigsToSeries({
506
+ queryConfigs,
507
+ seriesLabels: { "host.name": "prod-01" },
508
+ });
509
+
510
+ expect(scoped[0]?.metricQueryData.groupByAttributeKeys).toEqual([
511
+ "host.name",
512
+ ]);
513
+ });
514
+
515
+ test("merges with — and wins over — filters the monitor already carried", () => {
516
+ const queryConfigs: Array<MetricQueryConfigData> = [
517
+ buildQueryConfig({
518
+ groupByAttributeKeys: ["host.name"],
519
+ attributes: {
520
+ "deployment.environment": "production",
521
+ "host.name": "prod-99",
522
+ },
523
+ }),
524
+ ];
525
+
526
+ const scoped: Array<MetricQueryConfigData> =
527
+ MetricSeriesScope.scopeQueryConfigsToSeries({
528
+ queryConfigs,
529
+ seriesLabels: { "host.name": "prod-01" },
530
+ });
531
+
532
+ expect(getAttributes(scoped[0])).toEqual({
533
+ "deployment.environment": "production",
534
+ "host.name": "prod-01",
535
+ });
536
+ });
537
+
538
+ test("never mutates the query configs it was handed", () => {
539
+ const queryConfigs: Array<MetricQueryConfigData> = [
540
+ buildQueryConfig({
541
+ groupByAttributeKeys: ["host.name"],
542
+ attributes: { "deployment.environment": "production" },
543
+ }),
544
+ ];
545
+ const snapshot: string = JSON.stringify(queryConfigs);
546
+
547
+ MetricSeriesScope.scopeQueryConfigsToSeries({
548
+ queryConfigs,
549
+ seriesLabels: { "host.name": "prod-01" },
550
+ });
551
+
552
+ expect(JSON.stringify(queryConfigs)).toBe(snapshot);
553
+ expect(getAttributes(queryConfigs[0])).toEqual({
554
+ "deployment.environment": "production",
555
+ });
556
+ });
557
+
558
+ test("narrows each query by its OWN group-by only", () => {
559
+ /*
560
+ * The realistic shape: the worker groups both queries by the union
561
+ * {host.name, k8s.pod.name}, so the incident carries both keys — but
562
+ * the chart splits each query by only the keys that query configured.
563
+ */
564
+ const hostQuery: MetricQueryConfigData = buildQueryConfig({
565
+ id: "host-query",
566
+ groupByAttributeKeys: ["host.name"],
567
+ });
568
+ const podQuery: MetricQueryConfigData = buildQueryConfig({
569
+ id: "pod-query",
570
+ groupByAttributeKeys: ["k8s.pod.name"],
571
+ });
572
+
573
+ const scoped: Array<MetricQueryConfigData> =
574
+ MetricSeriesScope.scopeQueryConfigsToSeries({
575
+ queryConfigs: [hostQuery, podQuery],
576
+ seriesLabels: {
577
+ "host.name": "prod-01",
578
+ "k8s.pod.name": "checkout-abc",
579
+ },
580
+ });
581
+
582
+ expect(getAttributes(scoped[0])).toEqual({ "host.name": "prod-01" });
583
+ expect(getAttributes(scoped[1])).toEqual({
584
+ "k8s.pod.name": "checkout-abc",
585
+ });
586
+ });
587
+
588
+ test("passes ungrouped queries through untouched, by identity", () => {
589
+ const groupedQuery: MetricQueryConfigData = buildQueryConfig({
590
+ id: "grouped",
591
+ groupByAttributeKeys: ["host.name"],
592
+ });
593
+ const ungroupedQuery: MetricQueryConfigData = buildQueryConfig({
594
+ id: "ungrouped",
595
+ });
596
+
597
+ const scoped: Array<MetricQueryConfigData> =
598
+ MetricSeriesScope.scopeQueryConfigsToSeries({
599
+ queryConfigs: [groupedQuery, ungroupedQuery],
600
+ seriesLabels: { "host.name": "prod-01" },
601
+ });
602
+
603
+ expect(scoped[0]).not.toBe(groupedQuery);
604
+ expect(scoped[1]).toBe(ungroupedQuery);
605
+ });
606
+
607
+ test("preserves everything else on the query config", () => {
608
+ const original: MetricQueryConfigData = buildQueryConfig({
609
+ id: "keep-me",
610
+ groupByAttributeKeys: ["host.name"],
611
+ topN: 25,
612
+ });
613
+ original.chartType = undefined;
614
+ original.color = "#6366f1";
615
+ original.transformAsRate = true;
616
+ original.getSeries = () => {
617
+ return { title: "custom" };
618
+ };
619
+
620
+ const scoped: Array<MetricQueryConfigData> =
621
+ MetricSeriesScope.scopeQueryConfigsToSeries({
622
+ queryConfigs: [original],
623
+ seriesLabels: { "host.name": "prod-01" },
624
+ });
625
+
626
+ const result: MetricQueryConfigData | undefined = scoped[0];
627
+
628
+ expect(result?.id).toBe("keep-me");
629
+ expect(result?.color).toBe("#6366f1");
630
+ expect(result?.transformAsRate).toBe(true);
631
+ expect(result?.getSeries).toBe(original.getSeries);
632
+ expect(result?.metricAliasData?.metricVariable).toBe("a");
633
+ expect(result?.metricQueryData.topN).toBe(25);
634
+ expect(
635
+ (result?.metricQueryData.filterData as Dictionary<unknown>)["metricName"],
636
+ ).toBe("system.cpu.utilization");
637
+ expect(
638
+ (result?.metricQueryData.filterData as Dictionary<unknown>)[
639
+ "aggegationType"
640
+ ],
641
+ ).toBe("Avg");
642
+ });
643
+
644
+ test("creates the attributes bag when the query had no filters", () => {
645
+ const queryConfigs: Array<MetricQueryConfigData> = [
646
+ buildQueryConfig({ groupByAttributeKeys: ["host.name"] }),
647
+ ];
648
+
649
+ expect(getAttributes(queryConfigs[0])).toBeUndefined();
650
+
651
+ const scoped: Array<MetricQueryConfigData> =
652
+ MetricSeriesScope.scopeQueryConfigsToSeries({
653
+ queryConfigs,
654
+ seriesLabels: { "host.name": "prod-01" },
655
+ });
656
+
657
+ expect(getAttributes(scoped[0])).toEqual({ "host.name": "prod-01" });
658
+ });
659
+
660
+ test("survives a query config whose filterData is missing entirely", () => {
661
+ /*
662
+ * Query configs arrive from stored JSON (monitor steps, telemetryQuery
663
+ * on the incident) — a hand-edited or legacy shape must not throw and
664
+ * blank the whole page.
665
+ */
666
+ const malformed: MetricQueryConfigData = {
667
+ metricQueryData: {
668
+ groupByAttributeKeys: ["host.name"],
669
+ },
670
+ } as unknown as MetricQueryConfigData;
671
+
672
+ const scoped: Array<MetricQueryConfigData> =
673
+ MetricSeriesScope.scopeQueryConfigsToSeries({
674
+ queryConfigs: [malformed],
675
+ seriesLabels: { "host.name": "prod-01" },
676
+ });
677
+
678
+ expect(getAttributes(scoped[0])).toEqual({ "host.name": "prod-01" });
679
+ });
680
+
681
+ test("scopes a multi-key series across a multi-key query", () => {
682
+ const queryConfigs: Array<MetricQueryConfigData> = [
683
+ buildQueryConfig({
684
+ groupByAttributeKeys: ["resource.host.name", "disk.device"],
685
+ }),
686
+ ];
687
+
688
+ const scoped: Array<MetricQueryConfigData> =
689
+ MetricSeriesScope.scopeQueryConfigsToSeries({
690
+ queryConfigs,
691
+ seriesLabels: {
692
+ "resource.host.name": "prod-01",
693
+ "disk.device": "/dev/sda1",
694
+ },
695
+ });
696
+
697
+ expect(getAttributes(scoped[0])).toEqual({
698
+ "resource.host.name": "prod-01",
699
+ "disk.device": "/dev/sda1",
700
+ });
701
+ });
702
+
703
+ test("still narrows on the keys it can when one label is unusable", () => {
704
+ const queryConfigs: Array<MetricQueryConfigData> = [
705
+ buildQueryConfig({
706
+ groupByAttributeKeys: ["host.name", "tags"],
707
+ }),
708
+ ];
709
+
710
+ const scoped: Array<MetricQueryConfigData> =
711
+ MetricSeriesScope.scopeQueryConfigsToSeries({
712
+ queryConfigs,
713
+ seriesLabels: {
714
+ "host.name": "prod-01",
715
+ tags: ["a", "b"],
716
+ } as unknown as JSONObject,
717
+ });
718
+
719
+ expect(getAttributes(scoped[0])).toEqual({ "host.name": "prod-01" });
720
+ });
721
+ });
722
+
723
+ describe("MetricSeriesScope.scopeMetricViewDataToSeries", () => {
724
+ function buildMetricViewData(
725
+ queryConfigs: Array<MetricQueryConfigData>,
726
+ ): MetricViewData {
727
+ return {
728
+ startAndEndDate: null,
729
+ rangeToken: "Past 1 Hour",
730
+ queryConfigs: queryConfigs,
731
+ formulaConfigs: [
732
+ {
733
+ metricAliasData: {
734
+ metricVariable: "b",
735
+ title: "",
736
+ description: "",
737
+ legend: "",
738
+ legendUnit: "",
739
+ },
740
+ metricFormulaData: { metricFormula: "a * 2" },
741
+ },
742
+ ],
743
+ } as unknown as MetricViewData;
744
+ }
745
+
746
+ test("passes null and undefined straight through", () => {
747
+ expect(
748
+ MetricSeriesScope.scopeMetricViewDataToSeries({
749
+ metricViewData: null,
750
+ seriesLabels: { "host.name": "prod-01" },
751
+ }),
752
+ ).toBeNull();
753
+ expect(
754
+ MetricSeriesScope.scopeMetricViewDataToSeries({
755
+ metricViewData: undefined,
756
+ seriesLabels: { "host.name": "prod-01" },
757
+ }),
758
+ ).toBeUndefined();
759
+ });
760
+
761
+ test("hands back the same object when nothing narrows", () => {
762
+ const metricViewData: MetricViewData = buildMetricViewData([
763
+ buildQueryConfig({ groupByAttributeKeys: ["host.name"] }),
764
+ ]);
765
+
766
+ expect(
767
+ MetricSeriesScope.scopeMetricViewDataToSeries({
768
+ metricViewData,
769
+ seriesLabels: undefined,
770
+ }),
771
+ ).toBe(metricViewData);
772
+ expect(
773
+ MetricSeriesScope.scopeMetricViewDataToSeries({
774
+ metricViewData,
775
+ seriesLabels: { "k8s.pod.name": "checkout-abc" },
776
+ }),
777
+ ).toBe(metricViewData);
778
+ });
779
+
780
+ test("narrows the query configs and keeps the rest of the view", () => {
781
+ const metricViewData: MetricViewData = buildMetricViewData([
782
+ buildQueryConfig({ groupByAttributeKeys: ["host.name"] }),
783
+ ]);
784
+
785
+ const scoped: MetricViewData | null | undefined =
786
+ MetricSeriesScope.scopeMetricViewDataToSeries({
787
+ metricViewData,
788
+ seriesLabels: { "host.name": "prod-01" },
789
+ });
790
+
791
+ expect(scoped).not.toBe(metricViewData);
792
+ expect(getAttributes(scoped?.queryConfigs[0])).toEqual({
793
+ "host.name": "prod-01",
794
+ });
795
+ expect(scoped?.rangeToken).toBe("Past 1 Hour");
796
+ expect(scoped?.formulaConfigs).toBe(metricViewData.formulaConfigs);
797
+ expect(scoped?.startAndEndDate).toBeNull();
798
+ });
799
+
800
+ test("never mutates the view data it was handed", () => {
801
+ const metricViewData: MetricViewData = buildMetricViewData([
802
+ buildQueryConfig({ groupByAttributeKeys: ["host.name"] }),
803
+ ]);
804
+ const snapshot: string = JSON.stringify(metricViewData);
805
+
806
+ MetricSeriesScope.scopeMetricViewDataToSeries({
807
+ metricViewData,
808
+ seriesLabels: { "host.name": "prod-01" },
809
+ });
810
+
811
+ expect(JSON.stringify(metricViewData)).toBe(snapshot);
812
+ });
813
+
814
+ test("keeps identity — and the shape — when queryConfigs is missing", () => {
815
+ /*
816
+ * queryConfigs is non-optional on the type, but this arrives from
817
+ * stored JSON. Rewriting a missing list into [] would both break the
818
+ * identity contract on every load and change the shape the host reads.
819
+ */
820
+ const metricViewData: MetricViewData = {
821
+ startAndEndDate: null,
822
+ formulaConfigs: [],
823
+ } as unknown as MetricViewData;
824
+
825
+ const scoped: MetricViewData | null | undefined =
826
+ MetricSeriesScope.scopeMetricViewDataToSeries({
827
+ metricViewData,
828
+ seriesLabels: { "host.name": "prod-01" },
829
+ });
830
+
831
+ expect(scoped).toBe(metricViewData);
832
+ expect(scoped?.queryConfigs).toBeUndefined();
833
+ });
834
+
835
+ test("keeps identity when the query config list is empty", () => {
836
+ const metricViewData: MetricViewData = buildMetricViewData([]);
837
+
838
+ expect(
839
+ MetricSeriesScope.scopeMetricViewDataToSeries({
840
+ metricViewData,
841
+ seriesLabels: { "host.name": "prod-01" },
842
+ }),
843
+ ).toBe(metricViewData);
844
+ });
845
+ });
846
+
847
+ /*
848
+ * The card subtitle ("scoped to the affected series (...)") is a claim
849
+ * about the chart below it. It therefore has to describe the narrowing
850
+ * that was APPLIED, never the raw labels — a summary that outruns the
851
+ * filter would have the UI vouch for a chart still showing every series,
852
+ * which is worse than the bug this class fixes. The final block below
853
+ * pins that as an invariant rather than case by case.
854
+ */
855
+ describe("MetricSeriesScope.getAppliedSeriesLabelSummary", () => {
856
+ test("is empty when there is no series", () => {
857
+ const queryConfigs: Array<MetricQueryConfigData> = [
858
+ buildQueryConfig({ groupByAttributeKeys: ["host.name"] }),
859
+ ];
860
+
861
+ expect(
862
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
863
+ queryConfigs,
864
+ seriesLabels: undefined,
865
+ }),
866
+ ).toBe("");
867
+ expect(
868
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
869
+ queryConfigs,
870
+ seriesLabels: null,
871
+ }),
872
+ ).toBe("");
873
+ expect(
874
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
875
+ queryConfigs,
876
+ seriesLabels: {},
877
+ }),
878
+ ).toBe("");
879
+ });
880
+
881
+ test("is empty when there are no query configs", () => {
882
+ expect(
883
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
884
+ queryConfigs: undefined,
885
+ seriesLabels: { "host.name": "prod-01" },
886
+ }),
887
+ ).toBe("");
888
+ expect(
889
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
890
+ queryConfigs: [],
891
+ seriesLabels: { "host.name": "prod-01" },
892
+ }),
893
+ ).toBe("");
894
+ });
895
+
896
+ test("renders the one label that was applied", () => {
897
+ expect(
898
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
899
+ queryConfigs: [
900
+ buildQueryConfig({ groupByAttributeKeys: ["host.name"] }),
901
+ ],
902
+ seriesLabels: { "host.name": "prod-01" },
903
+ }),
904
+ ).toBe("host.name = prod-01");
905
+ });
906
+
907
+ test("joins several applied labels in group-by order", () => {
908
+ expect(
909
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
910
+ queryConfigs: [
911
+ buildQueryConfig({
912
+ groupByAttributeKeys: ["host.name", "disk.device"],
913
+ }),
914
+ ],
915
+ seriesLabels: {
916
+ "disk.device": "/dev/sda1",
917
+ "host.name": "prod-01",
918
+ },
919
+ }),
920
+ ).toBe("host.name = prod-01, disk.device = /dev/sda1");
921
+ });
922
+
923
+ test("unions across queries without repeating a shared key", () => {
924
+ expect(
925
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
926
+ queryConfigs: [
927
+ buildQueryConfig({
928
+ id: "a",
929
+ groupByAttributeKeys: ["host.name"],
930
+ }),
931
+ buildQueryConfig({
932
+ id: "b",
933
+ groupByAttributeKeys: ["host.name", "k8s.pod.name"],
934
+ }),
935
+ ],
936
+ seriesLabels: {
937
+ "host.name": "prod-01",
938
+ "k8s.pod.name": "checkout-abc",
939
+ },
940
+ }),
941
+ ).toBe("host.name = prod-01, k8s.pod.name = checkout-abc");
942
+ });
943
+
944
+ test("renders an applied unset label as (unset), matching the chart legend", () => {
945
+ expect(
946
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
947
+ queryConfigs: [
948
+ buildQueryConfig({ groupByAttributeKeys: ["host.name"] }),
949
+ ],
950
+ seriesLabels: { "host.name": "" },
951
+ }),
952
+ ).toBe("host.name = (unset)");
953
+ expect(MetricSeriesScope.UnsetLabelDisplayValue).toBe("(unset)");
954
+ });
955
+
956
+ test("stringifies applied numeric and boolean labels", () => {
957
+ expect(
958
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
959
+ queryConfigs: [
960
+ buildQueryConfig({
961
+ groupByAttributeKeys: ["http.status_code", "is.canary"],
962
+ }),
963
+ ],
964
+ seriesLabels: { "http.status_code": 500, "is.canary": false },
965
+ }),
966
+ ).toBe("http.status_code = 500, is.canary = false");
967
+ });
968
+
969
+ test("says nothing about labels the queries never grouped by", () => {
970
+ /*
971
+ * Incoming-request monitors write seriesLabels keyed by a payload
972
+ * field name. Those narrow nothing, so the card must not claim they
973
+ * did.
974
+ */
975
+ expect(
976
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
977
+ queryConfigs: [
978
+ buildQueryConfig({ groupByAttributeKeys: ["host.name"] }),
979
+ ],
980
+ seriesLabels: { alertname: "HighCPU" },
981
+ }),
982
+ ).toBe("");
983
+ });
984
+
985
+ test("says nothing about labels whose value cannot be filtered on", () => {
986
+ const queryConfigs: Array<MetricQueryConfigData> = [
987
+ buildQueryConfig({
988
+ groupByAttributeKeys: ["tags", "meta", "host.name"],
989
+ }),
990
+ ];
991
+
992
+ expect(
993
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
994
+ queryConfigs,
995
+ seriesLabels: {
996
+ tags: ["a", "b"],
997
+ meta: { nested: true },
998
+ "host.name": " ",
999
+ } as unknown as JSONObject,
1000
+ }),
1001
+ ).toBe("");
1002
+ });
1003
+
1004
+ test("reports only the part it could apply on a mixed series", () => {
1005
+ expect(
1006
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
1007
+ queryConfigs: [
1008
+ buildQueryConfig({
1009
+ groupByAttributeKeys: ["host.name", "tags"],
1010
+ }),
1011
+ ],
1012
+ seriesLabels: {
1013
+ "host.name": "prod-01",
1014
+ tags: ["a", "b"],
1015
+ } as unknown as JSONObject,
1016
+ }),
1017
+ ).toBe("host.name = prod-01");
1018
+ });
1019
+
1020
+ test("says nothing about an ungrouped query", () => {
1021
+ expect(
1022
+ MetricSeriesScope.getAppliedSeriesLabelSummary({
1023
+ queryConfigs: [buildQueryConfig({})],
1024
+ seriesLabels: { "host.name": "prod-01" },
1025
+ }),
1026
+ ).toBe("");
1027
+ });
1028
+ });
1029
+
1030
+ /*
1031
+ * The invariant the card subtitle rests on, stated once and checked
1032
+ * across a matrix of realistic inputs: the summary is non-empty EXACTLY
1033
+ * when the query configs were actually narrowed. Any future value rule
1034
+ * added to one side and not the other fails here.
1035
+ */
1036
+ describe("MetricSeriesScope — the summary never outruns the narrowing", () => {
1037
+ interface ScopeCase {
1038
+ name: string;
1039
+ groupByAttributeKeys: Array<string>;
1040
+ seriesLabels: JSONObject | undefined;
1041
+ }
1042
+
1043
+ const cases: Array<ScopeCase> = [
1044
+ {
1045
+ name: "no labels at all",
1046
+ groupByAttributeKeys: ["host.name"],
1047
+ seriesLabels: undefined,
1048
+ },
1049
+ {
1050
+ name: "plain matching label",
1051
+ groupByAttributeKeys: ["host.name"],
1052
+ seriesLabels: { "host.name": "prod-01" },
1053
+ },
1054
+ {
1055
+ name: "unset label",
1056
+ groupByAttributeKeys: ["host.name"],
1057
+ seriesLabels: { "host.name": "" },
1058
+ },
1059
+ {
1060
+ name: "whitespace-only label",
1061
+ groupByAttributeKeys: ["host.name"],
1062
+ seriesLabels: { "host.name": " " },
1063
+ },
1064
+ {
1065
+ name: "array label",
1066
+ groupByAttributeKeys: ["tags"],
1067
+ seriesLabels: { tags: ["a", "b"] } as unknown as JSONObject,
1068
+ },
1069
+ {
1070
+ name: "object label",
1071
+ groupByAttributeKeys: ["meta"],
1072
+ seriesLabels: { meta: { a: 1 } } as unknown as JSONObject,
1073
+ },
1074
+ {
1075
+ name: "empty array label",
1076
+ groupByAttributeKeys: ["tags"],
1077
+ seriesLabels: { tags: [] } as unknown as JSONObject,
1078
+ },
1079
+ {
1080
+ name: "non-finite numeric label",
1081
+ groupByAttributeKeys: ["weird"],
1082
+ seriesLabels: { weird: Number.NaN },
1083
+ },
1084
+ {
1085
+ name: "zero label",
1086
+ groupByAttributeKeys: ["pool_id"],
1087
+ seriesLabels: { pool_id: 0 },
1088
+ },
1089
+ {
1090
+ name: "label for a dimension the query never grouped by",
1091
+ groupByAttributeKeys: ["host.name"],
1092
+ seriesLabels: { alertname: "HighCPU" },
1093
+ },
1094
+ {
1095
+ name: "ungrouped query",
1096
+ groupByAttributeKeys: [],
1097
+ seriesLabels: { "host.name": "prod-01" },
1098
+ },
1099
+ {
1100
+ name: "one usable label among unusable ones",
1101
+ groupByAttributeKeys: ["host.name", "tags"],
1102
+ seriesLabels: {
1103
+ "host.name": "prod-01",
1104
+ tags: ["a", "b"],
1105
+ } as unknown as JSONObject,
1106
+ },
1107
+ ];
1108
+
1109
+ for (const scopeCase of cases) {
1110
+ test(`summary and narrowing agree — ${scopeCase.name}`, () => {
1111
+ const queryConfigs: Array<MetricQueryConfigData> = [
1112
+ buildQueryConfig({
1113
+ groupByAttributeKeys: scopeCase.groupByAttributeKeys,
1114
+ }),
1115
+ ];
1116
+
1117
+ const scoped: Array<MetricQueryConfigData> =
1118
+ MetricSeriesScope.scopeQueryConfigsToSeries({
1119
+ queryConfigs,
1120
+ seriesLabels: scopeCase.seriesLabels,
1121
+ });
1122
+
1123
+ const didNarrow: boolean = scoped !== queryConfigs;
1124
+
1125
+ const summary: string = MetricSeriesScope.getAppliedSeriesLabelSummary({
1126
+ queryConfigs,
1127
+ seriesLabels: scopeCase.seriesLabels,
1128
+ });
1129
+
1130
+ expect(summary !== "").toBe(didNarrow);
1131
+ });
1132
+ }
1133
+ });
1134
+
1135
+ /*
1136
+ * The narrowed filters only reach ClickHouse if they survive the chart's
1137
+ * own filter sanitizer, which classifies each value through
1138
+ * detectOperatorFromValue/getOperatorOption. These pin that contract from
1139
+ * this side: a plain string must read as "equals" with a non-blank value,
1140
+ * and IsNull must read as "is empty" — the one operator the sanitizer
1141
+ * keeps despite having no value text.
1142
+ */
1143
+ describe("MetricSeriesScope — the filters it emits survive the chart's sanitizer", () => {
1144
+ test("a string label reads as an equals filter with a non-blank value", () => {
1145
+ const filters: Dictionary<MetricSeriesFilterValue> =
1146
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
1147
+ queryConfig: buildQueryConfig({
1148
+ groupByAttributeKeys: ["host.name"],
1149
+ }),
1150
+ seriesLabels: { "host.name": "prod-01" },
1151
+ });
1152
+
1153
+ const detected: { operator: DictionaryFilterOperator; rawValue: string } =
1154
+ detectOperatorFromValue(filters["host.name"]);
1155
+
1156
+ expect(detected.operator).toBe(DictionaryFilterOperator.EqualTo);
1157
+ expect(detected.rawValue.trim()).not.toBe("");
1158
+ });
1159
+
1160
+ test("an unset label reads as is-empty, which needs no value text", () => {
1161
+ const filters: Dictionary<MetricSeriesFilterValue> =
1162
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
1163
+ queryConfig: buildQueryConfig({
1164
+ groupByAttributeKeys: ["host.name"],
1165
+ }),
1166
+ seriesLabels: { "host.name": "" },
1167
+ });
1168
+
1169
+ const detected: { operator: DictionaryFilterOperator; rawValue: string } =
1170
+ detectOperatorFromValue(filters["host.name"]);
1171
+ const option: DictionaryFilterOperatorOption = getOperatorOption(
1172
+ detected.operator,
1173
+ );
1174
+
1175
+ expect(detected.operator).toBe(DictionaryFilterOperator.IsEmpty);
1176
+ /*
1177
+ * hidesValueInput is precisely what stops the sanitizer from dropping
1178
+ * an operator whose rawValue is blank. Without it this filter would be
1179
+ * silently discarded and the chart would show every series again.
1180
+ */
1181
+ expect(option.hidesValueInput).toBe(true);
1182
+ });
1183
+
1184
+ test("the emitted IsNull serializes to the shape the API rehydrates", () => {
1185
+ const filters: Dictionary<MetricSeriesFilterValue> =
1186
+ MetricSeriesScope.getSeriesFilterAttributesForQuery({
1187
+ queryConfig: buildQueryConfig({
1188
+ groupByAttributeKeys: ["host.name"],
1189
+ }),
1190
+ seriesLabels: { "host.name": "" },
1191
+ });
1192
+
1193
+ expect(JSON.parse(JSON.stringify(filters))).toEqual({
1194
+ "host.name": { _type: "IsNull", value: null },
1195
+ });
1196
+ });
1197
+ });