@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,1238 @@
1
+ import DashboardChartType from "../../../Types/Dashboard/Chart/ChartType";
2
+ import { ComponentArgument } from "../../../Types/Dashboard/DashboardComponents/ComponentArgument";
3
+ import DashboardBaseComponent from "../../../Types/Dashboard/DashboardComponents/DashboardBaseComponent";
4
+ import DashboardTraceChartComponent from "../../../Types/Dashboard/DashboardComponents/DashboardTraceChartComponent";
5
+ import { DashboardValueTrendDirection } from "../../../Types/Dashboard/DashboardComponents/DashboardValueComponent";
6
+ import DashboardComponentType from "../../../Types/Dashboard/DashboardComponentType";
7
+ import DashboardVariable, {
8
+ DashboardVariableType,
9
+ } from "../../../Types/Dashboard/DashboardVariable";
10
+ import DashboardViewConfig from "../../../Types/Dashboard/DashboardViewConfig";
11
+ import {
12
+ DashboardTemplate,
13
+ DashboardTemplateCategory,
14
+ DashboardTemplates,
15
+ DashboardTemplateType,
16
+ getDashboardTemplatesByCategory,
17
+ getTemplateConfig,
18
+ } from "../../../Types/Dashboard/DashboardTemplates";
19
+ import IconProp from "../../../Types/Icon/IconProp";
20
+ import DashboardTraceChartComponentUtil from "../../../Utils/Dashboard/Components/DashboardTraceChartComponent";
21
+ import type { DropdownOption } from "../../../UI/Components/Dropdown/Dropdown";
22
+
23
+ /*
24
+ * The canonical names from /docs/rum/web-vitals — the ones the docs tell
25
+ * new instrumentation to emit and the ones RumAlertTemplates.ts already
26
+ * alerts on. A widget can only query one spelling, so anything outside
27
+ * this set renders permanently empty, which is the exact failure the
28
+ * comment at the top of DashboardTemplates.ts warns about.
29
+ */
30
+ const CANONICAL_WEB_VITAL_METRICS: Array<string> = [
31
+ "web_vital.lcp",
32
+ "web_vital.inp",
33
+ "web_vital.cls",
34
+ "web_vital.fcp",
35
+ "web_vital.ttfb",
36
+ ];
37
+
38
+ const GRID_WIDTH_IN_UNITS: number = 12;
39
+
40
+ /*
41
+ * The aggregation is persisted into the saved dashboard as a raw string, so
42
+ * the wire contract is the string VALUE, not the enum member. Asserting
43
+ * against `AggregationType.Avg` would compare the source to itself —
44
+ * `Types/Metrics/MetricsAggregationType.ts` is a bare re-export of the same
45
+ * enum the template imports — and renaming `Avg = "Avg"` to `"avg"` would
46
+ * break every stored dashboard with the suite still green. So the literals
47
+ * are pinned here, exactly as the metric names and the misspelled
48
+ * `aggegationType` key already are.
49
+ */
50
+ const AVG_AGGREGATION: string = "Avg";
51
+ const P95_AGGREGATION: string = "P95";
52
+
53
+ // -- Helpers ---------------------------------------------------------------
54
+
55
+ type WidgetArguments = Record<string, unknown>;
56
+
57
+ function getConfig(): DashboardViewConfig {
58
+ const config: DashboardViewConfig | null = getTemplateConfig(
59
+ DashboardTemplateType.Rum,
60
+ );
61
+ expect(config).not.toBeNull();
62
+ return config as DashboardViewConfig;
63
+ }
64
+
65
+ function argumentsOf(component: DashboardBaseComponent): WidgetArguments {
66
+ return (component.arguments as WidgetArguments | undefined) || {};
67
+ }
68
+
69
+ /*
70
+ * Every widget family stores its title under a different argument key
71
+ * (Text uses `text`, Chart uses `chartTitle`, Gauge uses `gaugeTitle`,
72
+ * the trace / log widgets use `title`). Looking widgets up by title is
73
+ * the only stable handle: component ids are freshly generated on every
74
+ * call and array positions move whenever a row is inserted.
75
+ */
76
+ const TITLE_ARGUMENT_KEYS: Array<string> = [
77
+ "title",
78
+ "chartTitle",
79
+ "gaugeTitle",
80
+ "tableTitle",
81
+ "text",
82
+ ];
83
+
84
+ function titleOf(component: DashboardBaseComponent): string {
85
+ const args: WidgetArguments = argumentsOf(component);
86
+
87
+ for (const key of TITLE_ARGUMENT_KEYS) {
88
+ const value: unknown = args[key];
89
+
90
+ if (typeof value === "string") {
91
+ return value;
92
+ }
93
+ }
94
+
95
+ return "";
96
+ }
97
+
98
+ // Fails loudly (rather than returning undefined) when the widget is gone.
99
+ function findWidget(
100
+ config: DashboardViewConfig,
101
+ title: string,
102
+ ): DashboardBaseComponent {
103
+ const matches: Array<DashboardBaseComponent> = config.components.filter(
104
+ (component: DashboardBaseComponent): boolean => {
105
+ return titleOf(component) === title;
106
+ },
107
+ );
108
+
109
+ expect(matches).toHaveLength(1);
110
+ return matches[0] as DashboardBaseComponent;
111
+ }
112
+
113
+ function componentsOfType(
114
+ config: DashboardViewConfig,
115
+ componentType: DashboardComponentType,
116
+ ): Array<DashboardBaseComponent> {
117
+ return config.components.filter(
118
+ (component: DashboardBaseComponent): boolean => {
119
+ return component.componentType === componentType;
120
+ },
121
+ );
122
+ }
123
+
124
+ function metricQueryConfigOf(
125
+ component: DashboardBaseComponent,
126
+ ): WidgetArguments {
127
+ return (
128
+ (argumentsOf(component)["metricQueryConfig"] as
129
+ | WidgetArguments
130
+ | undefined) || {}
131
+ );
132
+ }
133
+
134
+ function metricQueryDataOf(component: DashboardBaseComponent): WidgetArguments {
135
+ return (
136
+ (metricQueryConfigOf(component)["metricQueryData"] as
137
+ | WidgetArguments
138
+ | undefined) || {}
139
+ );
140
+ }
141
+
142
+ function filterDataOf(component: DashboardBaseComponent): WidgetArguments {
143
+ return (
144
+ (metricQueryDataOf(component)["filterData"] as
145
+ | WidgetArguments
146
+ | undefined) || {}
147
+ );
148
+ }
149
+
150
+ function metricNameOf(component: DashboardBaseComponent): string | undefined {
151
+ const value: unknown = filterDataOf(component)["metricName"];
152
+ return typeof value === "string" ? value : undefined;
153
+ }
154
+
155
+ /*
156
+ * The aggregation is stored under the MISSPELLED key `aggegationType`.
157
+ * That misspelling is what the fetch layer reads, so it is the contract:
158
+ * "fixing" the spelling silently drops the aggregation.
159
+ */
160
+ function aggregationOf(component: DashboardBaseComponent): unknown {
161
+ return filterDataOf(component)["aggegationType"];
162
+ }
163
+
164
+ function groupByAttributeKeysOf(component: DashboardBaseComponent): unknown {
165
+ return metricQueryDataOf(component)["groupByAttributeKeys"];
166
+ }
167
+
168
+ function metricAliasDataOf(
169
+ component: DashboardBaseComponent,
170
+ ): WidgetArguments | undefined {
171
+ return metricQueryConfigOf(component)["metricAliasData"] as
172
+ | WidgetArguments
173
+ | undefined;
174
+ }
175
+
176
+ function metricWidgetsOf(
177
+ config: DashboardViewConfig,
178
+ ): Array<DashboardBaseComponent> {
179
+ return config.components.filter(
180
+ (component: DashboardBaseComponent): boolean => {
181
+ return metricNameOf(component) !== undefined;
182
+ },
183
+ );
184
+ }
185
+
186
+ function traceWidgetsOf(
187
+ config: DashboardViewConfig,
188
+ ): Array<DashboardBaseComponent> {
189
+ return [
190
+ ...componentsOfType(config, DashboardComponentType.TraceChart),
191
+ ...componentsOfType(config, DashboardComponentType.TraceTable),
192
+ ];
193
+ }
194
+
195
+ /*
196
+ * The grid slot IS the reading order: swapping two widgets of the same size
197
+ * leaves every other assertion green while silently re-ordering the
198
+ * dashboard, so top/left/width/height are pinned per widget.
199
+ */
200
+ interface GridSlot {
201
+ top: number;
202
+ left: number;
203
+ width: number;
204
+ height: number;
205
+ }
206
+
207
+ function componentIdsOf(config: DashboardViewConfig): Array<string> {
208
+ return config.components.map((component: DashboardBaseComponent): string => {
209
+ return component.componentId.toString();
210
+ });
211
+ }
212
+
213
+ function variableIdsOf(config: DashboardViewConfig): Array<string> {
214
+ return (config.variables || []).map((variable: DashboardVariable): string => {
215
+ return variable.id;
216
+ });
217
+ }
218
+
219
+ function slotOf(component: DashboardBaseComponent): GridSlot {
220
+ return {
221
+ top: component.topInDashboardUnits,
222
+ left: component.leftInDashboardUnits,
223
+ width: component.widthInDashboardUnits,
224
+ height: component.heightInDashboardUnits,
225
+ };
226
+ }
227
+
228
+ /*
229
+ * The trace widgets store a bare `metric` string that the analytics endpoint
230
+ * has to recognise. The widget's own editor is the importable oracle for the
231
+ * accepted set: its Metric dropdown is what a user picks from, so a template
232
+ * metric outside it is a value no one could have chosen and the endpoint has
233
+ * no branch for.
234
+ */
235
+ function traceChartMetricsOfferedByEditor(): Array<string> {
236
+ const componentArguments: Array<
237
+ ComponentArgument<DashboardTraceChartComponent>
238
+ > = DashboardTraceChartComponentUtil.getComponentConfigArguments();
239
+
240
+ const metricArgument:
241
+ | ComponentArgument<DashboardTraceChartComponent>
242
+ | undefined = componentArguments.find(
243
+ (candidate: ComponentArgument<DashboardTraceChartComponent>): boolean => {
244
+ return candidate.id === "metric";
245
+ },
246
+ );
247
+
248
+ expect(metricArgument).toBeDefined();
249
+
250
+ const options: Array<DropdownOption> =
251
+ (metricArgument as ComponentArgument<DashboardTraceChartComponent>)
252
+ .dropdownOptions || [];
253
+
254
+ expect(options.length).toBeGreaterThan(0);
255
+
256
+ return options.map((option: DropdownOption): string => {
257
+ return String(option.value);
258
+ });
259
+ }
260
+
261
+ // -- Fixtures --------------------------------------------------------------
262
+
263
+ /*
264
+ * Named rather than indexed out of SECTION_HEADERS so that inserting a
265
+ * header cannot silently retarget the tests that reach for it.
266
+ */
267
+ const SPAN_SECTION_HEADER: string =
268
+ "Page Loads & Browser Errors (span-based — not narrowed by the filters above)";
269
+
270
+ const LOG_STREAM_TITLE: string = "Recent Browser Logs";
271
+
272
+ const EXPECTED_WIDGETS: Record<string, DashboardComponentType> = {
273
+ "Real User Monitoring Dashboard": DashboardComponentType.Text,
274
+
275
+ "Avg LCP": DashboardComponentType.Value,
276
+ "Avg INP": DashboardComponentType.Value,
277
+ "Avg CLS": DashboardComponentType.Value,
278
+ "Avg TTFB": DashboardComponentType.Value,
279
+
280
+ "Largest Contentful Paint": DashboardComponentType.Gauge,
281
+ "Interaction to Next Paint": DashboardComponentType.Gauge,
282
+ "Cumulative Layout Shift": DashboardComponentType.Gauge,
283
+ "First Contentful Paint": DashboardComponentType.Gauge,
284
+
285
+ "Core Web Vital Trends": DashboardComponentType.Text,
286
+
287
+ "Largest Contentful Paint Over Time": DashboardComponentType.Chart,
288
+ "Interaction to Next Paint Over Time": DashboardComponentType.Chart,
289
+ "Cumulative Layout Shift Over Time": DashboardComponentType.Chart,
290
+ "First Contentful Paint Over Time": DashboardComponentType.Chart,
291
+ "Time to First Byte Over Time": DashboardComponentType.Chart,
292
+ "Largest Contentful Paint by Route (P95)": DashboardComponentType.Chart,
293
+
294
+ [SPAN_SECTION_HEADER]: DashboardComponentType.Text,
295
+
296
+ "Page Loads & Requests": DashboardComponentType.TraceChart,
297
+ "Browser Errors Over Time": DashboardComponentType.TraceChart,
298
+ "Page Load & Request Time (P95)": DashboardComponentType.TraceChart,
299
+ "Route Change Duration (Avg)": DashboardComponentType.TraceChart,
300
+
301
+ Breakdowns: DashboardComponentType.Text,
302
+
303
+ Applications: DashboardComponentType.TraceTable,
304
+ "Top Route Changes": DashboardComponentType.TraceTable,
305
+ "Browsers & Platforms": DashboardComponentType.TraceTable,
306
+ [LOG_STREAM_TITLE]: DashboardComponentType.LogStream,
307
+ };
308
+
309
+ interface ValueTileFixture {
310
+ title: string;
311
+ metricName: string;
312
+ slot: GridSlot;
313
+ }
314
+
315
+ const VALUE_TILES: Array<ValueTileFixture> = [
316
+ {
317
+ title: "Avg LCP",
318
+ metricName: "web_vital.lcp",
319
+ slot: { top: 1, left: 0, width: 3, height: 1 },
320
+ },
321
+ {
322
+ title: "Avg INP",
323
+ metricName: "web_vital.inp",
324
+ slot: { top: 1, left: 3, width: 3, height: 1 },
325
+ },
326
+ {
327
+ title: "Avg CLS",
328
+ metricName: "web_vital.cls",
329
+ slot: { top: 1, left: 6, width: 3, height: 1 },
330
+ },
331
+ {
332
+ title: "Avg TTFB",
333
+ metricName: "web_vital.ttfb",
334
+ slot: { top: 1, left: 9, width: 3, height: 1 },
335
+ },
336
+ ];
337
+
338
+ interface GaugeFixture {
339
+ title: string;
340
+ metricName: string;
341
+ minValue: number;
342
+ maxValue: number;
343
+ warningThreshold: number;
344
+ criticalThreshold: number;
345
+ slot: GridSlot;
346
+ }
347
+
348
+ /*
349
+ * Warning / critical are Google's published "needs improvement" / "poor"
350
+ * boundaries for each vital. Drifting off them turns the gauge colour into
351
+ * an opinion nobody can look up.
352
+ */
353
+ const GAUGES: Array<GaugeFixture> = [
354
+ {
355
+ title: "Largest Contentful Paint",
356
+ metricName: "web_vital.lcp",
357
+ minValue: 0,
358
+ maxValue: 6000,
359
+ warningThreshold: 2500,
360
+ criticalThreshold: 4000,
361
+ slot: { top: 2, left: 0, width: 3, height: 3 },
362
+ },
363
+ {
364
+ title: "Interaction to Next Paint",
365
+ metricName: "web_vital.inp",
366
+ minValue: 0,
367
+ maxValue: 1000,
368
+ warningThreshold: 200,
369
+ criticalThreshold: 500,
370
+ slot: { top: 2, left: 3, width: 3, height: 3 },
371
+ },
372
+ {
373
+ title: "Cumulative Layout Shift",
374
+ metricName: "web_vital.cls",
375
+ minValue: 0,
376
+ maxValue: 0.5,
377
+ warningThreshold: 0.1,
378
+ criticalThreshold: 0.25,
379
+ slot: { top: 2, left: 6, width: 3, height: 3 },
380
+ },
381
+ {
382
+ title: "First Contentful Paint",
383
+ metricName: "web_vital.fcp",
384
+ minValue: 0,
385
+ maxValue: 5000,
386
+ warningThreshold: 1800,
387
+ criticalThreshold: 3000,
388
+ slot: { top: 2, left: 9, width: 3, height: 3 },
389
+ },
390
+ ];
391
+
392
+ interface ChartFixture {
393
+ title: string;
394
+ chartType: DashboardChartType;
395
+ metricName: string;
396
+ aggregationType: string;
397
+ legend: string;
398
+ legendUnit: string | undefined;
399
+ slot: GridSlot;
400
+ }
401
+
402
+ const CHARTS: Array<ChartFixture> = [
403
+ {
404
+ title: "Largest Contentful Paint Over Time",
405
+ chartType: DashboardChartType.Line,
406
+ metricName: "web_vital.lcp",
407
+ aggregationType: AVG_AGGREGATION,
408
+ legend: "LCP",
409
+ legendUnit: "ms",
410
+ slot: { top: 6, left: 0, width: 6, height: 3 },
411
+ },
412
+ {
413
+ title: "Interaction to Next Paint Over Time",
414
+ chartType: DashboardChartType.Line,
415
+ metricName: "web_vital.inp",
416
+ aggregationType: AVG_AGGREGATION,
417
+ legend: "INP",
418
+ legendUnit: "ms",
419
+ slot: { top: 6, left: 6, width: 6, height: 3 },
420
+ },
421
+ {
422
+ // CLS is unitless, so it deliberately ships no legendUnit.
423
+ title: "Cumulative Layout Shift Over Time",
424
+ chartType: DashboardChartType.Line,
425
+ metricName: "web_vital.cls",
426
+ aggregationType: AVG_AGGREGATION,
427
+ legend: "CLS",
428
+ legendUnit: undefined,
429
+ slot: { top: 9, left: 0, width: 6, height: 3 },
430
+ },
431
+ {
432
+ title: "First Contentful Paint Over Time",
433
+ chartType: DashboardChartType.Line,
434
+ metricName: "web_vital.fcp",
435
+ aggregationType: AVG_AGGREGATION,
436
+ legend: "FCP",
437
+ legendUnit: "ms",
438
+ slot: { top: 9, left: 6, width: 6, height: 3 },
439
+ },
440
+ {
441
+ title: "Time to First Byte Over Time",
442
+ chartType: DashboardChartType.Line,
443
+ metricName: "web_vital.ttfb",
444
+ aggregationType: AVG_AGGREGATION,
445
+ legend: "TTFB",
446
+ legendUnit: "ms",
447
+ slot: { top: 12, left: 0, width: 6, height: 3 },
448
+ },
449
+ {
450
+ title: "Largest Contentful Paint by Route (P95)",
451
+ chartType: DashboardChartType.Bar,
452
+ metricName: "web_vital.lcp",
453
+ aggregationType: P95_AGGREGATION,
454
+ legend: "P95 LCP",
455
+ legendUnit: "ms",
456
+ slot: { top: 12, left: 6, width: 6, height: 3 },
457
+ },
458
+ ];
459
+
460
+ const P95_CHART_TITLE: string = "Largest Contentful Paint by Route (P95)";
461
+
462
+ interface TraceWidgetFixture {
463
+ title: string;
464
+ metric?: string;
465
+ groupByAttribute: string;
466
+ slot: GridSlot;
467
+ }
468
+
469
+ const TRACE_CHARTS: Array<TraceWidgetFixture> = [
470
+ {
471
+ title: "Page Loads & Requests",
472
+ metric: "count",
473
+ groupByAttribute: "rumApplicationId",
474
+ slot: { top: 16, left: 0, width: 6, height: 3 },
475
+ },
476
+ {
477
+ title: "Browser Errors Over Time",
478
+ metric: "errorCount",
479
+ groupByAttribute: "rumApplicationId",
480
+ slot: { top: 16, left: 6, width: 6, height: 3 },
481
+ },
482
+ {
483
+ title: "Page Load & Request Time (P95)",
484
+ metric: "p95Duration",
485
+ groupByAttribute: "rumApplicationId",
486
+ slot: { top: 19, left: 0, width: 6, height: 3 },
487
+ },
488
+ {
489
+ title: "Route Change Duration (Avg)",
490
+ metric: "avgDuration",
491
+ groupByAttribute: "app.route",
492
+ slot: { top: 19, left: 6, width: 6, height: 3 },
493
+ },
494
+ ];
495
+
496
+ const TRACE_TABLES: Array<TraceWidgetFixture> = [
497
+ {
498
+ title: "Applications",
499
+ groupByAttribute: "rumApplicationId",
500
+ slot: { top: 23, left: 0, width: 6, height: 3 },
501
+ },
502
+ {
503
+ title: "Top Route Changes",
504
+ groupByAttribute: "app.route",
505
+ slot: { top: 23, left: 6, width: 6, height: 3 },
506
+ },
507
+ {
508
+ title: "Browsers & Platforms",
509
+ groupByAttribute: "resource.browser.platform",
510
+ slot: { top: 26, left: 0, width: 6, height: 3 },
511
+ },
512
+ ];
513
+
514
+ const LOG_STREAM_SLOT: GridSlot = { top: 26, left: 6, width: 6, height: 3 };
515
+
516
+ const SECTION_HEADERS: Array<string> = [
517
+ "Real User Monitoring Dashboard",
518
+ "Core Web Vital Trends",
519
+ SPAN_SECTION_HEADER,
520
+ "Breakdowns",
521
+ ];
522
+
523
+ // -- Tests -----------------------------------------------------------------
524
+
525
+ describe("RUM dashboard template", () => {
526
+ describe("catalog registration", () => {
527
+ test("registers exactly one Real User Monitoring entry under Monitoring & APM", () => {
528
+ const entries: Array<DashboardTemplate> = DashboardTemplates.filter(
529
+ (candidate: DashboardTemplate): boolean => {
530
+ return candidate.type === DashboardTemplateType.Rum;
531
+ },
532
+ );
533
+
534
+ expect(entries).toHaveLength(1);
535
+
536
+ const template: DashboardTemplate = entries[0] as DashboardTemplate;
537
+ expect(template.name).toBe("Real User Monitoring Dashboard");
538
+ expect(template.icon).toBe(IconProp.Globe);
539
+ expect(template.category).toBe(DashboardTemplateCategory.Monitoring);
540
+ });
541
+
542
+ test("describes every vital the dashboard actually charts", () => {
543
+ const template: DashboardTemplate | undefined = DashboardTemplates.find(
544
+ (candidate: DashboardTemplate): boolean => {
545
+ return candidate.type === DashboardTemplateType.Rum;
546
+ },
547
+ );
548
+
549
+ expect(template).toBeDefined();
550
+
551
+ const description: string = (template as DashboardTemplate).description;
552
+
553
+ for (const vital of ["LCP", "INP", "CLS", "FCP", "TTFB"]) {
554
+ expect(description).toContain(vital);
555
+ }
556
+ });
557
+
558
+ test("is surfaced by the Monitoring category grouping the modal renders", () => {
559
+ const grouped: Array<DashboardTemplate> = getDashboardTemplatesByCategory(
560
+ DashboardTemplateCategory.Monitoring,
561
+ );
562
+
563
+ const types: Array<DashboardTemplateType> = grouped.map(
564
+ (template: DashboardTemplate): DashboardTemplateType => {
565
+ return template.type;
566
+ },
567
+ );
568
+
569
+ expect(types).toContain(DashboardTemplateType.Rum);
570
+ });
571
+
572
+ /*
573
+ * DashboardService validates the string it receives in
574
+ * miscDataProps.dashboardTemplateType against Object.values(
575
+ * DashboardTemplateType) before handing it to getTemplateConfig, so the
576
+ * enum VALUE — not the member name — is the wire contract with the UI.
577
+ */
578
+ test("accepts the raw wire value 'Rum' DashboardService validates against", () => {
579
+ const wireValue: string = "Rum";
580
+
581
+ expect(DashboardTemplateType.Rum).toBe(wireValue);
582
+ expect(
583
+ getTemplateConfig(wireValue as DashboardTemplateType),
584
+ ).not.toBeNull();
585
+ });
586
+ });
587
+
588
+ describe("widget inventory", () => {
589
+ test("renders exactly the expected widgets, each with its expected type", () => {
590
+ const config: DashboardViewConfig = getConfig();
591
+ const actual: Record<string, DashboardComponentType> = {};
592
+
593
+ expect(config.components).toHaveLength(
594
+ Object.keys(EXPECTED_WIDGETS).length,
595
+ );
596
+
597
+ for (const component of config.components) {
598
+ const title: string = titleOf(component);
599
+ expect(title).not.toBe("");
600
+ // Titles are the lookup handle, so they have to stay unique.
601
+ expect(actual[title]).toBeUndefined();
602
+ actual[title] = component.componentType;
603
+ }
604
+
605
+ expect(actual).toEqual(EXPECTED_WIDGETS);
606
+ });
607
+
608
+ test("splits those widgets across the expected widget families", () => {
609
+ const config: DashboardViewConfig = getConfig();
610
+
611
+ expect(
612
+ componentsOfType(config, DashboardComponentType.Text),
613
+ ).toHaveLength(4);
614
+ expect(
615
+ componentsOfType(config, DashboardComponentType.Value),
616
+ ).toHaveLength(4);
617
+ expect(
618
+ componentsOfType(config, DashboardComponentType.Gauge),
619
+ ).toHaveLength(4);
620
+ expect(
621
+ componentsOfType(config, DashboardComponentType.Chart),
622
+ ).toHaveLength(6);
623
+ expect(
624
+ componentsOfType(config, DashboardComponentType.TraceChart),
625
+ ).toHaveLength(4);
626
+ expect(
627
+ componentsOfType(config, DashboardComponentType.TraceTable),
628
+ ).toHaveLength(3);
629
+ expect(
630
+ componentsOfType(config, DashboardComponentType.LogStream),
631
+ ).toHaveLength(1);
632
+ });
633
+
634
+ // TraceList has no group-by, so it cannot be scoped to RUM traffic.
635
+ test("does not use the unscopable trace list widget", () => {
636
+ expect(
637
+ componentsOfType(getConfig(), DashboardComponentType.TraceList),
638
+ ).toHaveLength(0);
639
+ });
640
+ });
641
+
642
+ describe("metric queries", () => {
643
+ test("queries only canonical web_vital.* metric names", () => {
644
+ const config: DashboardViewConfig = getConfig();
645
+ const metricWidgets: Array<DashboardBaseComponent> =
646
+ metricWidgetsOf(config);
647
+
648
+ expect(metricWidgets).toHaveLength(14);
649
+
650
+ for (const widget of metricWidgets) {
651
+ expect(CANONICAL_WEB_VITAL_METRICS).toContain(metricNameOf(widget));
652
+ }
653
+ });
654
+
655
+ test("covers all five Core Web Vitals", () => {
656
+ const queried: Set<string> = new Set(
657
+ metricWidgetsOf(getConfig()).map(
658
+ (component: DashboardBaseComponent): string => {
659
+ return metricNameOf(component) as string;
660
+ },
661
+ ),
662
+ );
663
+
664
+ for (const canonical of CANONICAL_WEB_VITAL_METRICS) {
665
+ expect(queried.has(canonical)).toBe(true);
666
+ }
667
+ });
668
+
669
+ /*
670
+ * The fetch layer reads `aggegationType`. Correcting the spelling here
671
+ * would leave every widget with no aggregation at all, so the
672
+ * misspelling is pinned in both directions.
673
+ */
674
+ test("stores every aggregation under the misspelled aggegationType key", () => {
675
+ const config: DashboardViewConfig = getConfig();
676
+ const metricWidgets: Array<DashboardBaseComponent> =
677
+ metricWidgetsOf(config);
678
+
679
+ expect(metricWidgets).toHaveLength(14);
680
+
681
+ for (const widget of metricWidgets) {
682
+ const filterData: WidgetArguments = filterDataOf(widget);
683
+
684
+ expect(Object.keys(filterData)).toContain("aggegationType");
685
+ expect(Object.keys(filterData)).not.toContain("aggregationType");
686
+ // The stored value is the raw string the fetch layer compares on.
687
+ expect([AVG_AGGREGATION, P95_AGGREGATION]).toContain(
688
+ aggregationOf(widget),
689
+ );
690
+ }
691
+ });
692
+
693
+ test("uses the P95 aggregation on exactly the one per-route chart, and fans out by app.route only there", () => {
694
+ const config: DashboardViewConfig = getConfig();
695
+
696
+ const p95Titles: Array<string> = config.components
697
+ .filter((component: DashboardBaseComponent): boolean => {
698
+ return aggregationOf(component) === P95_AGGREGATION;
699
+ })
700
+ .map((component: DashboardBaseComponent): string => {
701
+ return titleOf(component);
702
+ });
703
+
704
+ expect(p95Titles).toEqual([P95_CHART_TITLE]);
705
+
706
+ const fanOutTitles: Array<string> = config.components
707
+ .filter((component: DashboardBaseComponent): boolean => {
708
+ return groupByAttributeKeysOf(component) !== undefined;
709
+ })
710
+ .map((component: DashboardBaseComponent): string => {
711
+ return titleOf(component);
712
+ });
713
+
714
+ expect(fanOutTitles).toEqual([P95_CHART_TITLE]);
715
+ expect(
716
+ groupByAttributeKeysOf(findWidget(config, P95_CHART_TITLE)),
717
+ ).toEqual(["app.route"]);
718
+ });
719
+ });
720
+
721
+ describe("headline value tiles", () => {
722
+ for (const tile of VALUE_TILES) {
723
+ test(`"${tile.title}" averages ${tile.metricName} in its own grid slot`, () => {
724
+ const config: DashboardViewConfig = getConfig();
725
+ const widget: DashboardBaseComponent = findWidget(config, tile.title);
726
+
727
+ expect(widget.componentType).toBe(DashboardComponentType.Value);
728
+ expect(metricNameOf(widget)).toBe(tile.metricName);
729
+ expect(aggregationOf(widget)).toBe(AVG_AGGREGATION);
730
+ expect(slotOf(widget)).toEqual(tile.slot);
731
+ });
732
+ }
733
+
734
+ /*
735
+ * The renderer's trend-arrow heuristic keys off the metric name and
736
+ * does not recognise `web_vital.*`, so every vital would get a
737
+ * "rising is good" green arrow unless the direction is set explicitly.
738
+ */
739
+ test("pins HigherIsWorse on every tile rather than trusting the name heuristic", () => {
740
+ const config: DashboardViewConfig = getConfig();
741
+ const tiles: Array<DashboardBaseComponent> = componentsOfType(
742
+ config,
743
+ DashboardComponentType.Value,
744
+ );
745
+
746
+ expect(tiles).toHaveLength(VALUE_TILES.length);
747
+
748
+ for (const tile of tiles) {
749
+ expect(argumentsOf(tile)["trendDirection"]).toBe(
750
+ DashboardValueTrendDirection.HigherIsWorse,
751
+ );
752
+ }
753
+ });
754
+ });
755
+
756
+ describe("Core Web Vital gauges", () => {
757
+ for (const gauge of GAUGES) {
758
+ test(`"${gauge.title}" sweeps ${gauge.minValue}-${gauge.maxValue} with Google's published boundaries`, () => {
759
+ const config: DashboardViewConfig = getConfig();
760
+ const widget: DashboardBaseComponent = findWidget(config, gauge.title);
761
+ const args: WidgetArguments = argumentsOf(widget);
762
+
763
+ expect(widget.componentType).toBe(DashboardComponentType.Gauge);
764
+ expect(metricNameOf(widget)).toBe(gauge.metricName);
765
+ expect(aggregationOf(widget)).toBe(AVG_AGGREGATION);
766
+ expect(args["minValue"]).toBe(gauge.minValue);
767
+ expect(args["maxValue"]).toBe(gauge.maxValue);
768
+ expect(args["warningThreshold"]).toBe(gauge.warningThreshold);
769
+ expect(args["criticalThreshold"]).toBe(gauge.criticalThreshold);
770
+ expect(slotOf(widget)).toEqual(gauge.slot);
771
+ });
772
+ }
773
+
774
+ // A gauge whose bands are out of order colours the dial nonsensically.
775
+ test("keeps min < warning < critical <= max on every gauge", () => {
776
+ const config: DashboardViewConfig = getConfig();
777
+ const gauges: Array<DashboardBaseComponent> = componentsOfType(
778
+ config,
779
+ DashboardComponentType.Gauge,
780
+ );
781
+
782
+ expect(gauges).toHaveLength(GAUGES.length);
783
+
784
+ for (const gauge of gauges) {
785
+ const args: WidgetArguments = argumentsOf(gauge);
786
+ const minValue: number = args["minValue"] as number;
787
+ const maxValue: number = args["maxValue"] as number;
788
+ const warning: number = args["warningThreshold"] as number;
789
+ const critical: number = args["criticalThreshold"] as number;
790
+
791
+ expect(minValue).toBeLessThan(warning);
792
+ expect(warning).toBeLessThan(critical);
793
+ expect(critical).toBeLessThanOrEqual(maxValue);
794
+ }
795
+ });
796
+ });
797
+
798
+ describe("Core Web Vital trend charts", () => {
799
+ for (const chart of CHARTS) {
800
+ test(`"${chart.title}" is a ${chart.chartType} chart of ${chart.metricName}`, () => {
801
+ const config: DashboardViewConfig = getConfig();
802
+ const widget: DashboardBaseComponent = findWidget(config, chart.title);
803
+ const alias: WidgetArguments | undefined = metricAliasDataOf(widget);
804
+
805
+ expect(widget.componentType).toBe(DashboardComponentType.Chart);
806
+ expect(argumentsOf(widget)["chartType"]).toBe(chart.chartType);
807
+ expect(metricNameOf(widget)).toBe(chart.metricName);
808
+ expect(aggregationOf(widget)).toBe(chart.aggregationType);
809
+ expect(alias).toBeDefined();
810
+ expect((alias as WidgetArguments)["legend"]).toBe(chart.legend);
811
+ expect((alias as WidgetArguments)["legendUnit"]).toBe(chart.legendUnit);
812
+ expect(slotOf(widget)).toEqual(chart.slot);
813
+ });
814
+ }
815
+
816
+ /*
817
+ * Charts go through buildMetricQueryConfig (which carries
818
+ * metricAliasData); Value tiles and gauges go through
819
+ * buildMetricQueryData, which omits it entirely — so a legend or
820
+ * legendUnit set on those would be inert config that reads as if it
821
+ * were doing something.
822
+ *
823
+ * NOTE ON WHAT THIS GUARDS: the "never" half is enforced structurally by
824
+ * the shared buildMetricQueryData factory, so no edit confined to
825
+ * createRumDashboardConfig can break it — it is a regression guard on
826
+ * that shared factory, not on this template. The legend-uniqueness
827
+ * assertion below is the half a template edit can break: two charts
828
+ * sharing a legend render two indistinguishable series names.
829
+ */
830
+ test("carries metricAliasData on charts only, never on value tiles or gauges", () => {
831
+ const config: DashboardViewConfig = getConfig();
832
+ const charts: Array<DashboardBaseComponent> = componentsOfType(
833
+ config,
834
+ DashboardComponentType.Chart,
835
+ );
836
+ const aliaslessWidgets: Array<DashboardBaseComponent> = [
837
+ ...componentsOfType(config, DashboardComponentType.Value),
838
+ ...componentsOfType(config, DashboardComponentType.Gauge),
839
+ ];
840
+
841
+ expect(charts).toHaveLength(CHARTS.length);
842
+ expect(aliaslessWidgets).toHaveLength(VALUE_TILES.length + GAUGES.length);
843
+
844
+ const legends: Array<string> = [];
845
+
846
+ for (const chart of charts) {
847
+ const alias: WidgetArguments | undefined = metricAliasDataOf(chart);
848
+ expect(alias).toBeDefined();
849
+
850
+ const legend: unknown = (alias as WidgetArguments)["legend"];
851
+ expect(typeof legend).toBe("string");
852
+ expect((legend as string).length).toBeGreaterThan(0);
853
+ legends.push(legend as string);
854
+ }
855
+
856
+ // Two charts sharing a legend render two series nobody can tell apart.
857
+ expect(new Set(legends).size).toBe(charts.length);
858
+
859
+ for (const widget of aliaslessWidgets) {
860
+ expect(metricAliasDataOf(widget)).toBeUndefined();
861
+ expect(Object.keys(metricQueryConfigOf(widget))).not.toContain(
862
+ "metricAliasData",
863
+ );
864
+ }
865
+ });
866
+ });
867
+
868
+ describe("span-based trace widgets", () => {
869
+ test("charts each analytics metric against its own group-by dimension", () => {
870
+ const config: DashboardViewConfig = getConfig();
871
+
872
+ expect(
873
+ componentsOfType(config, DashboardComponentType.TraceChart),
874
+ ).toHaveLength(TRACE_CHARTS.length);
875
+
876
+ for (const traceChart of TRACE_CHARTS) {
877
+ const widget: DashboardBaseComponent = findWidget(
878
+ config,
879
+ traceChart.title,
880
+ );
881
+ const args: WidgetArguments = argumentsOf(widget);
882
+
883
+ expect(widget.componentType).toBe(DashboardComponentType.TraceChart);
884
+ expect(args["metric"]).toBe(traceChart.metric);
885
+ expect(args["groupByAttribute"]).toBe(traceChart.groupByAttribute);
886
+ expect(args["topLimit"]).toBe(10);
887
+ expect(slotOf(widget)).toEqual(traceChart.slot);
888
+ }
889
+ });
890
+
891
+ /*
892
+ * The `metric` strings above are free-form in the type, so pinning them
893
+ * against a local fixture only proves the template matches itself. The
894
+ * TraceChart widget's own Metric dropdown is the accepted vocabulary a
895
+ * user could otherwise have picked from — a template metric outside it
896
+ * is one the editor cannot even express.
897
+ */
898
+ test("charts only metrics the TraceChart editor itself offers", () => {
899
+ const config: DashboardViewConfig = getConfig();
900
+ const offered: Array<string> = traceChartMetricsOfferedByEditor();
901
+ const traceCharts: Array<DashboardBaseComponent> = componentsOfType(
902
+ config,
903
+ DashboardComponentType.TraceChart,
904
+ );
905
+
906
+ expect(traceCharts).toHaveLength(TRACE_CHARTS.length);
907
+ // The offered set is closed — otherwise `toContain` proves nothing.
908
+ expect(offered).not.toContain("web_vital.lcp");
909
+
910
+ for (const widget of traceCharts) {
911
+ expect(offered).toContain(argumentsOf(widget)["metric"]);
912
+ }
913
+ });
914
+
915
+ test("breaks traffic down by application, route and platform", () => {
916
+ const config: DashboardViewConfig = getConfig();
917
+
918
+ expect(
919
+ componentsOfType(config, DashboardComponentType.TraceTable),
920
+ ).toHaveLength(TRACE_TABLES.length);
921
+
922
+ for (const traceTable of TRACE_TABLES) {
923
+ const widget: DashboardBaseComponent = findWidget(
924
+ config,
925
+ traceTable.title,
926
+ );
927
+ const args: WidgetArguments = argumentsOf(widget);
928
+
929
+ expect(widget.componentType).toBe(DashboardComponentType.TraceTable);
930
+ expect(args["groupByAttribute"]).toBe(traceTable.groupByAttribute);
931
+ expect(args["topLimit"]).toBe(10);
932
+ expect(slotOf(widget)).toEqual(traceTable.slot);
933
+ }
934
+ });
935
+
936
+ /*
937
+ * Trace widgets are scoped by their group-by dimension, not by a
938
+ * filter: `rumApplicationId` compiles to
939
+ * `primaryEntityType = 'RealUserMonitor'` and a plain attribute key to
940
+ * `mapContains(attributes, key)` (TraceAggregationService). A trace
941
+ * widget without one would silently chart every span in the project,
942
+ * backend included.
943
+ */
944
+ test("gives every trace widget a scoping group-by dimension", () => {
945
+ const config: DashboardViewConfig = getConfig();
946
+ const traceWidgets: Array<DashboardBaseComponent> =
947
+ traceWidgetsOf(config);
948
+
949
+ expect(traceWidgets).toHaveLength(
950
+ TRACE_CHARTS.length + TRACE_TABLES.length,
951
+ );
952
+
953
+ for (const widget of traceWidgets) {
954
+ const groupBy: unknown = argumentsOf(widget)["groupByAttribute"];
955
+ expect(typeof groupBy).toBe("string");
956
+ expect((groupBy as string).length).toBeGreaterThan(0);
957
+ }
958
+ });
959
+ });
960
+
961
+ describe("recent logs stream", () => {
962
+ test("sits beside the platform breakdown in the bottom row", () => {
963
+ const config: DashboardViewConfig = getConfig();
964
+ const widget: DashboardBaseComponent = findWidget(
965
+ config,
966
+ LOG_STREAM_TITLE,
967
+ );
968
+
969
+ expect(widget.componentType).toBe(DashboardComponentType.LogStream);
970
+ expect(slotOf(widget)).toEqual(LOG_STREAM_SLOT);
971
+ });
972
+ });
973
+
974
+ describe("variables", () => {
975
+ test("ships exactly the application and platform pickers, in order", () => {
976
+ const config: DashboardViewConfig = getConfig();
977
+ const variables: Array<DashboardVariable> = config.variables || [];
978
+
979
+ expect(variables).toHaveLength(2);
980
+ expect(
981
+ variables.map(
982
+ (variable: DashboardVariable): Record<string, unknown> => {
983
+ return {
984
+ name: variable.name,
985
+ label: variable.label,
986
+ type: variable.type,
987
+ attributeKey: variable.attributeKey,
988
+ isMultiSelect: variable.isMultiSelect,
989
+ };
990
+ },
991
+ ),
992
+ ).toEqual([
993
+ {
994
+ name: "application",
995
+ label: "Application",
996
+ type: DashboardVariableType.TelemetryAttribute,
997
+ attributeKey: "resource.service.name",
998
+ isMultiSelect: true,
999
+ },
1000
+ {
1001
+ name: "platform",
1002
+ label: "Platform",
1003
+ type: DashboardVariableType.TelemetryAttribute,
1004
+ attributeKey: "resource.browser.platform",
1005
+ isMultiSelect: true,
1006
+ },
1007
+ ]);
1008
+ });
1009
+
1010
+ /*
1011
+ * `app.route` is recorded on metrics and spans but never on logs, so
1012
+ * binding a variable to it would empty "Recent Browser Logs" whenever
1013
+ * a route is selected, reading as "this route produced no logs".
1014
+ */
1015
+ test("never binds a variable to app.route, which logs do not carry", () => {
1016
+ const config: DashboardViewConfig = getConfig();
1017
+ const variables: Array<DashboardVariable> = config.variables || [];
1018
+
1019
+ expect(variables.length).toBeGreaterThan(0);
1020
+
1021
+ for (const variable of variables) {
1022
+ expect(variable.attributeKey).not.toBe("app.route");
1023
+ }
1024
+ });
1025
+ });
1026
+
1027
+ describe("section headers", () => {
1028
+ test("lays out the four bold section headers in row order", () => {
1029
+ const config: DashboardViewConfig = getConfig();
1030
+ const headers: Array<DashboardBaseComponent> = componentsOfType(
1031
+ config,
1032
+ DashboardComponentType.Text,
1033
+ ).sort((a: DashboardBaseComponent, b: DashboardBaseComponent): number => {
1034
+ return a.topInDashboardUnits - b.topInDashboardUnits;
1035
+ });
1036
+
1037
+ expect(headers).toHaveLength(SECTION_HEADERS.length);
1038
+ expect(
1039
+ headers.map((header: DashboardBaseComponent): string => {
1040
+ return titleOf(header);
1041
+ }),
1042
+ ).toEqual(SECTION_HEADERS);
1043
+
1044
+ for (const header of headers) {
1045
+ expect(argumentsOf(header)["isBold"]).toBe(true);
1046
+ expect(header.widthInDashboardUnits).toBe(GRID_WIDTH_IN_UNITS);
1047
+ }
1048
+ });
1049
+
1050
+ /*
1051
+ * The trace analytics endpoint does not read dashboard variables, so
1052
+ * the toolbar pickers narrow the metric widgets and the log stream but
1053
+ * not this section. A header that does not say so invites reading the
1054
+ * two halves of the dashboard as one filtered view.
1055
+ */
1056
+ test("warns that the span-based section is not narrowed by the variables", () => {
1057
+ const config: DashboardViewConfig = getConfig();
1058
+
1059
+ /*
1060
+ * Found STRUCTURALLY — the Text widget sitting immediately above the
1061
+ * first trace chart — rather than by its own text, so that dropping
1062
+ * the warning, or moving the header away from the section it
1063
+ * introduces, fails instead of merely retargeting the lookup.
1064
+ */
1065
+ const traceCharts: Array<DashboardBaseComponent> = componentsOfType(
1066
+ config,
1067
+ DashboardComponentType.TraceChart,
1068
+ );
1069
+
1070
+ expect(traceCharts.length).toBeGreaterThan(0);
1071
+
1072
+ const firstTraceChartTop: number = Math.min(
1073
+ ...traceCharts.map((chart: DashboardBaseComponent): number => {
1074
+ return chart.topInDashboardUnits;
1075
+ }),
1076
+ );
1077
+
1078
+ const headersAbove: Array<DashboardBaseComponent> = componentsOfType(
1079
+ config,
1080
+ DashboardComponentType.Text,
1081
+ ).filter((header: DashboardBaseComponent): boolean => {
1082
+ return header.topInDashboardUnits < firstTraceChartTop;
1083
+ });
1084
+
1085
+ expect(headersAbove.length).toBeGreaterThan(0);
1086
+
1087
+ const header: DashboardBaseComponent = headersAbove.reduce(
1088
+ (
1089
+ lowest: DashboardBaseComponent,
1090
+ candidate: DashboardBaseComponent,
1091
+ ): DashboardBaseComponent => {
1092
+ return candidate.topInDashboardUnits > lowest.topInDashboardUnits
1093
+ ? candidate
1094
+ : lowest;
1095
+ },
1096
+ );
1097
+
1098
+ const text: string = argumentsOf(header)["text"] as string;
1099
+
1100
+ expect(text).toContain("span-based");
1101
+ expect(text).toContain("not narrowed by the filters above");
1102
+ // And it introduces the section rather than floating far above it.
1103
+ expect(header.topInDashboardUnits).toBe(firstTraceChartTop - 1);
1104
+ });
1105
+ });
1106
+
1107
+ describe("layout", () => {
1108
+ test("lays widgets out inside the 12-unit grid without overlapping", () => {
1109
+ const config: DashboardViewConfig = getConfig();
1110
+ const occupied: Set<string> = new Set();
1111
+
1112
+ expect(config.components.length).toBeGreaterThan(0);
1113
+
1114
+ for (const component of config.components) {
1115
+ expect(component.leftInDashboardUnits).toBeGreaterThanOrEqual(0);
1116
+ expect(component.topInDashboardUnits).toBeGreaterThanOrEqual(0);
1117
+ expect(
1118
+ component.leftInDashboardUnits + component.widthInDashboardUnits,
1119
+ ).toBeLessThanOrEqual(GRID_WIDTH_IN_UNITS);
1120
+
1121
+ for (
1122
+ let row: number = component.topInDashboardUnits;
1123
+ row <
1124
+ component.topInDashboardUnits + component.heightInDashboardUnits;
1125
+ row++
1126
+ ) {
1127
+ for (
1128
+ let column: number = component.leftInDashboardUnits;
1129
+ column <
1130
+ component.leftInDashboardUnits + component.widthInDashboardUnits;
1131
+ column++
1132
+ ) {
1133
+ const cell: string = `${row}:${column}`;
1134
+ expect(occupied.has(cell)).toBe(false);
1135
+ occupied.add(cell);
1136
+ }
1137
+ }
1138
+ }
1139
+ });
1140
+
1141
+ // A blank band mid-dashboard reads as a widget that failed to render.
1142
+ test("leaves no empty rows between the title and the last widget", () => {
1143
+ const config: DashboardViewConfig = getConfig();
1144
+ const occupiedRows: Set<number> = new Set();
1145
+
1146
+ expect(config.components.length).toBeGreaterThan(0);
1147
+
1148
+ for (const component of config.components) {
1149
+ for (
1150
+ let row: number = component.topInDashboardUnits;
1151
+ row <
1152
+ component.topInDashboardUnits + component.heightInDashboardUnits;
1153
+ row++
1154
+ ) {
1155
+ occupiedRows.add(row);
1156
+ }
1157
+ }
1158
+
1159
+ const lastRow: number = Math.max(...Array.from(occupiedRows));
1160
+
1161
+ for (let row: number = 0; row <= lastRow; row++) {
1162
+ expect(occupiedRows.has(row)).toBe(true);
1163
+ }
1164
+ });
1165
+
1166
+ test("is tall enough to hold its bottom row", () => {
1167
+ const config: DashboardViewConfig = getConfig();
1168
+ const lowestRow: number = Math.max(
1169
+ ...config.components.map(
1170
+ (component: DashboardBaseComponent): number => {
1171
+ return (
1172
+ component.topInDashboardUnits + component.heightInDashboardUnits
1173
+ );
1174
+ },
1175
+ ),
1176
+ );
1177
+
1178
+ expect(config.heightInDashboardUnits).toBeGreaterThanOrEqual(lowestRow);
1179
+ });
1180
+
1181
+ // Below its own minimum a widget renders clipped from the moment it loads.
1182
+ test("sizes every widget at or above its declared minimum", () => {
1183
+ const config: DashboardViewConfig = getConfig();
1184
+
1185
+ expect(config.components).toHaveLength(
1186
+ Object.keys(EXPECTED_WIDGETS).length,
1187
+ );
1188
+
1189
+ for (const component of config.components) {
1190
+ expect(component.widthInDashboardUnits).toBeGreaterThanOrEqual(
1191
+ component.minWidthInDashboardUnits,
1192
+ );
1193
+ expect(component.heightInDashboardUnits).toBeGreaterThanOrEqual(
1194
+ component.minHeightInDashboardUnits,
1195
+ );
1196
+ }
1197
+ });
1198
+ });
1199
+
1200
+ /*
1201
+ * Each call has to mint fresh ids: reusing them would make two dashboards
1202
+ * created from this template collide in any per-component stored state.
1203
+ */
1204
+ test("mints disjoint component and variable ids on every call", () => {
1205
+ const first: DashboardViewConfig = getConfig();
1206
+ const second: DashboardViewConfig = getConfig();
1207
+
1208
+ expect(second.components).toHaveLength(first.components.length);
1209
+ expect(second.components.length).toBeGreaterThan(0);
1210
+
1211
+ const firstComponentIds: Array<string> = componentIdsOf(first);
1212
+ const secondComponentIds: Array<string> = componentIdsOf(second);
1213
+
1214
+ // Unique WITHIN each config, not just across the two.
1215
+ expect(new Set(firstComponentIds).size).toBe(firstComponentIds.length);
1216
+ expect(new Set(secondComponentIds).size).toBe(secondComponentIds.length);
1217
+
1218
+ const seenComponentIds: Set<string> = new Set(firstComponentIds);
1219
+
1220
+ for (const componentId of secondComponentIds) {
1221
+ expect(seenComponentIds.has(componentId)).toBe(false);
1222
+ }
1223
+
1224
+ const firstVariableIds: Array<string> = variableIdsOf(first);
1225
+ const secondVariableIds: Array<string> = variableIdsOf(second);
1226
+
1227
+ expect(firstVariableIds.length).toBeGreaterThan(0);
1228
+ expect(secondVariableIds).toHaveLength(firstVariableIds.length);
1229
+ expect(new Set(firstVariableIds).size).toBe(firstVariableIds.length);
1230
+ expect(new Set(secondVariableIds).size).toBe(secondVariableIds.length);
1231
+
1232
+ const seenVariableIds: Set<string> = new Set(firstVariableIds);
1233
+
1234
+ for (const variableId of secondVariableIds) {
1235
+ expect(seenVariableIds.has(variableId)).toBe(false);
1236
+ }
1237
+ });
1238
+ });