@oneuptime/common 14.0.9 → 14.0.10

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 (383) hide show
  1. package/Models/DatabaseModels/AutoRemediationSuggestion.ts +60 -0
  2. package/Models/DatabaseModels/CephCluster.ts +213 -0
  3. package/Models/DatabaseModels/DatabaseServer.ts +213 -0
  4. package/Models/DatabaseModels/DockerHost.ts +213 -0
  5. package/Models/DatabaseModels/DockerSwarmCluster.ts +213 -0
  6. package/Models/DatabaseModels/GlobalConfig.ts +1 -1
  7. package/Models/DatabaseModels/Host.ts +213 -0
  8. package/Models/DatabaseModels/Index.ts +2 -0
  9. package/Models/DatabaseModels/PodmanHost.ts +213 -0
  10. package/Models/DatabaseModels/ProxmoxCluster.ts +213 -0
  11. package/Models/DatabaseModels/ResourceAiAgent.ts +419 -0
  12. package/Models/DatabaseModels/RunnerJob.ts +144 -0
  13. package/Models/DatabaseModels/VMwareVCenter.ts +213 -0
  14. package/Server/API/AutoRemediationAPI.ts +392 -1
  15. package/Server/API/ResourceAiAccessAPI.ts +1669 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.ts +423 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  18. package/Server/Infrastructure/Semaphore.ts +22 -0
  19. package/Server/Middleware/TelemetryIngest.ts +15 -5
  20. package/Server/Services/AnalyticsDatabaseService.ts +45 -1
  21. package/Server/Services/AutoRemediationRuleEngineService.ts +940 -112
  22. package/Server/Services/CephClusterService.ts +109 -1
  23. package/Server/Services/DatabaseServerService.ts +116 -1
  24. package/Server/Services/DockerHostService.ts +109 -1
  25. package/Server/Services/DockerSwarmClusterService.ts +113 -1
  26. package/Server/Services/HostService.ts +126 -4
  27. package/Server/Services/MetricRecordingRuleService.ts +47 -0
  28. package/Server/Services/PodmanHostService.ts +109 -1
  29. package/Server/Services/ProxmoxClusterService.ts +110 -1
  30. package/Server/Services/ResourceAiAccessService.ts +1439 -0
  31. package/Server/Services/ResourceAiAgentJobService.ts +202 -0
  32. package/Server/Services/ResourceAiAgentService.ts +2432 -0
  33. package/Server/Services/RunnerJobService.ts +611 -4
  34. package/Server/Services/TelemetryUsageBillingService.ts +28 -0
  35. package/Server/Services/TraceRecordingRuleService.ts +33 -0
  36. package/Server/Services/VMwareVCenterService.ts +110 -1
  37. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1434 -32
  38. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +935 -21
  39. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +25 -1
  40. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +577 -0
  41. package/Server/Utils/AI/ResourceAccess/ResourceAccessContext.ts +271 -0
  42. package/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.ts +45 -0
  43. package/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.ts +964 -0
  44. package/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.ts +333 -0
  45. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +873 -0
  46. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +72 -2
  47. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +72 -5
  48. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +72 -5
  49. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +396 -13
  50. package/Server/Utils/AutoRemediation/RemediationVerifier.ts +35 -2
  51. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +9 -1
  52. package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +920 -0
  53. package/Server/Utils/SessionReplay/SessionReplayUsage.ts +84 -6
  54. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +35 -15
  55. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +33 -15
  56. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +21 -1
  57. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +298 -224
  58. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +35 -15
  59. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +389 -175
  60. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +366 -143
  61. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts +163 -0
  62. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +396 -0
  63. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.ts +418 -0
  64. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.ts +152 -0
  65. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.ts +251 -0
  66. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.ts +214 -0
  67. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +93 -0
  68. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +18 -6
  69. package/Tests/App/Dashboard/InvestigationInfrastructureTools.test.tsx +506 -0
  70. package/Tests/App/Dashboard/RemediationSuggestionCardDescription.test.tsx +209 -0
  71. package/Tests/App/Dashboard/RemediationSuggestionCardResource.test.tsx +317 -0
  72. package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +921 -0
  73. package/Tests/App/Dashboard/ResourceAiAgentInstall.test.ts +860 -0
  74. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +1721 -0
  75. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +1002 -0
  76. package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +931 -0
  77. package/Tests/App/Dashboard/ResourceAiNavigation.test.tsx +575 -0
  78. package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +38 -7
  79. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +33 -1
  80. package/Tests/Models/DatabaseModels/ResourceAiAccessColumns.test.ts +738 -0
  81. package/Tests/Models/DatabaseModels/ResourceAiAgentModel.test.ts +842 -0
  82. package/Tests/Server/API/AutoRemediationApproveResourceRound.test.ts +835 -0
  83. package/Tests/Server/API/ResourceAiAccessAPI.test.ts +2730 -0
  84. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +60 -0
  85. package/Tests/Server/Infrastructure/Postgres/AddResourceAiAgentsMigration.test.ts +659 -0
  86. package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +31 -0
  87. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +63 -5
  88. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +103 -5
  89. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +19 -1
  90. package/Tests/Server/Services/AutoRemediationResourceRuleEngine.test.ts +1279 -0
  91. package/Tests/Server/Services/DatabaseServerService.test.ts +55 -0
  92. package/Tests/Server/Services/GroupTelemetryUsageExcludeNames.test.ts +299 -0
  93. package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +44 -0
  94. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +45 -6
  95. package/Tests/Server/Services/RecordingRuleReservedMetricName.test.ts +171 -0
  96. package/Tests/Server/Services/ResourceAiAccessChangeAuthorization.test.ts +256 -0
  97. package/Tests/Server/Services/ResourceAiAccessService.test.ts +1373 -0
  98. package/Tests/Server/Services/ResourceAiAgentJobService.test.ts +375 -0
  99. package/Tests/Server/Services/ResourceAiAgentServiceHelpers.test.ts +1114 -0
  100. package/Tests/Server/Services/ResourceAiAgentServiceLifecycle.test.ts +1050 -0
  101. package/Tests/Server/Services/ResourceAiAgentServiceRegister.test.ts +2251 -0
  102. package/Tests/Server/Services/ResourceAiSettingsCreate.test.ts +373 -0
  103. package/Tests/Server/Services/ResourceAiSettingsPermission.test.ts +1042 -0
  104. package/Tests/Server/Services/ResourceServiceDeleteCleansUpAi.test.ts +319 -0
  105. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +105 -0
  106. package/Tests/Server/Services/RunnerJobEnqueueResourceCommand.test.ts +986 -0
  107. package/Tests/Server/Services/RunnerJobResourceCommandLane.test.ts +211 -0
  108. package/Tests/Server/Services/RunnerJobResourceCommandTimeoutAndRedaction.test.ts +352 -0
  109. package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +218 -0
  110. package/Tests/Server/TestingUtils/Services/FakeRunnerJobCount.ts +145 -0
  111. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +453 -0
  112. package/Tests/Server/Utils/AI/InvestigationInfrastructureReport.test.ts +721 -0
  113. package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +94 -1
  114. package/Tests/Server/Utils/AI/RemediationCommandToolsResource.test.ts +1530 -0
  115. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +1249 -0
  116. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +117 -0
  117. package/Tests/Server/Utils/AI/RemediationResourceCopyParity.test.ts +463 -0
  118. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +722 -0
  119. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +266 -0
  120. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.test.ts +1220 -0
  121. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.test.ts +569 -0
  122. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +830 -0
  123. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorResource.test.ts +717 -0
  124. package/Tests/Server/Utils/AutoRemediation/RemediationVerifierResourceFollowUp.test.ts +338 -0
  125. package/Tests/Server/Utils/Monitor/Criteria/SessionReplayBudgetTemplateCriteria.test.ts +422 -0
  126. package/Tests/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.test.ts +1647 -0
  127. package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +143 -1
  128. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +33 -3
  129. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsAccountNotLinked.test.ts +1093 -0
  130. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.test.ts +1049 -0
  131. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +1676 -0
  132. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCards.test.ts +2884 -0
  133. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.test.ts +2490 -0
  134. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmit.test.ts +2293 -0
  135. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmitServerTimezone.test.ts +386 -0
  136. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.test.ts +1477 -0
  137. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.test.ts +1967 -0
  138. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsStripHtmlTags.test.ts +92 -0
  139. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsSubmittedFormRemoval.test.ts +1819 -0
  140. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.test.ts +1033 -0
  141. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezoneServerZone.test.ts +610 -0
  142. package/Tests/Server/Utils/Workspace/MicrosoftTeamsBotMessageHandling.test.ts +2610 -0
  143. package/Tests/Server/Utils/Workspace/MicrosoftTeamsCreateCommandsEndToEnd.test.ts +4672 -0
  144. package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +190 -65
  145. package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +10 -4
  146. package/Tests/Types/AutoRemediation/AiRemediationCommandPlanResourceCommand.test.ts +305 -0
  147. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +277 -13
  148. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +113 -0
  149. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +773 -2
  150. package/Tests/Types/ResourceAiAgent/AiResourceType.test.ts +419 -0
  151. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +517 -0
  152. package/Tests/Types/Runbook/RunbookStepType.test.ts +147 -8
  153. package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +769 -1
  154. package/Tests/Utils/AiRemediation/Resource/CephCommandPolicy.test.ts +1653 -0
  155. package/Tests/Utils/AiRemediation/Resource/CephOutputRedaction.test.ts +204 -0
  156. package/Tests/Utils/AiRemediation/Resource/DatabaseCommandPolicy.test.ts +1077 -0
  157. package/Tests/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.test.ts +558 -0
  158. package/Tests/Utils/AiRemediation/Resource/DatabaseQueryRedactor.test.ts +834 -0
  159. package/Tests/Utils/AiRemediation/Resource/DockerCliGrammar.test.ts +747 -0
  160. package/Tests/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.test.ts +1259 -0
  161. package/Tests/Utils/AiRemediation/Resource/DockerOutputRedaction.test.ts +386 -0
  162. package/Tests/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.test.ts +782 -0
  163. package/Tests/Utils/AiRemediation/Resource/GovcCommandPolicy.test.ts +2259 -0
  164. package/Tests/Utils/AiRemediation/Resource/HostCommandPolicy.test.ts +2019 -0
  165. package/Tests/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.test.ts +2497 -0
  166. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicy.test.ts +1305 -0
  167. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.test.ts +585 -0
  168. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactor.test.ts +334 -0
  169. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactorCopyParity.test.ts +98 -0
  170. package/Tests/Utils/AiRemediation/Resource/ResourcePolicyImportClosure.test.ts +391 -0
  171. package/Tests/Utils/AiRemediation/ResourceAiAgentPolicyCopyParity.test.ts +497 -0
  172. package/Tests/Utils/SessionReplay/SessionReplayBudgetMetricType.test.ts +383 -0
  173. package/Types/AI/ResourceAiAccessApi.ts +140 -0
  174. package/Types/AI/ResourceAiAccessPermissions.ts +126 -0
  175. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +183 -2
  176. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +55 -22
  177. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +35 -3
  178. package/Types/Monitor/RumAlertTemplates.ts +351 -4
  179. package/Types/ResourceAiAgent/AiResourceType.ts +310 -0
  180. package/Types/ResourceAiAgent/ResourceAiAccess.ts +574 -0
  181. package/Types/Rum/SessionReplayBudgetMetricType.ts +47 -0
  182. package/Types/Runbook/RunbookStepType.ts +29 -0
  183. package/Types/Telemetry/TelemetryIngestSurface.ts +14 -2
  184. package/Utils/AI/InvestigationReport.ts +121 -15
  185. package/Utils/AiRemediation/Resource/CephCommandPolicy.ts +1936 -0
  186. package/Utils/AiRemediation/Resource/DatabaseCommandPolicy.ts +166 -0
  187. package/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.ts +1532 -0
  188. package/Utils/AiRemediation/Resource/DatabaseQueryRedactor.ts +1394 -0
  189. package/Utils/AiRemediation/Resource/DockerCliGrammar.ts +1839 -0
  190. package/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.ts +490 -0
  191. package/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.ts +687 -0
  192. package/Utils/AiRemediation/Resource/GovcCommandPolicy.ts +2096 -0
  193. package/Utils/AiRemediation/Resource/HostCommandPolicy.ts +2982 -0
  194. package/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.ts +1679 -0
  195. package/Utils/AiRemediation/Resource/ResourceCommandPolicy.ts +851 -0
  196. package/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.ts +593 -0
  197. package/Utils/AiRemediation/Resource/ResourceOutputRedactor.ts +2812 -0
  198. package/Utils/SessionReplay/SessionReplayBudgetMetricType.ts +184 -0
  199. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
  200. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
  201. package/build/dist/Models/DatabaseModels/CephCluster.js +219 -0
  202. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  203. package/build/dist/Models/DatabaseModels/DatabaseServer.js +219 -0
  204. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  205. package/build/dist/Models/DatabaseModels/DockerHost.js +219 -0
  206. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  207. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +219 -0
  208. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  209. package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
  210. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  211. package/build/dist/Models/DatabaseModels/Host.js +219 -0
  212. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  213. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  214. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  215. package/build/dist/Models/DatabaseModels/PodmanHost.js +219 -0
  216. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  217. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +219 -0
  218. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  219. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js +439 -0
  220. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js.map +1 -0
  221. package/build/dist/Models/DatabaseModels/RunnerJob.js +145 -0
  222. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  223. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +219 -0
  224. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  225. package/build/dist/Server/API/AutoRemediationAPI.js +231 -1
  226. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  227. package/build/dist/Server/API/ResourceAiAccessAPI.js +1119 -0
  228. package/build/dist/Server/API/ResourceAiAccessAPI.js.map +1 -0
  229. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js +168 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js.map +1 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  232. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  233. package/build/dist/Server/Infrastructure/Semaphore.js +6 -0
  234. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  235. package/build/dist/Server/Middleware/TelemetryIngest.js +12 -5
  236. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  237. package/build/dist/Server/Services/AnalyticsDatabaseService.js +26 -1
  238. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  239. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +601 -3
  240. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  241. package/build/dist/Server/Services/CephClusterService.js +104 -0
  242. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  243. package/build/dist/Server/Services/DatabaseServerService.js +99 -0
  244. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
  245. package/build/dist/Server/Services/DockerHostService.js +104 -0
  246. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  247. package/build/dist/Server/Services/DockerSwarmClusterService.js +104 -0
  248. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  249. package/build/dist/Server/Services/HostService.js +114 -2
  250. package/build/dist/Server/Services/HostService.js.map +1 -1
  251. package/build/dist/Server/Services/MetricRecordingRuleService.js +46 -0
  252. package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
  253. package/build/dist/Server/Services/PodmanHostService.js +104 -0
  254. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  255. package/build/dist/Server/Services/ProxmoxClusterService.js +104 -0
  256. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  257. package/build/dist/Server/Services/ResourceAiAccessService.js +1028 -0
  258. package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -0
  259. package/build/dist/Server/Services/ResourceAiAgentJobService.js +173 -0
  260. package/build/dist/Server/Services/ResourceAiAgentJobService.js.map +1 -0
  261. package/build/dist/Server/Services/ResourceAiAgentService.js +1687 -0
  262. package/build/dist/Server/Services/ResourceAiAgentService.js.map +1 -0
  263. package/build/dist/Server/Services/RunnerJobService.js +344 -5
  264. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  265. package/build/dist/Server/Services/TelemetryUsageBillingService.js +26 -0
  266. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  267. package/build/dist/Server/Services/TraceRecordingRuleService.js +37 -0
  268. package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -1
  269. package/build/dist/Server/Services/VMwareVCenterService.js +104 -0
  270. package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
  271. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1029 -30
  272. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  273. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +633 -28
  274. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  275. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +21 -1
  276. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  277. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +330 -0
  278. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -0
  279. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js +160 -0
  280. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js.map +1 -0
  281. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js +33 -0
  282. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js.map +1 -0
  283. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js +640 -0
  284. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js.map +1 -0
  285. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js +226 -0
  286. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js.map +1 -0
  287. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +600 -0
  288. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -0
  289. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +50 -4
  290. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  291. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +55 -4
  292. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  293. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +55 -4
  294. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  295. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +290 -13
  296. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  297. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +29 -1
  298. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
  299. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +9 -1
  300. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  301. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +627 -0
  302. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js.map +1 -0
  303. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +60 -5
  304. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -1
  305. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +19 -15
  306. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  307. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +19 -15
  308. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  309. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +17 -1
  310. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
  311. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +183 -209
  312. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  313. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +19 -15
  314. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  315. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +233 -167
  316. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
  317. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +263 -110
  318. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  319. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js +129 -0
  320. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map +1 -0
  321. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +266 -0
  322. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -0
  323. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js +258 -0
  324. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js.map +1 -0
  325. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js +104 -0
  326. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js.map +1 -0
  327. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js +183 -0
  328. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js.map +1 -0
  329. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js +123 -0
  330. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js.map +1 -0
  331. package/build/dist/Types/AI/ResourceAiAccessApi.js +30 -0
  332. package/build/dist/Types/AI/ResourceAiAccessApi.js.map +1 -0
  333. package/build/dist/Types/AI/ResourceAiAccessPermissions.js +98 -0
  334. package/build/dist/Types/AI/ResourceAiAccessPermissions.js.map +1 -0
  335. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +116 -29
  336. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  337. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +47 -21
  338. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  339. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +5 -0
  340. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  341. package/build/dist/Types/Monitor/RumAlertTemplates.js +199 -3
  342. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  343. package/build/dist/Types/ResourceAiAgent/AiResourceType.js +242 -0
  344. package/build/dist/Types/ResourceAiAgent/AiResourceType.js.map +1 -0
  345. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +275 -0
  346. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -0
  347. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js +45 -0
  348. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js.map +1 -0
  349. package/build/dist/Types/Runbook/RunbookStepType.js +27 -0
  350. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  351. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +13 -2
  352. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  353. package/build/dist/Utils/AI/InvestigationReport.js +71 -11
  354. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
  355. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js +1462 -0
  356. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js.map +1 -0
  357. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js +122 -0
  358. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js.map +1 -0
  359. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js +1139 -0
  360. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js.map +1 -0
  361. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js +1060 -0
  362. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js.map +1 -0
  363. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js +1301 -0
  364. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js.map +1 -0
  365. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js +370 -0
  366. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js.map +1 -0
  367. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js +498 -0
  368. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js.map +1 -0
  369. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js +1565 -0
  370. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js.map +1 -0
  371. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js +2206 -0
  372. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js.map +1 -0
  373. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js +1129 -0
  374. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js.map +1 -0
  375. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js +565 -0
  376. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js.map +1 -0
  377. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js +408 -0
  378. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js.map +1 -0
  379. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js +1910 -0
  380. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js.map +1 -0
  381. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js +160 -0
  382. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js.map +1 -0
  383. package/package.json +1 -1
@@ -0,0 +1,422 @@
1
+ /*
2
+ * MonitorCriteriaEvaluator reaches the template renderer, which loads the
3
+ * native isolated-vm addon. Nothing here uses the sandbox and the prebuilt
4
+ * binary cannot always dlopen in the test environment.
5
+ */
6
+ jest.mock("isolated-vm", () => {
7
+ return {};
8
+ });
9
+
10
+ import Monitor from "../../../../../Models/DatabaseModels/Monitor";
11
+ import MonitorCriteriaEvaluator from "../../../../../Server/Utils/Monitor/MonitorCriteriaEvaluator";
12
+ import AggregateModel from "../../../../../Types/BaseDatabase/AggregatedModel";
13
+ import AggregatedResult from "../../../../../Types/BaseDatabase/AggregatedResult";
14
+ import { JSONObject } from "../../../../../Types/JSON";
15
+ import MetricsViewConfig from "../../../../../Types/Metrics/MetricsViewConfig";
16
+ import { NoDataPolicy } from "../../../../../Types/Monitor/CriteriaFilter";
17
+ import MetricMonitorResponse from "../../../../../Types/Monitor/MetricMonitor/MetricMonitorResponse";
18
+ import MonitorCriteriaInstance from "../../../../../Types/Monitor/MonitorCriteriaInstance";
19
+ import MonitorEvaluationSummary, {
20
+ MonitorEvaluationCriteriaResult,
21
+ } from "../../../../../Types/Monitor/MonitorEvaluationSummary";
22
+ import MonitorStep from "../../../../../Types/Monitor/MonitorStep";
23
+ import MonitorType from "../../../../../Types/Monitor/MonitorType";
24
+ import {
25
+ RumAlertTemplate,
26
+ getRumAlertTemplateById,
27
+ } from "../../../../../Types/Monitor/RumAlertTemplates";
28
+ import ObjectID from "../../../../../Types/ObjectID";
29
+ import ProbeApiIngestResponse from "../../../../../Types/Probe/ProbeApiIngestResponse";
30
+ import SessionReplayBudgetMetricTypeUtil from "../../../../../Utils/SessionReplay/SessionReplayBudgetMetricType";
31
+ import SessionReplayBudgetMetricType from "../../../../../Types/Rum/SessionReplayBudgetMetricType";
32
+ import { describe, expect, test } from "@jest/globals";
33
+
34
+ /*
35
+ * The session replay budget templates, evaluated the way the worker evaluates
36
+ * them: the template's OWN step and criteria, through
37
+ * MonitorCriteriaEvaluator.processMonitorStep - the entry point
38
+ * MonitorResource calls with the telemetry monitor's response - fed the
39
+ * per-minute samples the metric query returns for a window.
40
+ *
41
+ * The shape tests pin what the templates say; these pin what that shape DOES:
42
+ *
43
+ * - a crossing fires the breach criteria (80 the Warning, 100 the Critical);
44
+ * - a window that crossed at any point still fires, however low the rest of
45
+ * it is - MaximumValue, where the evaluator's fallback (All Values, what a
46
+ * filter gets with no metricAlias) would wait for every point to cross;
47
+ * - a window entirely below the threshold meets Healthy, which recovers;
48
+ * - an empty window - the sweep posts nothing for zero usage, or when it
49
+ * cannot read the counters - meets NEITHER, which is how an open alert
50
+ * resolves after midnight when nothing more is uploaded, rather than
51
+ * staying open on stale data.
52
+ */
53
+
54
+ const DAILY_NEARLY_SPENT: string =
55
+ "rum-session-replay-daily-budget-nearly-spent";
56
+ const DAILY_SPENT: string = "rum-session-replay-daily-budget-spent";
57
+ const MONTHLY_NEARLY_SPENT: string =
58
+ "rum-session-replay-monthly-budget-nearly-spent";
59
+ const MONTHLY_SPENT: string = "rum-session-replay-monthly-budget-spent";
60
+
61
+ const RUM_APPLICATION_ID: ObjectID = ObjectID.generate();
62
+
63
+ // The minute the newest sample lands on; older samples go back one minute each.
64
+ const WINDOW_END: Date = new Date("2026-09-29T12:00:00.000Z");
65
+
66
+ function getTemplate(id: string): RumAlertTemplate {
67
+ const template: RumAlertTemplate | undefined = getRumAlertTemplateById(id);
68
+
69
+ if (!template) {
70
+ throw new Error(`Missing RUM template ${id}`);
71
+ }
72
+
73
+ return template;
74
+ }
75
+
76
+ function buildTemplateStep(templateId: string): MonitorStep {
77
+ return getTemplate(templateId).getMonitorStep({
78
+ rumApplicationId: RUM_APPLICATION_ID.toString(),
79
+ onlineMonitorStatusId: ObjectID.generate(),
80
+ offlineMonitorStatusId: ObjectID.generate(),
81
+ defaultIncidentSeverityId: ObjectID.generate(),
82
+ defaultAlertSeverityId: ObjectID.generate(),
83
+ monitorName: "Storefront",
84
+ });
85
+ }
86
+
87
+ function getCriteriaInstances(
88
+ step: MonitorStep,
89
+ ): Array<MonitorCriteriaInstance> {
90
+ return step.data?.monitorCriteria?.data?.monitorCriteriaInstanceArray || [];
91
+ }
92
+
93
+ /*
94
+ * What monitorMetric hands the evaluator for this step: one aggregated result
95
+ * per query (the template has one), a sample per minute, already in the
96
+ * query's legend unit, and the unit the sweep registered for the series.
97
+ */
98
+ function buildResponse(input: {
99
+ step: MonitorStep;
100
+ samples: Array<number>;
101
+ }): MetricMonitorResponse {
102
+ const metricViewConfig: MetricsViewConfig =
103
+ input.step.data!.metricMonitor!.metricViewConfig;
104
+ const metricName: SessionReplayBudgetMetricType = metricViewConfig
105
+ .queryConfigs[0]!.metricQueryData.filterData
106
+ .metricName as SessionReplayBudgetMetricType;
107
+
108
+ const aggregated: AggregatedResult = {
109
+ data: input.samples.map((value: number, index: number) => {
110
+ return {
111
+ timestamp: new Date(
112
+ WINDOW_END.getTime() - (input.samples.length - 1 - index) * 60000,
113
+ ),
114
+ value: value,
115
+ } as AggregateModel;
116
+ }),
117
+ };
118
+
119
+ return {
120
+ projectId: ObjectID.generate(),
121
+ monitorId: ObjectID.generate(),
122
+ metricResult: [aggregated],
123
+ metricViewConfig: metricViewConfig,
124
+ nativeUnitsByMetricName: {
125
+ [metricName.toLowerCase()]:
126
+ SessionReplayBudgetMetricTypeUtil.getUnit(metricName),
127
+ },
128
+ } as unknown as MetricMonitorResponse;
129
+ }
130
+
131
+ interface Evaluation {
132
+ response: ProbeApiIngestResponse;
133
+ summary: MonitorEvaluationSummary;
134
+ breach: MonitorCriteriaInstance;
135
+ healthy: MonitorCriteriaInstance;
136
+ }
137
+
138
+ async function evaluate(input: {
139
+ step: MonitorStep;
140
+ samples: Array<number>;
141
+ }): Promise<Evaluation> {
142
+ const monitor: Monitor = new Monitor();
143
+ monitor._id = ObjectID.generate().toString();
144
+ monitor.projectId = ObjectID.generate();
145
+ monitor.monitorType = MonitorType.Metrics;
146
+ monitor.name = "Storefront - Session Replay Budget";
147
+
148
+ const summary: MonitorEvaluationSummary = {
149
+ evaluatedAt: WINDOW_END,
150
+ criteriaResults: [],
151
+ events: [],
152
+ };
153
+
154
+ const response: ProbeApiIngestResponse =
155
+ await MonitorCriteriaEvaluator.processMonitorStep({
156
+ dataToProcess: buildResponse(input),
157
+ monitorStep: input.step,
158
+ monitor: monitor,
159
+ probeApiIngestResponse: {
160
+ monitorId: monitor.id!,
161
+ rootCause: null,
162
+ },
163
+ evaluationSummary: summary,
164
+ });
165
+
166
+ const [breach, healthy]: Array<MonitorCriteriaInstance> =
167
+ getCriteriaInstances(input.step);
168
+
169
+ return {
170
+ response: response,
171
+ summary: summary,
172
+ breach: breach!,
173
+ healthy: healthy!,
174
+ };
175
+ }
176
+
177
+ async function evaluateTemplate(
178
+ templateId: string,
179
+ samples: Array<number>,
180
+ ): Promise<Evaluation> {
181
+ return await evaluate({
182
+ step: buildTemplateStep(templateId),
183
+ samples: samples,
184
+ });
185
+ }
186
+
187
+ function criteriaResultFor(
188
+ evaluation: Evaluation,
189
+ criteria: MonitorCriteriaInstance,
190
+ ): MonitorEvaluationCriteriaResult | undefined {
191
+ return evaluation.summary.criteriaResults.find(
192
+ (result: MonitorEvaluationCriteriaResult) => {
193
+ return result.criteriaId === criteria.data?.id;
194
+ },
195
+ );
196
+ }
197
+
198
+ type Outcome = "breach" | "healthy" | "neither";
199
+
200
+ function outcomeOf(evaluation: Evaluation): Outcome {
201
+ if (evaluation.response.criteriaMetId === evaluation.breach.data?.id) {
202
+ return "breach";
203
+ }
204
+
205
+ if (evaluation.response.criteriaMetId === evaluation.healthy.data?.id) {
206
+ return "healthy";
207
+ }
208
+
209
+ expect(evaluation.response.criteriaMetId).toBeUndefined();
210
+
211
+ return "neither";
212
+ }
213
+
214
+ describe("session replay budget templates, through the real criteria evaluation", () => {
215
+ describe("the project's daily budget", () => {
216
+ test("[79.99] does not breach the 80% Warning, and reads as Healthy", async () => {
217
+ const evaluation: Evaluation = await evaluateTemplate(
218
+ DAILY_NEARLY_SPENT,
219
+ [79.99],
220
+ );
221
+
222
+ expect(outcomeOf(evaluation)).toBe("healthy");
223
+ expect(criteriaResultFor(evaluation, evaluation.breach)?.met).toBe(false);
224
+ expect(criteriaResultFor(evaluation, evaluation.healthy)?.met).toBe(true);
225
+ });
226
+
227
+ test("[80] fires the daily Warning", async () => {
228
+ const evaluation: Evaluation = await evaluateTemplate(
229
+ DAILY_NEARLY_SPENT,
230
+ [80],
231
+ );
232
+
233
+ expect(getTemplate(DAILY_NEARLY_SPENT).severity).toBe("Warning");
234
+ expect(outcomeOf(evaluation)).toBe("breach");
235
+ expect(evaluation.response.rootCause).toContain(
236
+ "Session Replay Daily Budget Nearly Spent - 80% or more used",
237
+ );
238
+ });
239
+
240
+ test("[99.99] does not fire the Critical: rounded down, 100 means spent", async () => {
241
+ expect(outcomeOf(await evaluateTemplate(DAILY_SPENT, [99.99]))).toBe(
242
+ "healthy",
243
+ );
244
+ });
245
+
246
+ test("[100] fires the daily Critical, and the Warning with it", async () => {
247
+ const critical: Evaluation = await evaluateTemplate(DAILY_SPENT, [100]);
248
+
249
+ expect(getTemplate(DAILY_SPENT).severity).toBe("Critical");
250
+ expect(outcomeOf(critical)).toBe("breach");
251
+ expect(critical.response.rootCause).toContain(
252
+ "Session Replay Daily Budget Spent - 100% used",
253
+ );
254
+
255
+ expect(outcomeOf(await evaluateTemplate(DAILY_NEARLY_SPENT, [100]))).toBe(
256
+ "breach",
257
+ );
258
+ });
259
+
260
+ /*
261
+ * The budget reset at midnight, or a budget was raised: the window still
262
+ * holds the crossing point next to newer, far lower ones. It stays open
263
+ * until the crossing point has left the window.
264
+ */
265
+ test("[100, 5] still breaches: MaximumValue reads the crossing point", async () => {
266
+ for (const templateId of [DAILY_NEARLY_SPENT, DAILY_SPENT]) {
267
+ expect(outcomeOf(await evaluateTemplate(templateId, [100, 5]))).toBe(
268
+ "breach",
269
+ );
270
+ expect(outcomeOf(await evaluateTemplate(templateId, [5, 100]))).toBe(
271
+ "breach",
272
+ );
273
+ }
274
+ });
275
+
276
+ test("[5] meets Healthy", async () => {
277
+ for (const templateId of [DAILY_NEARLY_SPENT, DAILY_SPENT]) {
278
+ const evaluation: Evaluation = await evaluateTemplate(templateId, [5]);
279
+
280
+ expect(outcomeOf(evaluation)).toBe("healthy");
281
+ expect(evaluation.response.rootCause).toContain("Healthy");
282
+ }
283
+ });
284
+
285
+ /*
286
+ * No point in the window: zero usage (the sweep writes nothing at 0), or
287
+ * counters the sweep could not read. Neither criteria is met - never a
288
+ * breach from missing data, and not Healthy either.
289
+ */
290
+ test("[] meets neither criteria", async () => {
291
+ for (const templateId of [DAILY_NEARLY_SPENT, DAILY_SPENT]) {
292
+ const evaluation: Evaluation = await evaluateTemplate(templateId, []);
293
+
294
+ expect(outcomeOf(evaluation)).toBe("neither");
295
+ expect(evaluation.response.rootCause).toBeNull();
296
+ expect(criteriaResultFor(evaluation, evaluation.breach)?.met).toBe(
297
+ false,
298
+ );
299
+ expect(criteriaResultFor(evaluation, evaluation.healthy)?.met).toBe(
300
+ false,
301
+ );
302
+ }
303
+ });
304
+ });
305
+
306
+ /*
307
+ * Every template, at and around its own threshold. A budget lowered below
308
+ * what is already used reads over 100, which is still spent.
309
+ */
310
+ describe.each([
311
+ { templateId: DAILY_NEARLY_SPENT, threshold: 80 },
312
+ { templateId: DAILY_SPENT, threshold: 100 },
313
+ { templateId: MONTHLY_NEARLY_SPENT, threshold: 80 },
314
+ { templateId: MONTHLY_SPENT, threshold: 100 },
315
+ ])("$templateId", (item: { templateId: string; threshold: number }) => {
316
+ test.each([
317
+ { samples: [item.threshold - 0.01], outcome: "healthy" },
318
+ { samples: [item.threshold], outcome: "breach" },
319
+ { samples: [item.threshold + 0.01], outcome: "breach" },
320
+ { samples: [250], outcome: "breach" },
321
+ { samples: [1, 2, 3, item.threshold, 4], outcome: "breach" },
322
+ { samples: [item.threshold, 5], outcome: "breach" },
323
+ {
324
+ samples: [item.threshold - 1, item.threshold - 1, item.threshold - 1],
325
+ outcome: "healthy",
326
+ },
327
+ { samples: [0], outcome: "healthy" },
328
+ { samples: [5], outcome: "healthy" },
329
+ { samples: [], outcome: "neither" },
330
+ ] as Array<{ samples: Array<number>; outcome: Outcome }>)(
331
+ "$samples -> $outcome",
332
+ async (testCase: { samples: Array<number>; outcome: Outcome }) => {
333
+ expect(
334
+ outcomeOf(await evaluateTemplate(item.templateId, testCase.samples)),
335
+ ).toBe(testCase.outcome);
336
+ },
337
+ );
338
+ });
339
+
340
+ /*
341
+ * Why the template passes `metricAlias`: without it no metricMonitorOptions
342
+ * are written, and the same window is judged as All Values - a spent budget
343
+ * sharing its window with one lower point breaches NOTHING and recovers
344
+ * NOTHING, so the alert never opens and an open one never resolves.
345
+ */
346
+ test("without the template's metricMonitorOptions, [100, 5] would meet neither criteria", async () => {
347
+ const step: MonitorStep = buildTemplateStep(DAILY_SPENT);
348
+
349
+ for (const instance of getCriteriaInstances(step)) {
350
+ for (const filter of instance.data?.filters || []) {
351
+ delete filter.metricMonitorOptions;
352
+ }
353
+ }
354
+
355
+ expect(outcomeOf(await evaluate({ step: step, samples: [100, 5] }))).toBe(
356
+ "neither",
357
+ );
358
+ expect(
359
+ outcomeOf(
360
+ await evaluate({
361
+ step: buildTemplateStep(DAILY_SPENT),
362
+ samples: [100, 5],
363
+ }),
364
+ ),
365
+ ).toBe("breach");
366
+ });
367
+
368
+ /*
369
+ * Missing data is never a breach. The templates leave the no-data policy
370
+ * unset, which the evaluator reads as Ignore - the setting the docs tell
371
+ * anyone building their own budget monitor to keep.
372
+ */
373
+ test("leaves the no-data policy at Ignore on both criteria", () => {
374
+ for (const templateId of [
375
+ DAILY_NEARLY_SPENT,
376
+ DAILY_SPENT,
377
+ MONTHLY_NEARLY_SPENT,
378
+ MONTHLY_SPENT,
379
+ ]) {
380
+ const instances: Array<MonitorCriteriaInstance> = getCriteriaInstances(
381
+ buildTemplateStep(templateId),
382
+ );
383
+
384
+ // The breach and Healthy criteria, each with its options written.
385
+ expect(instances).toHaveLength(2);
386
+
387
+ for (const instance of instances) {
388
+ expect(instance.data?.filters[0]?.metricMonitorOptions).toBeDefined();
389
+
390
+ const policy: NoDataPolicy | undefined =
391
+ instance.data?.filters[0]?.metricMonitorOptions?.onNoDataPolicy;
392
+
393
+ expect(policy === undefined || policy === NoDataPolicy.Ignore).toBe(
394
+ true,
395
+ );
396
+ }
397
+ }
398
+ });
399
+
400
+ /*
401
+ * A saved monitor is a JSON row. What the worker evaluates is the step
402
+ * read back from it, so the outcome must not depend on having the
403
+ * in-memory object the template built.
404
+ */
405
+ test("evaluates the same once the step has been saved and read back", async () => {
406
+ const restored: MonitorStep = MonitorStep.fromJSON(
407
+ JSON.parse(
408
+ JSON.stringify(buildTemplateStep(MONTHLY_SPENT).toJSON()),
409
+ ) as JSONObject,
410
+ );
411
+
412
+ expect(
413
+ outcomeOf(await evaluate({ step: restored, samples: [100, 5] })),
414
+ ).toBe("breach");
415
+ expect(outcomeOf(await evaluate({ step: restored, samples: [5] }))).toBe(
416
+ "healthy",
417
+ );
418
+ expect(outcomeOf(await evaluate({ step: restored, samples: [] }))).toBe(
419
+ "neither",
420
+ );
421
+ });
422
+ });