@oneuptime/common 14.0.9 → 14.0.11

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 (1146) hide show
  1. package/Models/DatabaseModels/AIConversation.ts +127 -1
  2. package/Models/DatabaseModels/AutoRemediationSuggestion.ts +60 -0
  3. package/Models/DatabaseModels/CephCluster.ts +225 -0
  4. package/Models/DatabaseModels/CloudResource.ts +12 -0
  5. package/Models/DatabaseModels/DatabaseServer.ts +225 -0
  6. package/Models/DatabaseModels/DockerHost.ts +225 -0
  7. package/Models/DatabaseModels/DockerSwarmCluster.ts +225 -0
  8. package/Models/DatabaseModels/GlobalConfig.ts +1 -1
  9. package/Models/DatabaseModels/GlobalOidc.ts +0 -4
  10. package/Models/DatabaseModels/GlobalOidcProject.ts +0 -4
  11. package/Models/DatabaseModels/GlobalSso.ts +0 -4
  12. package/Models/DatabaseModels/GlobalSsoProject.ts +0 -4
  13. package/Models/DatabaseModels/Host.ts +225 -0
  14. package/Models/DatabaseModels/IncidentForm.ts +594 -0
  15. package/Models/DatabaseModels/IncidentFormSubmission.ts +283 -0
  16. package/Models/DatabaseModels/IncidentTemplate.ts +59 -0
  17. package/Models/DatabaseModels/Index.ts +16 -0
  18. package/Models/DatabaseModels/IoTFleet.ts +12 -0
  19. package/Models/DatabaseModels/KubernetesCluster.ts +12 -0
  20. package/Models/DatabaseModels/MessageQueue.ts +1102 -0
  21. package/Models/DatabaseModels/MessageQueueLabelRule.ts +553 -0
  22. package/Models/DatabaseModels/MessageQueueOwnerRule.ts +633 -0
  23. package/Models/DatabaseModels/MessageQueueOwnerTeam.ts +491 -0
  24. package/Models/DatabaseModels/MessageQueueOwnerUser.ts +490 -0
  25. package/Models/DatabaseModels/PodmanHost.ts +225 -0
  26. package/Models/DatabaseModels/Project.ts +59 -0
  27. package/Models/DatabaseModels/ProjectOidc.ts +0 -4
  28. package/Models/DatabaseModels/ProjectSso.ts +0 -4
  29. package/Models/DatabaseModels/ProxmoxCluster.ts +225 -0
  30. package/Models/DatabaseModels/ResourceAiAgent.ts +419 -0
  31. package/Models/DatabaseModels/RumApplication.ts +12 -0
  32. package/Models/DatabaseModels/RunnerJob.ts +144 -0
  33. package/Models/DatabaseModels/ServerlessFunction.ts +12 -0
  34. package/Models/DatabaseModels/Service.ts +12 -0
  35. package/Models/DatabaseModels/StatusPageOidc.ts +0 -4
  36. package/Models/DatabaseModels/StatusPageSso.ts +0 -4
  37. package/Models/DatabaseModels/TeamComplianceSetting.ts +47 -2
  38. package/Models/DatabaseModels/VMwareVCenter.ts +225 -0
  39. package/Server/API/AIChatAPI.ts +13 -114
  40. package/Server/API/AIInvestigationAPI.ts +3 -3
  41. package/Server/API/AIInvestigationConversationAPI.ts +266 -0
  42. package/Server/API/AutoRemediationAPI.ts +392 -1
  43. package/Server/API/IncidentFormAPI.ts +376 -0
  44. package/Server/API/ProjectOIDC.ts +16 -25
  45. package/Server/API/ProjectSSO.ts +16 -24
  46. package/Server/API/ResourceAiAccessAPI.ts +1669 -0
  47. package/Server/API/StatusPageAPI.ts +42 -77
  48. package/Server/Enterprise/EnterpriseEdition.ts +93 -28
  49. package/Server/Enterprise/EnterpriseFeature.ts +25 -3
  50. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +1 -1
  51. package/Server/Enterprise/EnterpriseServerModule.ts +4 -1
  52. package/Server/EnvironmentConfig.ts +1 -1
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.ts +423 -0
  54. package/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.ts +129 -0
  55. package/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.ts +52 -0
  56. package/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.ts +75 -0
  57. package/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.ts +477 -0
  58. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  59. package/Server/Infrastructure/Semaphore.ts +22 -0
  60. package/Server/Middleware/IncidentFormRateLimit.ts +847 -0
  61. package/Server/Middleware/TelemetryIngest.ts +15 -5
  62. package/Server/Middleware/UserAuthorization.ts +16 -38
  63. package/Server/Services/AIService.ts +10 -13
  64. package/Server/Services/AnalyticsDatabaseService.ts +45 -1
  65. package/Server/Services/AutoRemediationRuleEngineService.ts +940 -112
  66. package/Server/Services/CephClusterService.ts +109 -1
  67. package/Server/Services/DatabaseServerService.ts +116 -1
  68. package/Server/Services/DockerHostService.ts +109 -1
  69. package/Server/Services/DockerSwarmClusterService.ts +113 -1
  70. package/Server/Services/HostService.ts +126 -4
  71. package/Server/Services/IncidentCustomFieldService.ts +112 -2
  72. package/Server/Services/IncidentEpisodeMemberService.ts +24 -4
  73. package/Server/Services/IncidentEpisodeService.ts +10 -1
  74. package/Server/Services/IncidentFormService.ts +1566 -0
  75. package/Server/Services/IncidentFormSubmissionService.ts +97 -0
  76. package/Server/Services/IncidentGroupingEngineService.ts +45 -8
  77. package/Server/Services/IncidentService.ts +123 -5
  78. package/Server/Services/IncidentTemplateService.ts +22 -0
  79. package/Server/Services/Index.ts +14 -0
  80. package/Server/Services/MessageQueueLabelRuleEngineService.ts +321 -0
  81. package/Server/Services/MessageQueueLabelRuleService.ts +14 -0
  82. package/Server/Services/MessageQueueOwnerRuleEngineService.ts +412 -0
  83. package/Server/Services/MessageQueueOwnerRuleService.ts +14 -0
  84. package/Server/Services/MessageQueueOwnerTeamService.ts +62 -0
  85. package/Server/Services/MessageQueueOwnerUserService.ts +62 -0
  86. package/Server/Services/MessageQueueService.ts +1463 -0
  87. package/Server/Services/MetricRecordingRuleService.ts +47 -0
  88. package/Server/Services/OpenTelemetryIngestService.ts +37 -4
  89. package/Server/Services/PodmanHostService.ts +109 -1
  90. package/Server/Services/ProjectService.ts +0 -59
  91. package/Server/Services/ProxmoxClusterService.ts +110 -1
  92. package/Server/Services/ResourceAiAccessService.ts +1439 -0
  93. package/Server/Services/ResourceAiAgentJobService.ts +202 -0
  94. package/Server/Services/ResourceAiAgentService.ts +2432 -0
  95. package/Server/Services/RunnerJobService.ts +611 -4
  96. package/Server/Services/StatusPagePrivateUserService.ts +1 -4
  97. package/Server/Services/StatusPageService.ts +1 -51
  98. package/Server/Services/TeamComplianceSettingService.ts +163 -42
  99. package/Server/Services/TelemetryUsageBillingService.ts +28 -0
  100. package/Server/Services/TraceRecordingRuleService.ts +33 -0
  101. package/Server/Services/UserNotificationRuleService.ts +8 -1
  102. package/Server/Services/VMwareVCenterService.ts +110 -1
  103. package/Server/Services/WorkspaceNotificationSummaryService.ts +12 -3
  104. package/Server/Types/Database/Permissions/CreatePermission.ts +17 -3
  105. package/Server/Types/Database/Permissions/EditionPermission.ts +140 -38
  106. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +16 -0
  107. package/Server/Types/Database/Permissions/TablePermission.ts +3 -3
  108. package/Server/Types/Database/Permissions/UpdatePermission.ts +20 -6
  109. package/Server/Utils/AI/Chat/AgentContextCompactor.ts +200 -0
  110. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +307 -48
  111. package/Server/Utils/AI/Chat/ChatRunCancellation.ts +156 -0
  112. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +78 -18
  113. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  114. package/Server/Utils/AI/Chat/ToolOutputPager.ts +322 -0
  115. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +88 -30
  116. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +13 -1
  117. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +0 -32
  118. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +27 -25
  119. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1442 -34
  120. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +968 -34
  121. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +25 -1
  122. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +622 -0
  123. package/Server/Utils/AI/ResourceAccess/ResourceAccessContext.ts +271 -0
  124. package/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.ts +45 -0
  125. package/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.ts +964 -0
  126. package/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.ts +333 -0
  127. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +882 -0
  128. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +125 -12
  129. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +99 -15
  130. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +99 -15
  131. package/Server/Utils/AI/SRE/InvestigationQueue.ts +16 -19
  132. package/Server/Utils/AI/SRE/InvestigationThread.ts +646 -0
  133. package/Server/Utils/AI/SRE/InvestigationThreadService.ts +715 -0
  134. package/Server/Utils/AI/Toolbox/Serializer.ts +10 -3
  135. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +396 -13
  136. package/Server/Utils/AutoRemediation/RemediationVerifier.ts +35 -2
  137. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +9 -1
  138. package/Server/Utils/EditionEnforcement.ts +19 -202
  139. package/Server/Utils/LLM/LLMService.ts +259 -63
  140. package/Server/Utils/RelaxedScimTeamLocksReport.ts +245 -0
  141. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  142. package/Server/Utils/SameOriginRequest.ts +203 -0
  143. package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +920 -0
  144. package/Server/Utils/SessionReplay/SessionReplayUsage.ts +84 -6
  145. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  146. package/Server/Utils/Telemetry/EntityRegistry.ts +4 -1
  147. package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +1402 -0
  148. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +4 -1
  149. package/Server/Utils/VendorAssets.ts +3 -3
  150. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +35 -15
  151. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +33 -15
  152. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +21 -1
  153. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +301 -225
  154. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +38 -16
  155. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +389 -175
  156. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +376 -144
  157. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts +163 -0
  158. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +396 -0
  159. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.ts +418 -0
  160. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.ts +152 -0
  161. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.ts +251 -0
  162. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.ts +214 -0
  163. package/Tests/App/Accounts/IncidentFormPage.test.tsx +2036 -0
  164. package/Tests/App/Accounts/IncidentFormServerMessages.test.ts +119 -0
  165. package/Tests/App/Accounts/IncidentFormUtils.test.ts +1157 -0
  166. package/Tests/App/Accounts/LoginPasskey.test.tsx +6 -4
  167. package/Tests/App/Accounts/LoginSso.test.tsx +724 -0
  168. package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +338 -0
  169. package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +331 -0
  170. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +47 -33
  171. package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +1021 -0
  172. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +876 -78
  173. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +20 -3
  174. package/Tests/App/Dashboard/CephProxmoxVMwareDocumentationCards.test.tsx +359 -0
  175. package/Tests/App/Dashboard/CephSetupGuide.test.ts +961 -0
  176. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +381 -95
  177. package/Tests/App/Dashboard/CloudSetupGuide.test.ts +1463 -0
  178. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +267 -12
  179. package/Tests/App/Dashboard/ContainerSetupGuideCards.test.tsx +345 -0
  180. package/Tests/App/Dashboard/CoreListEmptyStates.test.tsx +501 -0
  181. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +0 -1
  182. package/Tests/App/Dashboard/DatabaseDocumentationCard.test.tsx +400 -0
  183. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +23 -6
  184. package/Tests/App/Dashboard/DatabaseSetupGuide.test.ts +1869 -0
  185. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +44 -0
  186. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +50 -9
  187. package/Tests/App/Dashboard/DockerSetupGuide.test.ts +899 -0
  188. package/Tests/App/Dashboard/DockerSwarmSetupGuide.test.ts +964 -0
  189. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +141 -7
  190. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +52 -39
  191. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +7 -1
  192. package/Tests/App/Dashboard/GettingStartedTaskRoutes.test.tsx +331 -0
  193. package/Tests/App/Dashboard/HomeOverviewStatsFirstRun.test.tsx +925 -0
  194. package/Tests/App/Dashboard/HostDocumentationCard.test.tsx +225 -0
  195. package/Tests/App/Dashboard/HostSetupGuide.test.ts +1183 -0
  196. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +69 -45
  197. package/Tests/App/Dashboard/IncidentCreateTemplateCustomFieldSettings.test.tsx +745 -0
  198. package/Tests/App/Dashboard/IncidentCreateTemplateOwners.test.tsx +414 -0
  199. package/Tests/App/Dashboard/IncidentCustomFieldCreateSettingsForm.test.ts +1042 -0
  200. package/Tests/App/Dashboard/IncidentCustomFieldSettingsCard.test.tsx +1816 -0
  201. package/Tests/App/Dashboard/IncidentFormPlan.test.ts +89 -0
  202. package/Tests/App/Dashboard/IncidentFormShareLinkCard.test.tsx +846 -0
  203. package/Tests/App/Dashboard/IncidentFormsPages.test.tsx +1324 -0
  204. package/Tests/App/Dashboard/IncidentTemplateCustomFieldSettings.test.tsx +630 -0
  205. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +13 -0
  206. package/Tests/App/Dashboard/IncomingEmailMonitorLinkVerifyHint.test.tsx +104 -0
  207. package/Tests/App/Dashboard/InvestigationConversation.test.tsx +1107 -0
  208. package/Tests/App/Dashboard/InvestigationConversationData.test.ts +546 -0
  209. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +170 -5
  210. package/Tests/App/Dashboard/InvestigationInfrastructureTools.test.tsx +506 -0
  211. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +207 -2
  212. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +729 -34
  213. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +9 -21
  214. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +274 -37
  215. package/Tests/App/Dashboard/InvestigationStatusBadge.test.tsx +130 -0
  216. package/Tests/App/Dashboard/IoTDocumentationCard.test.tsx +218 -0
  217. package/Tests/App/Dashboard/IoTSetupGuide.test.ts +1124 -0
  218. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +20 -6
  219. package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +107 -83
  220. package/Tests/App/Dashboard/KubernetesSetupGuide.test.ts +787 -0
  221. package/Tests/App/Dashboard/MessageQueueBreadcrumbs.test.tsx +228 -0
  222. package/Tests/App/Dashboard/MessageQueueBrokerHealth.test.tsx +1538 -0
  223. package/Tests/App/Dashboard/MessageQueueBrokerHealthMetricChart.test.tsx +969 -0
  224. package/Tests/App/Dashboard/MessageQueueBrokerHealthReads.test.ts +889 -0
  225. package/Tests/App/Dashboard/MessageQueueBrokerMetricsReach.test.ts +236 -0
  226. package/Tests/App/Dashboard/MessageQueueDocumentationCard.test.tsx +479 -0
  227. package/Tests/App/Dashboard/MessageQueueListPages.test.tsx +1232 -0
  228. package/Tests/App/Dashboard/MessageQueueMetricDescriptions.test.ts +244 -0
  229. package/Tests/App/Dashboard/MessageQueueMonitorLink.test.ts +952 -0
  230. package/Tests/App/Dashboard/MessageQueueMonitorLinkMonitorCreate.test.tsx +859 -0
  231. package/Tests/App/Dashboard/MessageQueueOverview.test.tsx +1773 -0
  232. package/Tests/App/Dashboard/MessageQueueOverviewPresentation.test.ts +196 -0
  233. package/Tests/App/Dashboard/MessageQueuePresentation.test.ts +799 -0
  234. package/Tests/App/Dashboard/MessageQueueProducersConsumers.test.tsx +680 -0
  235. package/Tests/App/Dashboard/MessageQueueRoutes.test.tsx +383 -0
  236. package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +278 -0
  237. package/Tests/App/Dashboard/MessageQueueSetupGuide.test.ts +2778 -0
  238. package/Tests/App/Dashboard/MessageQueueSideMenus.test.tsx +273 -0
  239. package/Tests/App/Dashboard/MessageQueueSpanPopulations.test.ts +930 -0
  240. package/Tests/App/Dashboard/MessageQueueSpanStore.ts +351 -0
  241. package/Tests/App/Dashboard/MessageQueueTelemetryScope.test.ts +375 -0
  242. package/Tests/App/Dashboard/MessageQueueTelemetryScopeTabs.test.tsx +668 -0
  243. package/Tests/App/Dashboard/MessageQueueViewPages.test.tsx +685 -0
  244. package/Tests/App/Dashboard/MonitorAndHomeNotOperationalMenus.test.tsx +342 -0
  245. package/Tests/App/Dashboard/MonitorCreateFirstRunDefaults.test.tsx +623 -0
  246. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +442 -0
  247. package/Tests/App/Dashboard/MonitorLogsPageViewSummary.test.tsx +814 -0
  248. package/Tests/App/Dashboard/MonitorSetupCardBodies.test.tsx +246 -0
  249. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +8 -0
  250. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +27 -12
  251. package/Tests/App/Dashboard/PlanGatedPage.test.tsx +292 -0
  252. package/Tests/App/Dashboard/PodmanSetupGuide.test.ts +948 -0
  253. package/Tests/App/Dashboard/ProductOrientation.test.tsx +5 -4
  254. package/Tests/App/Dashboard/ProductSettingsSectionCollapsed.test.tsx +266 -0
  255. package/Tests/App/Dashboard/ProxmoxSetupGuide.test.ts +1318 -0
  256. package/Tests/App/Dashboard/RemediationSuggestionCardDescription.test.tsx +209 -0
  257. package/Tests/App/Dashboard/RemediationSuggestionCardResource.test.tsx +317 -0
  258. package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +921 -0
  259. package/Tests/App/Dashboard/ResourceAiAgentAttentionServerParity.test.ts +555 -0
  260. package/Tests/App/Dashboard/ResourceAiAgentInstall.test.ts +860 -0
  261. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +2010 -0
  262. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +1455 -0
  263. package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +931 -0
  264. package/Tests/App/Dashboard/ResourceAiNavigation.test.tsx +575 -0
  265. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +16 -0
  266. package/Tests/App/Dashboard/ResourceConnectionGuideCard.test.tsx +444 -0
  267. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsInfra.test.tsx +798 -0
  268. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsPlatforms.test.tsx +717 -0
  269. package/Tests/App/Dashboard/ResourceConnectionGuides.test.ts +981 -0
  270. package/Tests/App/Dashboard/ResourceConnectionState.test.ts +132 -0
  271. package/Tests/App/Dashboard/RumDocumentationCard.test.tsx +293 -0
  272. package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +467 -0
  273. package/Tests/App/Dashboard/RumSetupGuide.test.ts +758 -0
  274. package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +38 -7
  275. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +25 -0
  276. package/Tests/App/Dashboard/ServerlessDocumentationCard.test.tsx +254 -0
  277. package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1074 -0
  278. package/Tests/App/Dashboard/SetupGuide.test.ts +246 -0
  279. package/Tests/App/Dashboard/SetupGuideCard.test.tsx +756 -0
  280. package/Tests/App/Dashboard/SloListSideMenu.test.tsx +120 -0
  281. package/Tests/App/Dashboard/SsoPages.test.tsx +833 -0
  282. package/Tests/App/Dashboard/TelemetryDocumentation.test.tsx +253 -0
  283. package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +730 -0
  284. package/Tests/App/Dashboard/VMwareSetupGuide.test.ts +1033 -0
  285. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +87 -7
  286. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +61 -10
  287. package/Tests/Models/DatabaseModels/IncidentFormModel.test.ts +1250 -0
  288. package/Tests/Models/DatabaseModels/MessageQueueModels.test.ts +1983 -0
  289. package/Tests/Models/DatabaseModels/ResourceAiAccessColumns.test.ts +738 -0
  290. package/Tests/Models/DatabaseModels/ResourceAiAgentModel.test.ts +842 -0
  291. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  292. package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +190 -14
  293. package/Tests/Models/IncidentTemplateCustomFieldSettingsColumn.test.ts +291 -0
  294. package/Tests/Server/API/AIInvestigationConversationAPI.test.ts +412 -0
  295. package/Tests/Server/API/AutoRemediationApproveResourceRound.test.ts +835 -0
  296. package/Tests/Server/API/GlobalConfigLicense.test.ts +38 -9
  297. package/Tests/Server/API/IncidentFormAPI.test.ts +942 -0
  298. package/Tests/Server/API/IncidentFormPublicRoutes.test.ts +1653 -0
  299. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -1
  300. package/Tests/Server/API/ResourceAiAccessAPI.test.ts +2730 -0
  301. package/Tests/Server/API/{SsoProviderListingsEdition.test.ts → SsoProviderListings.test.ts} +164 -110
  302. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +76 -54
  303. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +125 -42
  304. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +36 -10
  305. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +51 -9
  306. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +13 -8
  307. package/Tests/Server/Enterprise/SsoInCommunityEdition.test.ts +540 -0
  308. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  309. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +60 -0
  310. package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +438 -0
  311. package/Tests/Server/Infrastructure/Postgres/AddResourceAiAgentsMigration.test.ts +659 -0
  312. package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleNotificationChannelsMigration.test.ts +255 -0
  313. package/Tests/Server/Infrastructure/Postgres/MessageQueueTablesMigration.test.ts +637 -0
  314. package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +31 -0
  315. package/Tests/Server/Middleware/IncidentFormRateLimit.test.ts +1630 -0
  316. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +63 -5
  317. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +103 -5
  318. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +19 -1
  319. package/Tests/Server/Middleware/UserAuthorization.test.ts +16 -17
  320. package/Tests/Server/Middleware/UserAuthorizationSsoEnforcement.test.ts +544 -0
  321. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +37 -8
  322. package/Tests/Server/Services/AutoRemediationResourceRuleEngine.test.ts +1279 -0
  323. package/Tests/Server/Services/DatabaseServerService.test.ts +55 -0
  324. package/Tests/Server/Services/GroupTelemetryUsageExcludeNames.test.ts +299 -0
  325. package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +44 -0
  326. package/Tests/Server/Services/IncidentCreatedFeedTitle.test.ts +212 -0
  327. package/Tests/Server/Services/IncidentCustomFieldDeleteFormQuestions.test.ts +297 -0
  328. package/Tests/Server/Services/IncidentFormOwnersCreatedNotification.test.ts +497 -0
  329. package/Tests/Server/Services/IncidentFormPostgres.test.ts +958 -0
  330. package/Tests/Server/Services/IncidentFormPublicForm.test.ts +1260 -0
  331. package/Tests/Server/Services/IncidentFormPublicSubmission.test.ts +2520 -0
  332. package/Tests/Server/Services/IncidentFormRegistration.test.ts +159 -0
  333. package/Tests/Server/Services/IncidentFormService.test.ts +663 -0
  334. package/Tests/Server/Services/IncidentFormSubmissionService.test.ts +430 -0
  335. package/Tests/Server/Services/IncidentFormSubmissionTemplateBranch.test.ts +473 -0
  336. package/Tests/Server/Services/IncidentGroupingTemplateSubstitution.test.ts +81 -0
  337. package/Tests/Server/Services/IncidentTemplateCustomFieldSettings.test.ts +262 -0
  338. package/Tests/Server/Services/IncidentTemplateOwnersOnDeclare.test.ts +566 -0
  339. package/Tests/Server/Services/IncidentTitleMarkdownSinks.test.ts +640 -0
  340. package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +3 -3
  341. package/Tests/Server/Services/MessageQueueOwnerServices.test.ts +440 -0
  342. package/Tests/Server/Services/MessageQueueRegistries.test.ts +577 -0
  343. package/Tests/Server/Services/MessageQueueRuleEngines.test.ts +900 -0
  344. package/Tests/Server/Services/MessageQueueService.test.ts +2210 -0
  345. package/Tests/Server/Services/MessageQueueSqlPostgres.test.ts +1271 -0
  346. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +45 -6
  347. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
  348. package/Tests/Server/Services/OpenTelemetryRetentionOverrideEdition.test.ts +474 -0
  349. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +21 -0
  350. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +3 -0
  351. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +0 -1
  352. package/Tests/Server/Services/RecordingRuleReservedMetricName.test.ts +171 -0
  353. package/Tests/Server/Services/ResourceAiAccessChangeAuthorization.test.ts +256 -0
  354. package/Tests/Server/Services/ResourceAiAccessService.test.ts +1373 -0
  355. package/Tests/Server/Services/ResourceAiAgentJobService.test.ts +375 -0
  356. package/Tests/Server/Services/ResourceAiAgentServiceHelpers.test.ts +1114 -0
  357. package/Tests/Server/Services/ResourceAiAgentServiceLifecycle.test.ts +1050 -0
  358. package/Tests/Server/Services/ResourceAiAgentServiceRegister.test.ts +2251 -0
  359. package/Tests/Server/Services/ResourceAiSettingsCreate.test.ts +373 -0
  360. package/Tests/Server/Services/ResourceAiSettingsPermission.test.ts +1042 -0
  361. package/Tests/Server/Services/ResourceServiceDeleteCleansUpAi.test.ts +319 -0
  362. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +56 -6
  363. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -1
  364. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +105 -0
  365. package/Tests/Server/Services/RunnerJobEnqueueResourceCommand.test.ts +986 -0
  366. package/Tests/Server/Services/RunnerJobResourceCommandLane.test.ts +211 -0
  367. package/Tests/Server/Services/RunnerJobResourceCommandTimeoutAndRedaction.test.ts +352 -0
  368. package/Tests/Server/Services/SsoRequirementReads.test.ts +454 -0
  369. package/Tests/Server/Services/SsoRequirementWrites.test.ts +529 -0
  370. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  371. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +107 -89
  372. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +1068 -176
  373. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +1962 -200
  374. package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +218 -0
  375. package/Tests/Server/TestingUtils/Services/FakeRunnerJobCount.ts +145 -0
  376. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +654 -297
  377. package/Tests/Server/Types/Database/Permissions/RetentionOverrideColumns.test.ts +784 -0
  378. package/Tests/Server/Types/Database/Permissions/SsoScalePlanGate.test.ts +418 -0
  379. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +0 -1
  380. package/Tests/Server/Utils/AI/AIInvestigationEngineRunLimits.test.ts +136 -0
  381. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +15 -14
  382. package/Tests/Server/Utils/AI/AgentContextCompactor.test.ts +351 -0
  383. package/Tests/Server/Utils/AI/ChatAgentRunnerSharedThread.test.ts +842 -0
  384. package/Tests/Server/Utils/AI/ChatRunCancellation.test.ts +195 -0
  385. package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +10 -57
  386. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +20 -24
  387. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +7 -30
  388. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +225 -29
  389. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +694 -0
  390. package/Tests/Server/Utils/AI/InvestigationInfrastructureReport.test.ts +721 -0
  391. package/Tests/Server/Utils/AI/InvestigationThread.test.ts +580 -0
  392. package/Tests/Server/Utils/AI/InvestigationThreadService.test.ts +801 -0
  393. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +525 -43
  394. package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +4 -2
  395. package/Tests/Server/Utils/AI/LLMServiceUnreachableProvider.test.ts +435 -0
  396. package/Tests/Server/Utils/AI/ObservabilityAssistantLimits.test.ts +462 -0
  397. package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +94 -1
  398. package/Tests/Server/Utils/AI/RemediationCommandToolsResource.test.ts +1530 -0
  399. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +14 -25
  400. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +1251 -0
  401. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +117 -0
  402. package/Tests/Server/Utils/AI/RemediationResourceCopyParity.test.ts +463 -0
  403. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +1004 -0
  404. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +266 -0
  405. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.test.ts +1220 -0
  406. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.test.ts +569 -0
  407. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +834 -0
  408. package/Tests/Server/Utils/AI/ToolOutputPager.test.ts +382 -0
  409. package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +23 -4
  410. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +25 -6
  411. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +14 -3
  412. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorResource.test.ts +717 -0
  413. package/Tests/Server/Utils/AutoRemediation/RemediationVerifierResourceFollowUp.test.ts +338 -0
  414. package/Tests/Server/Utils/EditionEnforcement.test.ts +107 -147
  415. package/Tests/Server/Utils/Monitor/Criteria/SessionReplayBudgetTemplateCriteria.test.ts +422 -0
  416. package/Tests/Server/Utils/{CommunityEditionSsoReport.test.ts → RelaxedScimTeamLocksReport.test.ts} +212 -208
  417. package/Tests/Server/Utils/SameOriginRequest.test.ts +372 -0
  418. package/Tests/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.test.ts +1647 -0
  419. package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +143 -1
  420. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +20 -0
  421. package/Tests/Server/Utils/Telemetry/MessageQueueDiscovery.test.ts +2590 -0
  422. package/Tests/Server/Utils/Telemetry/MessageQueueSpanQueryTwin.ts +246 -0
  423. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +23 -0
  424. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +33 -3
  425. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsAccountNotLinked.test.ts +1093 -0
  426. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.test.ts +1049 -0
  427. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +1676 -0
  428. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCards.test.ts +2884 -0
  429. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.test.ts +2490 -0
  430. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmit.test.ts +2293 -0
  431. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmitServerTimezone.test.ts +386 -0
  432. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.test.ts +1477 -0
  433. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.test.ts +1967 -0
  434. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsStripHtmlTags.test.ts +92 -0
  435. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsSubmittedFormRemoval.test.ts +1819 -0
  436. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.test.ts +1033 -0
  437. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezoneServerZone.test.ts +610 -0
  438. package/Tests/Server/Utils/Workspace/MicrosoftTeamsBotMessageHandling.test.ts +2610 -0
  439. package/Tests/Server/Utils/Workspace/MicrosoftTeamsCreateCommandsEndToEnd.test.ts +4672 -0
  440. package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +190 -65
  441. package/Tests/Types/AI/AIAgentRunLimits.test.ts +255 -0
  442. package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +10 -4
  443. package/Tests/Types/AutoRemediation/AiRemediationCommandPlanResourceCommand.test.ts +305 -0
  444. package/Tests/Types/Code/JsonSyntax.test.ts +1300 -0
  445. package/Tests/Types/CustomField/CustomFieldCreateSettings.test.ts +1113 -0
  446. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +91 -0
  447. package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +30 -0
  448. package/Tests/Types/Incident/IncidentFormIpAllowlist.test.ts +227 -0
  449. package/Tests/Types/Incident/IncidentFormPublic.test.ts +1916 -0
  450. package/Tests/Types/MessageQueue/MessageQueueEntityKey.test.ts +916 -0
  451. package/Tests/Types/MessageQueue/MessageQueueIdentity.test.ts +567 -0
  452. package/Tests/Types/MessageQueue/MessageQueueManualIdentity.test.ts +686 -0
  453. package/Tests/Types/MessageQueue/MessageQueueMetricCatalog.test.ts +1726 -0
  454. package/Tests/Types/MessageQueue/MessageQueueMetricResolution.test.ts +1758 -0
  455. package/Tests/Types/MessageQueue/MessagingInstrumentationFixtures.test.ts +4686 -0
  456. package/Tests/Types/MessageQueue/MessagingSystem.test.ts +840 -0
  457. package/Tests/Types/MessageQueue/MessagingTelemetryFixtures.ts +3287 -0
  458. package/Tests/Types/MessageQueue/MessagingTelemetryResolver.test.ts +2966 -0
  459. package/Tests/Types/Monitor/MessageQueueAlertTemplates.test.ts +5401 -0
  460. package/Tests/Types/Monitor/MetricEngineFold.ts +154 -0
  461. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +277 -13
  462. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +113 -0
  463. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +773 -2
  464. package/Tests/Types/ResourceAiAgent/AiResourceType.test.ts +419 -0
  465. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +519 -0
  466. package/Tests/Types/Runbook/RunbookStepType.test.ts +147 -8
  467. package/Tests/Types/Team/ComplianceRule.test.ts +588 -37
  468. package/Tests/Types/Team/TeamComplianceStatus.test.ts +64 -11
  469. package/Tests/Types/XML.test.ts +51 -0
  470. package/Tests/UI/Components/CodeEditor/CodeEditor.test.tsx +2362 -0
  471. package/Tests/UI/Components/CodeEditor/CodeEditorCommands.test.ts +810 -0
  472. package/Tests/UI/Components/CodeEditor/CodeEditorHighlight.test.ts +338 -0
  473. package/Tests/UI/Components/CodeEditor/CodeEditorLanguages.test.ts +222 -0
  474. package/Tests/UI/Components/CodeEditor/CodeEditorStyles.test.ts +807 -0
  475. package/Tests/UI/Components/CodeEditor/NoMonaco.test.ts +245 -0
  476. package/Tests/UI/Components/CodeEditor/YamlEditor.test.tsx +729 -0
  477. package/Tests/UI/Components/CopyTextButton.test.tsx +76 -0
  478. package/Tests/UI/Components/EditionLabelLapseCopy.ts +51 -14
  479. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +131 -23
  480. package/Tests/UI/Components/ErrorMessageAction.test.tsx +142 -0
  481. package/Tests/UI/Components/FacetSidebarInScope.test.tsx +459 -0
  482. package/Tests/UI/Components/FacetValuesInScope.test.ts +270 -0
  483. package/Tests/UI/Components/Forms/FormFieldCodeEditors.test.tsx +294 -0
  484. package/Tests/UI/Components/Forms/FormFieldMarkdown.test.tsx +126 -0
  485. package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +22 -75
  486. package/Tests/UI/Components/Forms/ModelFormOnBeforeCreateMiscData.test.tsx +254 -0
  487. package/Tests/UI/Components/Icon.test.tsx +32 -0
  488. package/Tests/UI/Components/Input.test.tsx +31 -0
  489. package/Tests/UI/Components/LockedFilterChipScope.test.tsx +501 -0
  490. package/Tests/UI/Components/MarkdownConverters.test.ts +253 -1
  491. package/Tests/UI/Components/MarkdownEditor.test.tsx +2785 -2
  492. package/Tests/UI/Components/MarkdownEditorHistory.test.ts +243 -0
  493. package/Tests/UI/Components/MarkdownListEditing.test.ts +1118 -0
  494. package/Tests/UI/Components/MarkdownPaste.test.ts +1180 -0
  495. package/Tests/UI/Components/MarkdownViewerCopy.test.tsx +466 -0
  496. package/Tests/UI/Components/MarkdownVisualEditing.test.ts +1089 -0
  497. package/Tests/UI/Components/ModelTable/BaseModelTableEmptyStateAction.test.tsx +623 -0
  498. package/Tests/UI/Components/ResetObjectID.test.tsx +282 -0
  499. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  500. package/Tests/UI/Components/Table/EmptyTableMessage.test.ts +439 -0
  501. package/Tests/UI/Components/Table/TableEmptyState.test.tsx +352 -0
  502. package/Tests/UI/Components/TableRowMobileTitles.test.tsx +78 -0
  503. package/Tests/UI/Components/TextArea.test.tsx +19 -0
  504. package/Tests/UI/Components/Workflow/ModelColumnEditor.render.test.tsx +12 -29
  505. package/Tests/UI/Components/fixtures/MarkdownPasteFixtures.ts +460 -0
  506. package/Tests/UI/EsbuildConfig.test.ts +115 -39
  507. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +4 -4
  508. package/Tests/UI/Monitor/MonitorLogSummaryRender.test.tsx +377 -0
  509. package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +769 -1
  510. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +81 -1
  511. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +17 -0
  512. package/Tests/Utils/AiRemediation/Resource/CephCommandPolicy.test.ts +1653 -0
  513. package/Tests/Utils/AiRemediation/Resource/CephOutputRedaction.test.ts +204 -0
  514. package/Tests/Utils/AiRemediation/Resource/DatabaseCommandPolicy.test.ts +1077 -0
  515. package/Tests/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.test.ts +558 -0
  516. package/Tests/Utils/AiRemediation/Resource/DatabaseQueryRedactor.test.ts +834 -0
  517. package/Tests/Utils/AiRemediation/Resource/DockerCliGrammar.test.ts +747 -0
  518. package/Tests/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.test.ts +1259 -0
  519. package/Tests/Utils/AiRemediation/Resource/DockerOutputRedaction.test.ts +386 -0
  520. package/Tests/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.test.ts +782 -0
  521. package/Tests/Utils/AiRemediation/Resource/GovcCommandPolicy.test.ts +2259 -0
  522. package/Tests/Utils/AiRemediation/Resource/HostCommandPolicy.test.ts +2019 -0
  523. package/Tests/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.test.ts +2497 -0
  524. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicy.test.ts +1305 -0
  525. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.test.ts +585 -0
  526. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactor.test.ts +334 -0
  527. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactorCopyParity.test.ts +98 -0
  528. package/Tests/Utils/AiRemediation/Resource/ResourcePolicyImportClosure.test.ts +391 -0
  529. package/Tests/Utils/AiRemediation/ResourceAiAgentPolicyCopyParity.test.ts +497 -0
  530. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  531. package/Tests/Utils/Markdown/DashboardMarkdownRenderer.ts +81 -0
  532. package/Tests/Utils/Markdown/UntrustedMarkdown.test.ts +1339 -0
  533. package/Tests/Utils/Monitor/MonitorLogSummaryUtil.test.ts +862 -0
  534. package/Tests/Utils/SessionReplay/SessionReplayBudgetMetricType.test.ts +383 -0
  535. package/Types/AI/AIAgentRunLimits.ts +146 -0
  536. package/Types/AI/ResourceAiAccessApi.ts +140 -0
  537. package/Types/AI/ResourceAiAccessPermissions.ts +126 -0
  538. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +183 -2
  539. package/Types/Code/CodeType.ts +2 -0
  540. package/Types/Code/JsonSyntax.ts +923 -0
  541. package/Types/CustomField/CustomFieldCreateSettings.ts +549 -0
  542. package/Types/CustomField/CustomFieldMappingCatalog.ts +77 -0
  543. package/Types/CustomField/CustomFieldValueValidator.ts +10 -7
  544. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +1 -1
  545. package/Types/Icon/IconProp.ts +2 -0
  546. package/Types/Incident/IncidentFormIpAllowlist.ts +206 -0
  547. package/Types/Incident/IncidentFormPublic.ts +1145 -0
  548. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +10 -3
  549. package/Types/MessageQueue/MessageQueueIdentity.ts +256 -0
  550. package/Types/MessageQueue/MessageQueueManualIdentity.ts +325 -0
  551. package/Types/MessageQueue/MessageQueueMetricCatalog.ts +1357 -0
  552. package/Types/MessageQueue/MessagingSystem.ts +518 -0
  553. package/Types/MessageQueue/MessagingTelemetryResolver.ts +2311 -0
  554. package/Types/Monitor/MessageQueueAlertTemplates.ts +2128 -0
  555. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +55 -22
  556. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +35 -3
  557. package/Types/Monitor/RumAlertTemplates.ts +351 -4
  558. package/Types/Permission.ts +310 -0
  559. package/Types/ResourceAiAgent/AiResourceType.ts +310 -0
  560. package/Types/ResourceAiAgent/ResourceAiAccess.ts +580 -0
  561. package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
  562. package/Types/Rules/RuleRun.ts +4 -0
  563. package/Types/Rum/SessionReplayBudgetMetricType.ts +47 -0
  564. package/Types/Runbook/RunbookStepType.ts +29 -0
  565. package/Types/Team/ComplianceNotificationChannel.ts +4 -3
  566. package/Types/Team/ComplianceRule.ts +71 -18
  567. package/Types/Team/ComplianceRuleType.ts +2 -2
  568. package/Types/Team/TeamComplianceStatus.ts +6 -2
  569. package/Types/Telemetry/EntityType.ts +16 -0
  570. package/Types/Telemetry/LockedFilterDetail.ts +22 -0
  571. package/Types/Telemetry/TelemetryIngestSurface.ts +14 -2
  572. package/Types/XML.ts +26 -0
  573. package/UI/Components/CodeEditor/CodeEditor.css +379 -0
  574. package/UI/Components/CodeEditor/CodeEditor.tsx +1128 -294
  575. package/UI/Components/CodeEditor/CodeEditorCommands.ts +774 -0
  576. package/UI/Components/CodeEditor/CodeEditorHighlight.ts +106 -0
  577. package/UI/Components/CodeEditor/CodeEditorLanguages.ts +164 -0
  578. package/UI/Components/CodeEditor/YamlEditor.tsx +28 -326
  579. package/UI/Components/CopyTextButton/CopyTextButton.tsx +5 -1
  580. package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +6 -25
  581. package/UI/Components/EditionLabel/EditionLabel.tsx +14 -13
  582. package/UI/Components/ErrorMessage/ErrorMessage.tsx +11 -1
  583. package/UI/Components/Forms/Fields/FormField.tsx +8 -0
  584. package/UI/Components/Forms/Types/Field.ts +8 -0
  585. package/UI/Components/Icon/Icon.tsx +18 -0
  586. package/UI/Components/Input/Input.tsx +11 -4
  587. package/UI/Components/LogsViewer/LogsViewer.tsx +4 -0
  588. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +21 -3
  589. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  590. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +877 -79
  591. package/UI/Components/Markdown.tsx/MarkdownEditorHistory.ts +284 -0
  592. package/UI/Components/Markdown.tsx/MarkdownListEditing.ts +1362 -0
  593. package/UI/Components/Markdown.tsx/MarkdownPaste.ts +1326 -0
  594. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +106 -10
  595. package/UI/Components/Markdown.tsx/MarkdownVisualEditing.ts +1032 -0
  596. package/UI/Components/ModelTable/BaseModelTable.tsx +85 -7
  597. package/UI/Components/ResetObjectID/ResetObjectID.tsx +35 -9
  598. package/UI/Components/Table/EmptyTableMessage.ts +81 -0
  599. package/UI/Components/Table/Table.tsx +50 -21
  600. package/UI/Components/Table/TableRow.tsx +9 -1
  601. package/UI/Components/TelemetryViewer/FacetVisibility.ts +97 -2
  602. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +13 -0
  603. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +214 -7
  604. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +21 -3
  605. package/UI/Components/TextArea/TextArea.tsx +9 -2
  606. package/UI/Components/Workflow/ModelFieldPicker.tsx +10 -12
  607. package/UI/Styles/Theme.css +8 -0
  608. package/UI/esbuild-config.js +2 -32
  609. package/Utils/AI/InvestigationReport.ts +121 -15
  610. package/Utils/AiRemediation/Resource/CephCommandPolicy.ts +1936 -0
  611. package/Utils/AiRemediation/Resource/DatabaseCommandPolicy.ts +166 -0
  612. package/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.ts +1532 -0
  613. package/Utils/AiRemediation/Resource/DatabaseQueryRedactor.ts +1394 -0
  614. package/Utils/AiRemediation/Resource/DockerCliGrammar.ts +1839 -0
  615. package/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.ts +490 -0
  616. package/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.ts +687 -0
  617. package/Utils/AiRemediation/Resource/GovcCommandPolicy.ts +2096 -0
  618. package/Utils/AiRemediation/Resource/HostCommandPolicy.ts +2982 -0
  619. package/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.ts +1679 -0
  620. package/Utils/AiRemediation/Resource/ResourceCommandPolicy.ts +851 -0
  621. package/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.ts +593 -0
  622. package/Utils/AiRemediation/Resource/ResourceOutputRedactor.ts +2812 -0
  623. package/Utils/LabelRuleImportExport.ts +2 -0
  624. package/Utils/Markdown/UntrustedMarkdown.ts +1513 -0
  625. package/Utils/Monitor/IncomingEmailMonitorRequestUtil.ts +41 -0
  626. package/Utils/Monitor/MonitorLogSummaryUtil.ts +212 -0
  627. package/Utils/SessionReplay/SessionReplayBudgetMetricType.ts +184 -0
  628. package/Utils/Telemetry/EntityKey.ts +48 -0
  629. package/build/dist/Models/DatabaseModels/AIConversation.js +125 -1
  630. package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
  631. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
  632. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
  633. package/build/dist/Models/DatabaseModels/CephCluster.js +231 -0
  634. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  635. package/build/dist/Models/DatabaseModels/CloudResource.js +12 -0
  636. package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
  637. package/build/dist/Models/DatabaseModels/DatabaseServer.js +231 -0
  638. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  639. package/build/dist/Models/DatabaseModels/DockerHost.js +231 -0
  640. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  641. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +231 -0
  642. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  643. package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
  644. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  645. package/build/dist/Models/DatabaseModels/GlobalOidc.js +0 -4
  646. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  647. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +0 -4
  648. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
  649. package/build/dist/Models/DatabaseModels/GlobalSso.js +0 -4
  650. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  651. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +0 -4
  652. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
  653. package/build/dist/Models/DatabaseModels/Host.js +231 -0
  654. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  655. package/build/dist/Models/DatabaseModels/IncidentForm.js +605 -0
  656. package/build/dist/Models/DatabaseModels/IncidentForm.js.map +1 -0
  657. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js +299 -0
  658. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js.map +1 -0
  659. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +60 -0
  660. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  661. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  662. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  663. package/build/dist/Models/DatabaseModels/IoTFleet.js +12 -0
  664. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
  665. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +12 -0
  666. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  667. package/build/dist/Models/DatabaseModels/MessageQueue.js +1106 -0
  668. package/build/dist/Models/DatabaseModels/MessageQueue.js.map +1 -0
  669. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js +562 -0
  670. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js.map +1 -0
  671. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js +643 -0
  672. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js.map +1 -0
  673. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js +506 -0
  674. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js.map +1 -0
  675. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js +505 -0
  676. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js.map +1 -0
  677. package/build/dist/Models/DatabaseModels/PodmanHost.js +231 -0
  678. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  679. package/build/dist/Models/DatabaseModels/Project.js +61 -0
  680. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  681. package/build/dist/Models/DatabaseModels/ProjectOidc.js +0 -4
  682. package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
  683. package/build/dist/Models/DatabaseModels/ProjectSso.js +0 -4
  684. package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
  685. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +231 -0
  686. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  687. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js +439 -0
  688. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js.map +1 -0
  689. package/build/dist/Models/DatabaseModels/RumApplication.js +12 -0
  690. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  691. package/build/dist/Models/DatabaseModels/RunnerJob.js +145 -0
  692. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  693. package/build/dist/Models/DatabaseModels/ServerlessFunction.js +12 -0
  694. package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
  695. package/build/dist/Models/DatabaseModels/Service.js +12 -0
  696. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  697. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +0 -4
  698. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  699. package/build/dist/Models/DatabaseModels/StatusPageSso.js +0 -4
  700. package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
  701. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +49 -3
  702. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  703. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +231 -0
  704. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  705. package/build/dist/Server/API/AIChatAPI.js +9 -103
  706. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  707. package/build/dist/Server/API/AIInvestigationAPI.js +3 -3
  708. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  709. package/build/dist/Server/API/AIInvestigationConversationAPI.js +162 -0
  710. package/build/dist/Server/API/AIInvestigationConversationAPI.js.map +1 -0
  711. package/build/dist/Server/API/AutoRemediationAPI.js +231 -1
  712. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  713. package/build/dist/Server/API/IncidentFormAPI.js +245 -0
  714. package/build/dist/Server/API/IncidentFormAPI.js.map +1 -0
  715. package/build/dist/Server/API/ProjectOIDC.js +16 -24
  716. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  717. package/build/dist/Server/API/ProjectSSO.js +16 -24
  718. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  719. package/build/dist/Server/API/ResourceAiAccessAPI.js +1119 -0
  720. package/build/dist/Server/API/ResourceAiAccessAPI.js.map +1 -0
  721. package/build/dist/Server/API/StatusPageAPI.js +42 -75
  722. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  723. package/build/dist/Server/Enterprise/EnterpriseEdition.js +79 -25
  724. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -1
  725. package/build/dist/Server/Enterprise/EnterpriseFeature.js +24 -3
  726. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -1
  727. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +1 -1
  728. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -1
  729. package/build/dist/Server/EnvironmentConfig.js +1 -1
  730. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js +168 -0
  731. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js.map +1 -0
  732. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js +63 -0
  733. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js.map +1 -0
  734. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js +41 -0
  735. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js.map +1 -0
  736. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js +40 -0
  737. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js.map +1 -0
  738. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js +183 -0
  739. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js.map +1 -0
  740. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  741. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  742. package/build/dist/Server/Infrastructure/Semaphore.js +6 -0
  743. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  744. package/build/dist/Server/Middleware/IncidentFormRateLimit.js +559 -0
  745. package/build/dist/Server/Middleware/IncidentFormRateLimit.js.map +1 -0
  746. package/build/dist/Server/Middleware/TelemetryIngest.js +12 -5
  747. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  748. package/build/dist/Server/Middleware/UserAuthorization.js +11 -30
  749. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  750. package/build/dist/Server/Services/AIService.js +10 -13
  751. package/build/dist/Server/Services/AIService.js.map +1 -1
  752. package/build/dist/Server/Services/AnalyticsDatabaseService.js +26 -1
  753. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  754. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +601 -3
  755. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  756. package/build/dist/Server/Services/CephClusterService.js +104 -0
  757. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  758. package/build/dist/Server/Services/DatabaseServerService.js +99 -0
  759. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
  760. package/build/dist/Server/Services/DockerHostService.js +104 -0
  761. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  762. package/build/dist/Server/Services/DockerSwarmClusterService.js +104 -0
  763. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  764. package/build/dist/Server/Services/HostService.js +114 -2
  765. package/build/dist/Server/Services/HostService.js.map +1 -1
  766. package/build/dist/Server/Services/IncidentCustomFieldService.js +83 -0
  767. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  768. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
  769. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  770. package/build/dist/Server/Services/IncidentEpisodeService.js +10 -1
  771. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  772. package/build/dist/Server/Services/IncidentFormService.js +1202 -0
  773. package/build/dist/Server/Services/IncidentFormService.js.map +1 -0
  774. package/build/dist/Server/Services/IncidentFormSubmissionService.js +91 -0
  775. package/build/dist/Server/Services/IncidentFormSubmissionService.js.map +1 -0
  776. package/build/dist/Server/Services/IncidentGroupingEngineService.js +20 -8
  777. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  778. package/build/dist/Server/Services/IncidentService.js +106 -4
  779. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  780. package/build/dist/Server/Services/IncidentTemplateService.js +18 -0
  781. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  782. package/build/dist/Server/Services/Index.js +14 -0
  783. package/build/dist/Server/Services/Index.js.map +1 -1
  784. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js +262 -0
  785. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js.map +1 -0
  786. package/build/dist/Server/Services/MessageQueueLabelRuleService.js +13 -0
  787. package/build/dist/Server/Services/MessageQueueLabelRuleService.js.map +1 -0
  788. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js +334 -0
  789. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js.map +1 -0
  790. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js +13 -0
  791. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js.map +1 -0
  792. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js +62 -0
  793. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js.map +1 -0
  794. package/build/dist/Server/Services/MessageQueueOwnerUserService.js +62 -0
  795. package/build/dist/Server/Services/MessageQueueOwnerUserService.js.map +1 -0
  796. package/build/dist/Server/Services/MessageQueueService.js +1140 -0
  797. package/build/dist/Server/Services/MessageQueueService.js.map +1 -0
  798. package/build/dist/Server/Services/MetricRecordingRuleService.js +46 -0
  799. package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
  800. package/build/dist/Server/Services/OpenTelemetryIngestService.js +25 -4
  801. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  802. package/build/dist/Server/Services/PodmanHostService.js +104 -0
  803. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  804. package/build/dist/Server/Services/ProjectService.js +0 -54
  805. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  806. package/build/dist/Server/Services/ProxmoxClusterService.js +104 -0
  807. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  808. package/build/dist/Server/Services/ResourceAiAccessService.js +1028 -0
  809. package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -0
  810. package/build/dist/Server/Services/ResourceAiAgentJobService.js +173 -0
  811. package/build/dist/Server/Services/ResourceAiAgentJobService.js.map +1 -0
  812. package/build/dist/Server/Services/ResourceAiAgentService.js +1687 -0
  813. package/build/dist/Server/Services/ResourceAiAgentService.js.map +1 -0
  814. package/build/dist/Server/Services/RunnerJobService.js +344 -5
  815. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  816. package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -4
  817. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  818. package/build/dist/Server/Services/StatusPageService.js +0 -46
  819. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  820. package/build/dist/Server/Services/TeamComplianceSettingService.js +120 -31
  821. package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
  822. package/build/dist/Server/Services/TelemetryUsageBillingService.js +26 -0
  823. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  824. package/build/dist/Server/Services/TraceRecordingRuleService.js +37 -0
  825. package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -1
  826. package/build/dist/Server/Services/UserNotificationRuleService.js +8 -1
  827. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  828. package/build/dist/Server/Services/VMwareVCenterService.js +104 -0
  829. package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
  830. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +12 -3
  831. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
  832. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +6 -3
  833. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  834. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +109 -37
  835. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  836. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +16 -0
  837. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  838. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +3 -3
  839. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +9 -6
  840. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  841. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js +128 -0
  842. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js.map +1 -0
  843. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +192 -50
  844. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  845. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js +133 -0
  846. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js.map +1 -0
  847. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +53 -13
  848. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  849. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  850. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js +206 -0
  851. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js.map +1 -0
  852. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +53 -26
  853. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
  854. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +4 -2
  855. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
  856. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +1 -29
  857. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  858. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +24 -24
  859. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  860. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1036 -32
  861. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  862. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +661 -41
  863. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  864. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +21 -1
  865. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  866. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +354 -0
  867. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -0
  868. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js +160 -0
  869. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js.map +1 -0
  870. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js +33 -0
  871. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js.map +1 -0
  872. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js +640 -0
  873. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js.map +1 -0
  874. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js +226 -0
  875. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js.map +1 -0
  876. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +602 -0
  877. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -0
  878. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +90 -14
  879. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  880. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +73 -10
  881. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  882. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +73 -10
  883. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  884. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +15 -18
  885. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  886. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js +412 -0
  887. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js.map +1 -0
  888. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js +495 -0
  889. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js.map +1 -0
  890. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +10 -3
  891. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -1
  892. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +290 -13
  893. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  894. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +29 -1
  895. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
  896. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +9 -1
  897. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  898. package/build/dist/Server/Utils/EditionEnforcement.js +20 -158
  899. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -1
  900. package/build/dist/Server/Utils/LLM/LLMService.js +193 -54
  901. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  902. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js +160 -0
  903. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js.map +1 -0
  904. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  905. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  906. package/build/dist/Server/Utils/SameOriginRequest.js +151 -0
  907. package/build/dist/Server/Utils/SameOriginRequest.js.map +1 -0
  908. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +627 -0
  909. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js.map +1 -0
  910. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +60 -5
  911. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -1
  912. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  913. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  914. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -1
  915. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  916. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +1015 -0
  917. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -0
  918. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +4 -1
  919. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  920. package/build/dist/Server/Utils/VendorAssets.js +3 -3
  921. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +19 -15
  922. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  923. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +19 -15
  924. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  925. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +17 -1
  926. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
  927. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +186 -210
  928. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  929. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +22 -16
  930. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  931. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +233 -167
  932. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
  933. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +273 -111
  934. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  935. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js +129 -0
  936. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map +1 -0
  937. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +266 -0
  938. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -0
  939. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js +258 -0
  940. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js.map +1 -0
  941. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js +104 -0
  942. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js.map +1 -0
  943. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js +183 -0
  944. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js.map +1 -0
  945. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js +123 -0
  946. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js.map +1 -0
  947. package/build/dist/Types/AI/AIAgentRunLimits.js +91 -0
  948. package/build/dist/Types/AI/AIAgentRunLimits.js.map +1 -0
  949. package/build/dist/Types/AI/ResourceAiAccessApi.js +30 -0
  950. package/build/dist/Types/AI/ResourceAiAccessApi.js.map +1 -0
  951. package/build/dist/Types/AI/ResourceAiAccessPermissions.js +98 -0
  952. package/build/dist/Types/AI/ResourceAiAccessPermissions.js.map +1 -0
  953. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +116 -29
  954. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  955. package/build/dist/Types/Code/CodeType.js +2 -0
  956. package/build/dist/Types/Code/CodeType.js.map +1 -1
  957. package/build/dist/Types/Code/JsonSyntax.js +604 -0
  958. package/build/dist/Types/Code/JsonSyntax.js.map +1 -0
  959. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js +310 -0
  960. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js.map +1 -0
  961. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +38 -0
  962. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -1
  963. package/build/dist/Types/CustomField/CustomFieldValueValidator.js +10 -7
  964. package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -1
  965. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +1 -1
  966. package/build/dist/Types/Icon/IconProp.js +2 -0
  967. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  968. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js +119 -0
  969. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js.map +1 -0
  970. package/build/dist/Types/Incident/IncidentFormPublic.js +678 -0
  971. package/build/dist/Types/Incident/IncidentFormPublic.js.map +1 -0
  972. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +10 -3
  973. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
  974. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js +184 -0
  975. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js.map +1 -0
  976. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js +190 -0
  977. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js.map +1 -0
  978. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js +1057 -0
  979. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js.map +1 -0
  980. package/build/dist/Types/MessageQueue/MessagingSystem.js +394 -0
  981. package/build/dist/Types/MessageQueue/MessagingSystem.js.map +1 -0
  982. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js +1768 -0
  983. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js.map +1 -0
  984. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js +1207 -0
  985. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js.map +1 -0
  986. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +47 -21
  987. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  988. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +5 -0
  989. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  990. package/build/dist/Types/Monitor/RumAlertTemplates.js +199 -3
  991. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  992. package/build/dist/Types/Permission.js +274 -0
  993. package/build/dist/Types/Permission.js.map +1 -1
  994. package/build/dist/Types/ResourceAiAgent/AiResourceType.js +242 -0
  995. package/build/dist/Types/ResourceAiAgent/AiResourceType.js.map +1 -0
  996. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +281 -0
  997. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -0
  998. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +12 -0
  999. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  1000. package/build/dist/Types/Rules/RuleRun.js +4 -0
  1001. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  1002. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js +45 -0
  1003. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js.map +1 -0
  1004. package/build/dist/Types/Runbook/RunbookStepType.js +27 -0
  1005. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  1006. package/build/dist/Types/Team/ComplianceNotificationChannel.js +4 -3
  1007. package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -1
  1008. package/build/dist/Types/Team/ComplianceRule.js +48 -14
  1009. package/build/dist/Types/Team/ComplianceRule.js.map +1 -1
  1010. package/build/dist/Types/Team/ComplianceRuleType.js +2 -2
  1011. package/build/dist/Types/Telemetry/EntityType.js +16 -0
  1012. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  1013. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +13 -2
  1014. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  1015. package/build/dist/Types/XML.js +23 -0
  1016. package/build/dist/Types/XML.js.map +1 -1
  1017. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +641 -266
  1018. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  1019. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js +464 -0
  1020. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js.map +1 -0
  1021. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js +69 -0
  1022. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js.map +1 -0
  1023. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js +108 -0
  1024. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js.map +1 -0
  1025. package/build/dist/UI/Components/CodeEditor/YamlEditor.js +14 -186
  1026. package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -1
  1027. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
  1028. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
  1029. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +5 -14
  1030. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -1
  1031. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +14 -13
  1032. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  1033. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +1 -1
  1034. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  1035. package/build/dist/UI/Components/Forms/Fields/FormField.js +8 -3
  1036. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  1037. package/build/dist/UI/Components/Icon/Icon.js +8 -0
  1038. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  1039. package/build/dist/UI/Components/Input/Input.js +11 -3
  1040. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  1041. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +2 -1
  1042. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  1043. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +14 -4
  1044. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  1045. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  1046. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  1047. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +710 -65
  1048. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  1049. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js +238 -0
  1050. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js.map +1 -0
  1051. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js +1028 -0
  1052. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js.map +1 -0
  1053. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js +1088 -0
  1054. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js.map +1 -0
  1055. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +70 -10
  1056. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  1057. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js +887 -0
  1058. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js.map +1 -0
  1059. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +57 -6
  1060. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  1061. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +7 -5
  1062. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
  1063. package/build/dist/UI/Components/Table/EmptyTableMessage.js +51 -0
  1064. package/build/dist/UI/Components/Table/EmptyTableMessage.js.map +1 -0
  1065. package/build/dist/UI/Components/Table/Table.js +30 -11
  1066. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  1067. package/build/dist/UI/Components/Table/TableRow.js +9 -2
  1068. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  1069. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +63 -1
  1070. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -1
  1071. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +4 -2
  1072. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  1073. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +91 -10
  1074. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
  1075. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -4
  1076. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  1077. package/build/dist/UI/Components/TextArea/TextArea.js +9 -3
  1078. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  1079. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js +1 -2
  1080. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js.map +1 -1
  1081. package/build/dist/Utils/AI/InvestigationReport.js +71 -11
  1082. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
  1083. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js +1462 -0
  1084. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js.map +1 -0
  1085. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js +122 -0
  1086. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js.map +1 -0
  1087. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js +1139 -0
  1088. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js.map +1 -0
  1089. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js +1060 -0
  1090. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js.map +1 -0
  1091. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js +1301 -0
  1092. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js.map +1 -0
  1093. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js +370 -0
  1094. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js.map +1 -0
  1095. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js +498 -0
  1096. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js.map +1 -0
  1097. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js +1565 -0
  1098. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js.map +1 -0
  1099. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js +2206 -0
  1100. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js.map +1 -0
  1101. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js +1129 -0
  1102. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js.map +1 -0
  1103. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js +565 -0
  1104. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js.map +1 -0
  1105. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js +408 -0
  1106. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js.map +1 -0
  1107. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js +1910 -0
  1108. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js.map +1 -0
  1109. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  1110. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  1111. package/build/dist/Utils/Markdown/UntrustedMarkdown.js +988 -0
  1112. package/build/dist/Utils/Markdown/UntrustedMarkdown.js.map +1 -0
  1113. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js +34 -0
  1114. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js.map +1 -0
  1115. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js +148 -0
  1116. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js.map +1 -0
  1117. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js +160 -0
  1118. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js.map +1 -0
  1119. package/build/dist/Utils/Telemetry/EntityKey.js +36 -0
  1120. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  1121. package/package.json +1 -3
  1122. package/Server/Utils/CommunityEditionSsoReport.ts +0 -361
  1123. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +0 -616
  1124. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +0 -217
  1125. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +0 -271
  1126. package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +0 -215
  1127. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +0 -784
  1128. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +0 -518
  1129. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +0 -419
  1130. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +0 -769
  1131. package/Tests/UI/Components/CodeEditor.test.tsx +0 -638
  1132. package/Tests/UI/Components/MonacoLoader.test.ts +0 -67
  1133. package/Tests/UI/Components/MonacoRuntime.test.ts +0 -121
  1134. package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +0 -329
  1135. package/Tests/UI/Components/YamlEditor.test.tsx +0 -847
  1136. package/UI/Components/CodeEditor/MonacoLoader.ts +0 -36
  1137. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -319
  1138. package/UI/Components/Telemetry/TelemetryRetentionConfigSummary.tsx +0 -223
  1139. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +0 -223
  1140. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +0 -1
  1141. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +0 -34
  1142. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +0 -1
  1143. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +0 -171
  1144. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +0 -1
  1145. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js +0 -119
  1146. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js.map +0 -1
@@ -0,0 +1,1463 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import MessageQueueLabelRuleEngineService from "./MessageQueueLabelRuleEngineService";
3
+ import MessageQueueOwnerRuleEngineService from "./MessageQueueOwnerRuleEngineService";
4
+ import BaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
5
+ import Model, {
6
+ MessageQueueDiscoverySource,
7
+ MessageQueueSightingSource,
8
+ } from "../../Models/DatabaseModels/MessageQueue";
9
+ import DatabaseConfig from "../DatabaseConfig";
10
+ import CreateBy from "../Types/Database/CreateBy";
11
+ import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
12
+ import ModelPermission from "../Types/Database/Permissions/Index";
13
+ import Select from "../Types/Database/Select";
14
+ import RelationIdUtil from "../Utils/Database/RelationIdUtil";
15
+ import {
16
+ truncateLongText,
17
+ truncateShortText,
18
+ } from "../Utils/Database/TruncateColumnValue";
19
+ import InProcessMemo from "../Utils/InProcessMemo";
20
+ import logger, { LogAttributes } from "../Utils/Logger";
21
+ import ResourceFeedUtil from "../Utils/ResourceFeed/ResourceFeedUtil";
22
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
23
+ import ResourceHeartbeat from "../Utils/Telemetry/ResourceHeartbeat";
24
+ import URL from "../../Types/API/URL";
25
+ import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
26
+ import PartialEntity from "../../Types/Database/PartialEntity";
27
+ import OneUptimeDate from "../../Types/Date";
28
+ import BadDataException from "../../Types/Exception/BadDataException";
29
+ import { JSONObject } from "../../Types/JSON";
30
+ import {
31
+ MESSAGE_QUEUE_DISPLAY_NAME_MAX_LENGTH,
32
+ MessageQueueIdentity,
33
+ buildMessageQueueDisplayName,
34
+ buildMessageQueueIdentifier,
35
+ hasControlCharacter,
36
+ toMessageQueueIdentity,
37
+ } from "../../Types/MessageQueue/MessageQueueIdentity";
38
+ import {
39
+ ManualMessageQueue,
40
+ quoteManualMessageQueueInput,
41
+ resolveManualMessageQueue,
42
+ } from "../../Types/MessageQueue/MessageQueueManualIdentity";
43
+ import {
44
+ getMessagingIdentitySystem,
45
+ getMessagingSystemDisplayName,
46
+ getMoreSpecificMessagingSystem,
47
+ normalizeMessagingSystem,
48
+ } from "../../Types/MessageQueue/MessagingSystem";
49
+ import ObjectID from "../../Types/ObjectID";
50
+ import { canonicalizeEntityValue } from "../../Utils/Telemetry/EntityKey";
51
+ import crypto from "crypto";
52
+
53
+ /*
54
+ * Two sightings, two namespaces: a queue named in an application's spans is a
55
+ * different fact from the broker reporting on it, and one must never be able
56
+ * to suppress the other inside a window - brokerMetricsLastSeenAt would stop
57
+ * moving while spans keep arriving.
58
+ */
59
+ const TRACE_SIGHTING_CACHE_NAMESPACE: string = "message-queue-trace-sighting";
60
+ const BROKER_METRICS_SIGHTING_CACHE_NAMESPACE: string =
61
+ "message-queue-broker-metrics-sighting";
62
+ const SIGHTING_THROTTLE_SECONDS: number = 60;
63
+
64
+ const DEFAULT_AUTO_ARCHIVE_DAYS: number = 7;
65
+ const MIN_AUTO_ARCHIVE_DAYS: number = 1;
66
+ // Rows archived per sweep; the rest wait for the next five-minute run.
67
+ const AUTO_ARCHIVE_BATCH_SIZE: number = 500;
68
+
69
+ /*
70
+ * A person's Restore holds the sweep off this long (or the archive window,
71
+ * if that is longer) unless discovery sees the queue again first.
72
+ */
73
+ const MANUAL_RESTORE_GRACE_DAYS: number = 30;
74
+
75
+ const DEFAULT_AUTO_CREATE_BUDGET: number = 500;
76
+
77
+ /*
78
+ * The auto-create budget as the discovery path reads it: one count per
79
+ * project per minute per process, bumped locally by every create in
80
+ * between, so a burst of new destinations stops at the budget instead of a
81
+ * minute's worth past it.
82
+ */
83
+ const AUTO_CREATE_BUDGET_CACHE_MS: number = 60 * 1000;
84
+ // One "budget reached" warning per project per ten minutes per process.
85
+ const AUTO_CREATE_BUDGET_WARNING_MS: number = 10 * 60 * 1000;
86
+
87
+ const MANUAL_DISCOVERY_SOURCE: MessageQueueDiscoverySource = "manual";
88
+
89
+ /*
90
+ * The columns discovery reads back: enough to key telemetry (id, project,
91
+ * identifier), name it, refine its system and decide on archive handling.
92
+ */
93
+ const DISCOVERY_SELECT: Select<Model> = {
94
+ _id: true,
95
+ projectId: true,
96
+ name: true,
97
+ queueIdentifier: true,
98
+ messagingSystem: true,
99
+ destinationName: true,
100
+ brokerScope: true,
101
+ discoverySource: true,
102
+ isArchived: true,
103
+ autoArchivedAt: true,
104
+ };
105
+
106
+ /*
107
+ * A discovered row's name as discovery wrote it (buildMessageQueueDisplayName
108
+ * of its destinationName): the destination itself, or - past the name
109
+ * column's width - its first characters, trailing spaces trimmed, and "…".
110
+ * A person renaming a queue is investing in it; this is how the sweep tells.
111
+ * Postgres counts code points and trims only spaces where the TypeScript
112
+ * counts UTF-16 units and trims any whitespace, so a long destination full
113
+ * of astral characters can read as renamed - never archived - which is the
114
+ * safe side to err on.
115
+ */
116
+ const DISCOVERY_NAMED_PREDICATE: string = `(mq."name" = mq."destinationName"
117
+ OR (
118
+ char_length(mq."destinationName") > ${MESSAGE_QUEUE_DISPLAY_NAME_MAX_LENGTH}
119
+ AND mq."name" = rtrim(left(mq."destinationName", ${
120
+ MESSAGE_QUEUE_DISPLAY_NAME_MAX_LENGTH - 1
121
+ })) || '…'
122
+ ))`;
123
+
124
+ /*
125
+ * "Nobody invested in this row", as one SQL predicate over `mq` (a
126
+ * MessageQueue row): no description, still the name discovery gave it, and
127
+ * no label or owner a person added - each checked against the row's own
128
+ * project and live rows only. Labels and owners that rules attached on
129
+ * their own (automaticAssignments) do not count: a catch-all rule would
130
+ * otherwise keep every discovered queue alive forever.
131
+ */
132
+ const UNTOUCHED_MESSAGE_QUEUE_PREDICATE: string = `(mq."description" IS NULL OR btrim(mq."description") = '')
133
+ AND ${DISCOVERY_NAMED_PREDICATE}
134
+ AND NOT EXISTS (
135
+ SELECT 1 FROM "MessageQueueLabel" l
136
+ INNER JOIN "Label" lbl ON lbl."_id" = l."labelId"
137
+ WHERE l."messageQueueId" = mq."_id"
138
+ AND lbl."projectId" = mq."projectId"
139
+ AND lbl."deletedAt" IS NULL
140
+ AND NOT (COALESCE(mq."automaticAssignments" -> 'labelIds', '[]'::jsonb) @> jsonb_build_array(l."labelId"::text))
141
+ )
142
+ AND NOT EXISTS (
143
+ SELECT 1 FROM "MessageQueueOwnerUser" ou
144
+ WHERE ou."messageQueueId" = mq."_id"
145
+ AND ou."projectId" = mq."projectId"
146
+ AND ou."deletedAt" IS NULL
147
+ AND NOT (COALESCE(mq."automaticAssignments" -> 'ownerUserIds', '[]'::jsonb) @> jsonb_build_array(ou."userId"::text))
148
+ )
149
+ AND NOT EXISTS (
150
+ SELECT 1 FROM "MessageQueueOwnerTeam" ot
151
+ WHERE ot."messageQueueId" = mq."_id"
152
+ AND ot."projectId" = mq."projectId"
153
+ AND ot."deletedAt" IS NULL
154
+ AND NOT (COALESCE(mq."automaticAssignments" -> 'ownerTeamIds', '[]'::jsonb) @> jsonb_build_array(ot."teamId"::text))
155
+ )`;
156
+
157
+ /*
158
+ * The labels and owners rules attach on their own, recorded per row in
159
+ * MessageQueue.automaticAssignments under these keys.
160
+ */
161
+ export type MessageQueueAutomaticAssignmentKind =
162
+ | "labelIds"
163
+ | "ownerUserIds"
164
+ | "ownerTeamIds";
165
+
166
+ const AUTOMATIC_ASSIGNMENT_KINDS: ReadonlyArray<MessageQueueAutomaticAssignmentKind> =
167
+ ["labelIds", "ownerUserIds", "ownerTeamIds"];
168
+
169
+ export interface FindOrCreateMessageQueueByIdentityData {
170
+ projectId: ObjectID;
171
+ /*
172
+ * The canonical identity (toMessageQueueIdentity): keyed on the system's
173
+ * identity FAMILY - an ActiveMQ queue's identity says "jms".
174
+ */
175
+ identity: MessageQueueIdentity;
176
+ /*
177
+ * The sighting's SPECIFIC canonical system ("activemq" while
178
+ * identity.system is the "jms" family). A new row stores it; an existing
179
+ * row is refined to it when it is more specific within the family.
180
+ */
181
+ system: string;
182
+ // The destination for display, as the sighting spells it (original casing).
183
+ destination: string;
184
+ // Display only; a new row starts with it, later sightings go through recordSighting.
185
+ brokerAddress?: string | null | undefined;
186
+ source: MessageQueueSightingSource;
187
+ // False: only an existing row is returned (and sighted) - nothing is created.
188
+ allowCreate: boolean;
189
+ }
190
+
191
+ export interface MessageQueueFindOrCreateResult {
192
+ queue: Model | null;
193
+ // True only for the call whose insert won: it ran the rule engines.
194
+ created: boolean;
195
+ }
196
+
197
+ export interface RecordMessageQueueSightingData {
198
+ projectId: ObjectID;
199
+ queueId: ObjectID;
200
+ source: MessageQueueSightingSource;
201
+ brokerAddress?: string | null | undefined;
202
+ /*
203
+ * Broker metrics only: when the newest datapoint the pass saw was taken,
204
+ * stored as brokerMetricsLastSeenAt. Defaults to now, never later than
205
+ * now. lastSeenAt is always the time of the call (see recordSighting).
206
+ */
207
+ at?: Date | undefined;
208
+ }
209
+
210
+ interface AutoCreateCount {
211
+ count: number;
212
+ readAtMs: number;
213
+ }
214
+
215
+ /*
216
+ * A manual create's identity. The create form previews it in the browser,
217
+ * so it is resolved in Common/Types/MessageQueue (MessageQueueManualIdentity)
218
+ * and re-exported here, where the service's callers have always found it.
219
+ */
220
+ export type { ManualMessageQueue };
221
+ export { resolveManualMessageQueue };
222
+
223
+ /*
224
+ * The Queues product's root service. A MessageQueue row is found and created
225
+ * by IDENTITY (queueIdentifier - system family, Azure namespace and
226
+ * destination, canonical), never by name: "orders" can be a Kafka topic and
227
+ * a RabbitMQ queue, and a person can rename any row.
228
+ *
229
+ * Invariants every discovery path relies on:
230
+ * - the (projectId, queueIdentifier) unique index is the only arbiter of a
231
+ * race: the loser of an insert re-reads the winner's row, and only the
232
+ * winner runs the rule engines;
233
+ * - a row's messagingSystem stays inside the identity family its
234
+ * identifier names, and only ever becomes more specific (jms ->
235
+ * activemq, never back);
236
+ * - discovery only ever un-archives a row it archived itself
237
+ * (autoArchivedAt), never one a person archived;
238
+ * - discovery stops creating rows once a project holds
239
+ * getAutoCreateBudget() live, non-archived discovered queues.
240
+ */
241
+ export class Service extends DatabaseService<Model> {
242
+ // Per project: its auto-created row count, as last read.
243
+ private autoCreateCountMemo: InProcessMemo<AutoCreateCount> =
244
+ new InProcessMemo<AutoCreateCount>({
245
+ ttlInMs: AUTO_CREATE_BUDGET_CACHE_MS,
246
+ maxEntries: 10_000,
247
+ });
248
+
249
+ // Per project: a "budget reached" warning was logged recently.
250
+ private autoCreateBudgetWarningMemo: InProcessMemo<boolean> =
251
+ new InProcessMemo<boolean>({
252
+ ttlInMs: AUTO_CREATE_BUDGET_WARNING_MS,
253
+ maxEntries: 10_000,
254
+ });
255
+
256
+ public constructor() {
257
+ super(Model);
258
+ }
259
+
260
+ /*
261
+ * A person adding a queue from the dashboard or the API. Root creates -
262
+ * discovery - pass through untouched: they compute identity themselves.
263
+ *
264
+ * Everything set here is a user-creatable column on the model (name,
265
+ * messagingSystem, destinationName, brokerScope, queueIdentifier,
266
+ * discoverySource), because the column permission check runs after this
267
+ * hook. Setting a root-only column here would refuse every manual create.
268
+ *
269
+ * The create permission is checked FIRST, before any lookup: the refusal
270
+ * for a duplicate names a queue, and a caller who may not add a queue must
271
+ * not be able to use it to learn what exists.
272
+ *
273
+ * The typed system and destination go through the same normalization
274
+ * discovery applies (resolveManualMessageQueue), so the row keys the same
275
+ * identity the queue's own telemetry builds - an SQS queue URL is keyed by
276
+ * its name, a Pulsar short name by its persistent:// topic, a RabbitMQ
277
+ * queue by its whole name, as its broker's metrics key it.
278
+ */
279
+ @CaptureSpan()
280
+ protected override async onBeforeCreate(
281
+ createBy: CreateBy<Model>,
282
+ ): Promise<OnCreate<Model>> {
283
+ if (createBy.props.isRoot) {
284
+ return { createBy: createBy, carryForward: null };
285
+ }
286
+
287
+ const data: Model = createBy.data;
288
+
289
+ ModelPermission.checkCreatePermissions(Model, data, createBy.props);
290
+
291
+ // The tenant column is stamped from props.tenantId only after this hook.
292
+ const projectId: ObjectID | undefined =
293
+ createBy.props.tenantId || data.projectId || undefined;
294
+
295
+ if (!projectId) {
296
+ throw new BadDataException("Project ID is required to add a queue.");
297
+ }
298
+
299
+ const manual: ManualMessageQueue = resolveManualMessageQueue({
300
+ messagingSystem: data.messagingSystem,
301
+ destinationName: data.destinationName,
302
+ brokerScope: data.brokerScope,
303
+ });
304
+
305
+ /*
306
+ * The unique index would otherwise answer a duplicate with a raw
307
+ * constraint error.
308
+ */
309
+ const sameIdentity: Model | null = await this.findOneBy({
310
+ query: {
311
+ projectId: projectId,
312
+ queueIdentifier: manual.queueIdentifier,
313
+ },
314
+ select: {
315
+ _id: true,
316
+ name: true,
317
+ },
318
+ props: {
319
+ isRoot: true,
320
+ },
321
+ });
322
+
323
+ if (sameIdentity) {
324
+ // Named only when the caller may read it.
325
+ const sameIdentityName: string = sameIdentity.id
326
+ ? await this.getMessageQueueNameIfReadable({
327
+ messageQueueId: sameIdentity.id,
328
+ props: createBy.props,
329
+ })
330
+ : "";
331
+
332
+ throw new BadDataException(
333
+ `The ${getMessagingSystemDisplayName(
334
+ manual.system,
335
+ )} queue ${quoteManualMessageQueueInput(manual.destination)}${
336
+ manual.brokerScope
337
+ ? ` in the ${quoteManualMessageQueueInput(
338
+ manual.brokerScope,
339
+ )} namespace`
340
+ : ""
341
+ } already exists${sameIdentityName ? `: "${sameIdentityName}"` : ""}.`,
342
+ );
343
+ }
344
+
345
+ const name: string = typeof data.name === "string" ? data.name.trim() : "";
346
+
347
+ data.messagingSystem = manual.system;
348
+ data.destinationName = manual.destination;
349
+ if (manual.brokerScope) {
350
+ data.brokerScope = manual.brokerScope;
351
+ } else {
352
+ delete data.brokerScope;
353
+ }
354
+ data.queueIdentifier = manual.queueIdentifier;
355
+ // First creator wins, and a person creating it is "manual" - whatever was sent.
356
+ data.discoverySource = MANUAL_DISCOVERY_SOURCE;
357
+ data.name =
358
+ name || buildMessageQueueDisplayName({ destination: manual.destination });
359
+
360
+ return { createBy: createBy, carryForward: null };
361
+ }
362
+
363
+ @CaptureSpan()
364
+ protected override async onCreateSuccess(
365
+ _onCreate: OnCreate<Model>,
366
+ createdItem: Model,
367
+ ): Promise<Model> {
368
+ this.runCreatedSideEffects(createdItem);
369
+
370
+ return createdItem;
371
+ }
372
+
373
+ @CaptureSpan()
374
+ protected override async onUpdateSuccess(
375
+ onUpdate: OnUpdate<Model>,
376
+ updatedItemIds: Array<ObjectID>,
377
+ ): Promise<OnUpdate<Model>> {
378
+ const updateData: JSONObject = onUpdate.updateBy
379
+ .data as unknown as JSONObject;
380
+
381
+ /*
382
+ * A person archiving or restoring a row takes it out of discovery's
383
+ * hands: from now on only a person restores it. A person's Restore also
384
+ * holds off the auto-archive sweep (manuallyRestoredAt), which would
385
+ * otherwise re-archive a stale row within minutes. Discovery's own
386
+ * archive and restore are raw writes, so they never reach this hook.
387
+ */
388
+ if (
389
+ ResourceFeedUtil.isArchiveChange(updateData) &&
390
+ !("autoArchivedAt" in updateData)
391
+ ) {
392
+ await this.recordArchiveDecisionByPerson(
393
+ updatedItemIds,
394
+ !updateData["isArchived"],
395
+ );
396
+ }
397
+
398
+ /*
399
+ * Labels a person saves on a row are theirs, whichever rule first
400
+ * attached them: they now count as investment.
401
+ */
402
+ if ("labels" in updateData) {
403
+ const labelIds: Array<string> = readRelationIds(updateData["labels"]);
404
+
405
+ for (const messageQueueId of updatedItemIds) {
406
+ await this.forgetAutomaticAssignments({
407
+ messageQueueId: messageQueueId,
408
+ kind: "labelIds",
409
+ ids: labelIds,
410
+ });
411
+ }
412
+ }
413
+
414
+ return onUpdate;
415
+ }
416
+
417
+ /**
418
+ * The queue a sighting names, found by its identity - or, when none exists
419
+ * and creating is allowed, a new one.
420
+ *
421
+ * Lookup first, by (projectId, queueIdentifier) - the identifier built
422
+ * from `identity`, which is canonicalized again here. An existing row is
423
+ * told about the sighting: its messagingSystem is refined to `system` when
424
+ * that is more specific within the row's family (jms -> activemq, never
425
+ * back; getMoreSpecificMessagingSystem), and a row the auto-archive sweep
426
+ * archived is restored - never one a person archived. That happens whether
427
+ * or not creating is allowed.
428
+ *
429
+ * When no row exists: `{ queue: null, created: false }` if `allowCreate` is
430
+ * false, if the identity is invalid, or if the project holds
431
+ * getAutoCreateBudget() live, non-archived discovered queues already (or
432
+ * the count cannot be read - fail closed). Otherwise a row is created as
433
+ * root, without hooks, storing the sighting's SPECIFIC system (a `system`
434
+ * outside the identity's family falls back to the family itself), the
435
+ * display destination, the Azure namespace, the broker address, the
436
+ * discovery source and lastSeenAt (now). brokerMetricsLastSeenAt stays
437
+ * empty: the recordSighting call that follows every find or create sets
438
+ * it to the broker's datapoint time.
439
+ *
440
+ * Races: two writers can both miss the lookup. The unique index lets one
441
+ * insert win; the loser re-reads the winner's row, sights it as above and
442
+ * answers `created: false`. Only the winner runs the label and owner rule
443
+ * engines (fire and forget). A create failure that is not a lost race is
444
+ * thrown.
445
+ */
446
+ @CaptureSpan()
447
+ public async findOrCreateByIdentity(
448
+ data: FindOrCreateMessageQueueByIdentityData,
449
+ ): Promise<MessageQueueFindOrCreateResult> {
450
+ const nothing: MessageQueueFindOrCreateResult = {
451
+ queue: null,
452
+ created: false,
453
+ };
454
+
455
+ if (!data || !data.projectId || !data.identity) {
456
+ return nothing;
457
+ }
458
+
459
+ const identity: MessageQueueIdentity | null = toMessageQueueIdentity(
460
+ data.identity,
461
+ );
462
+ const queueIdentifier: string | null = identity
463
+ ? buildMessageQueueIdentifier(identity)
464
+ : null;
465
+
466
+ if (!identity || !queueIdentifier) {
467
+ return nothing;
468
+ }
469
+
470
+ const system: string = getSightingSystem(data.system, identity);
471
+
472
+ const existing: Model | null = await this.findByQueueIdentifier(
473
+ data.projectId,
474
+ queueIdentifier,
475
+ );
476
+
477
+ if (existing) {
478
+ await this.recordIdentitySighting(existing, system);
479
+ return { queue: existing, created: false };
480
+ }
481
+
482
+ if (!data.allowCreate) {
483
+ return nothing;
484
+ }
485
+
486
+ if (!(await this.allowsAutoCreate(data.projectId, queueIdentifier))) {
487
+ return nothing;
488
+ }
489
+
490
+ const source: MessageQueueSightingSource =
491
+ data.source === "broker-metrics" ? "broker-metrics" : "traces";
492
+ const now: Date = OneUptimeDate.getCurrentDate();
493
+ const destination: string = getDisplayDestination(
494
+ data.destination,
495
+ identity,
496
+ );
497
+
498
+ const newRow: Model = new Model();
499
+ newRow.projectId = data.projectId;
500
+ newRow.name = truncateShortText(
501
+ buildMessageQueueDisplayName({ destination: destination }),
502
+ );
503
+ newRow.queueIdentifier = queueIdentifier;
504
+ newRow.messagingSystem = truncateShortText(system);
505
+ newRow.destinationName = truncateLongText(destination);
506
+ if (identity.brokerScope) {
507
+ newRow.brokerScope = truncateShortText(identity.brokerScope);
508
+ }
509
+ const brokerAddress: string | null = cleanBrokerAddress(data.brokerAddress);
510
+ if (brokerAddress) {
511
+ newRow.brokerAddress = brokerAddress;
512
+ }
513
+ newRow.discoverySource = source;
514
+ /*
515
+ * No brokerMetricsLastSeenAt: only the broker-metrics sighting knows when
516
+ * the newest datapoint was taken (recordSighting, its only writer).
517
+ * Stamped now, it would move back to that older time moments later.
518
+ */
519
+ newRow.lastSeenAt = now;
520
+
521
+ let created: Model;
522
+
523
+ try {
524
+ /*
525
+ * Without hooks: the rule engines run below, and only for the insert
526
+ * that won - a racing writer's loser never reaches them.
527
+ */
528
+ created = await this.create({
529
+ data: newRow,
530
+ props: {
531
+ isRoot: true,
532
+ ignoreHooks: true,
533
+ },
534
+ });
535
+ } catch (error) {
536
+ // The same identity created by a racing writer.
537
+ const winner: Model | null = await this.findByQueueIdentifier(
538
+ data.projectId,
539
+ queueIdentifier,
540
+ );
541
+
542
+ if (!winner) {
543
+ throw error;
544
+ }
545
+
546
+ await this.recordIdentitySighting(winner, system);
547
+ return { queue: winner, created: false };
548
+ }
549
+
550
+ this.noteAutoCreated(data.projectId);
551
+ this.runCreatedSideEffects(created);
552
+
553
+ return { queue: created, created: true };
554
+ }
555
+
556
+ /**
557
+ * Liveness: a queue was seen - in application spans (`traces`) or in the
558
+ * broker's own metrics (`broker-metrics`). One gated, non-blocking
559
+ * ResourceHeartbeat write per queue per source per window: lastSeenAt
560
+ * always, brokerMetricsLastSeenAt too for broker metrics, and the broker
561
+ * address (sanitized, clamped) only when it is non-empty and has changed
562
+ * since this source last wrote one. The two sources use separate cache
563
+ * namespaces, so neither can suppress the other.
564
+ *
565
+ * lastSeenAt is when discovery saw the queue - now - whichever source saw
566
+ * it, as DatabaseServerService.recordSighting writes it. Both sources
567
+ * write it, one after the other in every pass, each a plain SET, and
568
+ * their newest data can be minutes apart (Azure Monitor, CloudWatch and
569
+ * Cloud Monitoring deliver datapoints late; a source can also stop). A
570
+ * datapoint's own time from whichever source wrote last would move the
571
+ * column back behind the other's sighting - and a new row's behind its
572
+ * own creation.
573
+ *
574
+ * brokerMetricsLastSeenAt is `at`: when the newest broker datapoint the
575
+ * pass saw was taken (default now; a future or invalid value is read as
576
+ * now). Broker-metrics sightings are its only writer, and each pass's
577
+ * window ends later than the last one's, so it only moves forward.
578
+ * findOrCreateByIdentity leaves it empty on a new row: call this for
579
+ * every sighted row, created or found. A traces sighting ignores `at`.
580
+ *
581
+ * It restores nothing: findOrCreateByIdentity, which every discovery pass
582
+ * calls first, is what brings an auto-archived queue back.
583
+ */
584
+ @CaptureSpan()
585
+ public async recordSighting(
586
+ data: RecordMessageQueueSightingData,
587
+ ): Promise<void> {
588
+ if (!data || !data.queueId) {
589
+ return;
590
+ }
591
+
592
+ const isBrokerMetrics: boolean = data.source === "broker-metrics";
593
+ const now: Date = OneUptimeDate.getCurrentDate();
594
+
595
+ const liveness: PartialEntity<Model> = {
596
+ lastSeenAt: now,
597
+ };
598
+
599
+ if (isBrokerMetrics) {
600
+ liveness.brokerMetricsLastSeenAt = getSightingTime(data.at, now);
601
+ }
602
+
603
+ const metadata: PartialEntity<Model> = {};
604
+ const brokerAddress: string | null = cleanBrokerAddress(data.brokerAddress);
605
+
606
+ if (brokerAddress) {
607
+ metadata.brokerAddress = brokerAddress;
608
+ }
609
+
610
+ await ResourceHeartbeat.write({
611
+ service: this,
612
+ id: data.queueId,
613
+ cacheNamespace: isBrokerMetrics
614
+ ? BROKER_METRICS_SIGHTING_CACHE_NAMESPACE
615
+ : TRACE_SIGHTING_CACHE_NAMESPACE,
616
+ throttleInSeconds: SIGHTING_THROTTLE_SECONDS,
617
+ liveness: liveness,
618
+ metadata: metadata,
619
+ fingerprint: brokerAddress
620
+ ? crypto.createHash("sha256").update(brokerAddress).digest("hex")
621
+ : "",
622
+ describe: `queue ${data.queueId.toString()} (${
623
+ isBrokerMetrics ? "broker-metrics" : "traces"
624
+ } sighting, project ${data.projectId?.toString() || "unknown"})`,
625
+ });
626
+ }
627
+
628
+ /*
629
+ * Days a discovered queue may go unseen before the sweep archives it
630
+ * (MESSAGE_QUEUE_AUTO_ARCHIVE_DAYS). Default 7, at least 1.
631
+ */
632
+ public getAutoArchiveDays(): number {
633
+ return readIntegerEnv({
634
+ name: "MESSAGE_QUEUE_AUTO_ARCHIVE_DAYS",
635
+ defaultValue: DEFAULT_AUTO_ARCHIVE_DAYS,
636
+ min: MIN_AUTO_ARCHIVE_DAYS,
637
+ });
638
+ }
639
+
640
+ /**
641
+ * Archive discovered queues nobody has seen - and nobody has touched - for
642
+ * getAutoArchiveDays(). Discovery creates rows on its own, so without this
643
+ * a queue a decommissioned service used, or a per-run topic seen once in a
644
+ * trace, would sit in the list forever.
645
+ *
646
+ * "Untouched" is what makes this safe to do unasked: a manually added
647
+ * queue is never archived, and neither is one somebody invested in - a
648
+ * description, a rename, labels or owners a PERSON added (not the ones
649
+ * rules attached on their own). Every one of those checks is done in SQL,
650
+ * scoped to the row's project and to live rows
651
+ * (UNTOUCHED_MESSAGE_QUEUE_PREDICATE). A row a person restored from the
652
+ * archive is left alone until discovery sees it again or the grace period
653
+ * passes - their Restore must stick.
654
+ *
655
+ * The row is marked autoArchivedAt, which is what lets discovery restore
656
+ * it the moment it is seen again - and never restore one a person
657
+ * archived. At most AUTO_ARCHIVE_BATCH_SIZE rows per run, oldest first,
658
+ * in one statement. Returns how many rows were archived.
659
+ */
660
+ @CaptureSpan()
661
+ public async autoArchiveStaleMessageQueues(): Promise<number> {
662
+ const days: number = this.getAutoArchiveDays();
663
+ const now: Date = OneUptimeDate.getCurrentDate();
664
+ const cutoff: Date = OneUptimeDate.addRemoveDays(now, -days);
665
+ const restoreGraceCutoff: Date = OneUptimeDate.addRemoveDays(
666
+ now,
667
+ -Math.max(MANUAL_RESTORE_GRACE_DAYS, days),
668
+ );
669
+
670
+ const archived: unknown = await this.getRepository().manager.query(
671
+ `WITH "candidates" AS (
672
+ SELECT mq."_id"
673
+ FROM "MessageQueue" mq
674
+ WHERE mq."deletedAt" IS NULL
675
+ AND mq."isArchived" = false
676
+ AND mq."discoverySource" IS NOT NULL
677
+ AND mq."discoverySource" <> $3
678
+ AND COALESCE(mq."lastSeenAt", mq."createdAt") < $1
679
+ AND (
680
+ mq."manuallyRestoredAt" IS NULL
681
+ OR mq."manuallyRestoredAt" < $5
682
+ OR COALESCE(mq."lastSeenAt", mq."createdAt") > mq."manuallyRestoredAt"
683
+ )
684
+ AND ${UNTOUCHED_MESSAGE_QUEUE_PREDICATE}
685
+ ORDER BY COALESCE(mq."lastSeenAt", mq."createdAt") ASC
686
+ LIMIT $4
687
+ ),
688
+ "archived" AS (
689
+ UPDATE "MessageQueue" stale
690
+ SET "isArchived" = true,
691
+ "archivedAt" = $2,
692
+ "autoArchivedAt" = $2,
693
+ "archivedByUserId" = NULL,
694
+ "updatedAt" = CURRENT_TIMESTAMP
695
+ FROM "candidates"
696
+ WHERE stale."_id" = "candidates"."_id"
697
+ AND stale."isArchived" = false
698
+ RETURNING stale."_id" AS "_id", stale."projectId" AS "projectId"
699
+ )
700
+ SELECT "_id", "projectId" FROM "archived"`,
701
+ [
702
+ cutoff,
703
+ now,
704
+ MANUAL_DISCOVERY_SOURCE,
705
+ AUTO_ARCHIVE_BATCH_SIZE,
706
+ restoreGraceCutoff,
707
+ ],
708
+ );
709
+
710
+ return Array.isArray(archived) ? archived.length : 0;
711
+ }
712
+
713
+ /*
714
+ * How many discovered queues (traces, broker metrics) a project may
715
+ * accumulate before discovery stops creating more on its own
716
+ * (MESSAGE_QUEUE_AUTO_CREATE_BUDGET). Manual rows do not count and are
717
+ * never blocked; archived rows do not count, so the auto-archive sweep
718
+ * frees budget. Default 500, at least 0 (0 turns auto-creation off).
719
+ */
720
+ public getAutoCreateBudget(): number {
721
+ return readIntegerEnv({
722
+ name: "MESSAGE_QUEUE_AUTO_CREATE_BUDGET",
723
+ defaultValue: DEFAULT_AUTO_CREATE_BUDGET,
724
+ min: 0,
725
+ });
726
+ }
727
+
728
+ /**
729
+ * True while the project holds fewer live, non-archived discovered queues
730
+ * than getAutoCreateBudget(). Always reads the count.
731
+ */
732
+ @CaptureSpan()
733
+ public async isUnderAutoCreateBudget(projectId: ObjectID): Promise<boolean> {
734
+ const budget: number = this.getAutoCreateBudget();
735
+
736
+ if (budget <= 0) {
737
+ return false;
738
+ }
739
+
740
+ return (await this.countAutoCreatedMessageQueues(projectId)) < budget;
741
+ }
742
+
743
+ /**
744
+ * isUnderAutoCreateBudget as findOrCreateByIdentity asks it: the count is
745
+ * read at most once a minute per project in this process, and every row
746
+ * this process creates in between is added to it, so a burst of new
747
+ * destinations stops at the budget instead of a minute's worth past it.
748
+ */
749
+ @CaptureSpan()
750
+ public async isUnderAutoCreateBudgetCached(
751
+ projectId: ObjectID,
752
+ ): Promise<boolean> {
753
+ const budget: number = this.getAutoCreateBudget();
754
+
755
+ if (budget <= 0) {
756
+ return false;
757
+ }
758
+
759
+ const key: string = projectId.toString();
760
+ let cached: AutoCreateCount | undefined = this.autoCreateCountMemo.get(key);
761
+
762
+ if (!cached) {
763
+ cached = {
764
+ count: await this.countAutoCreatedMessageQueues(projectId),
765
+ readAtMs: Date.now(),
766
+ };
767
+ this.autoCreateCountMemo.set(key, cached);
768
+ }
769
+
770
+ return cached.count < budget;
771
+ }
772
+
773
+ // Live, non-archived, non-manual rows of one project.
774
+ @CaptureSpan()
775
+ public async countAutoCreatedMessageQueues(
776
+ projectId: ObjectID,
777
+ ): Promise<number> {
778
+ const rows: unknown = await this.getRepository().manager.query(
779
+ `SELECT COUNT(*)::int AS "count"
780
+ FROM "MessageQueue"
781
+ WHERE "projectId" = $1
782
+ AND "deletedAt" IS NULL
783
+ AND "isArchived" = false
784
+ AND COALESCE("discoverySource", '') <> $2`,
785
+ [projectId.toString(), MANUAL_DISCOVERY_SOURCE],
786
+ );
787
+
788
+ return readCount(rows);
789
+ }
790
+
791
+ /**
792
+ * Display name for this queue, or an empty string when the row is gone.
793
+ * Callers use it on a best-effort basis, so a missing row must not throw.
794
+ */
795
+ @CaptureSpan()
796
+ public async getMessageQueueName(data: {
797
+ messageQueueId: ObjectID;
798
+ }): Promise<string> {
799
+ const messageQueue: Model | null = await this.findOneById({
800
+ id: data.messageQueueId,
801
+ select: {
802
+ name: true,
803
+ },
804
+ props: {
805
+ isRoot: true,
806
+ },
807
+ });
808
+
809
+ return messageQueue?.name || "";
810
+ }
811
+
812
+ /**
813
+ * The queue's name - but only when `props` may read that row (project,
814
+ * label and Owned scopes applied); "" otherwise, or on any error. Refusal
815
+ * messages use it, so a caller with scoped permissions is never told the
816
+ * name of a queue they cannot see. Without props (or as root) the name is
817
+ * read as root.
818
+ */
819
+ @CaptureSpan()
820
+ public async getMessageQueueNameIfReadable(data: {
821
+ messageQueueId: ObjectID;
822
+ props?: DatabaseCommonInteractionProps | undefined;
823
+ }): Promise<string> {
824
+ if (!data.props || data.props.isRoot) {
825
+ return await this.getMessageQueueName({
826
+ messageQueueId: data.messageQueueId,
827
+ });
828
+ }
829
+
830
+ try {
831
+ const readable: Model | null = await this.findOneBy({
832
+ query: {
833
+ _id: data.messageQueueId.toString(),
834
+ },
835
+ select: {
836
+ name: true,
837
+ },
838
+ props: data.props,
839
+ });
840
+
841
+ return readable?.name || "";
842
+ } catch {
843
+ return "";
844
+ }
845
+ }
846
+
847
+ /**
848
+ * Validate the queue a child row (an owner) is created for by a caller:
849
+ * the FK column and the relation object must agree (TypeORM would persist
850
+ * the relation object's id over the column's), and the queue must be in
851
+ * the caller's project. Leaves the validated FK column as the only
852
+ * reference. Root creates are the caller's business.
853
+ */
854
+ @CaptureSpan()
855
+ public async assertMessageQueueReferenceInProject<TModel extends BaseModel>(
856
+ createBy: CreateBy<TModel>,
857
+ ): Promise<ObjectID> {
858
+ const data: TModel = createBy.data;
859
+
860
+ const projectId: ObjectID | undefined =
861
+ createBy.props.tenantId ||
862
+ (data.getColumnValue("projectId") as ObjectID | undefined) ||
863
+ undefined;
864
+
865
+ if (!projectId) {
866
+ throw new BadDataException("Project ID is required.");
867
+ }
868
+
869
+ const messageQueueId: ObjectID | null = RelationIdUtil.readConsistent(
870
+ data as unknown as Record<string, unknown>,
871
+ ["messageQueueId", "messageQueue"],
872
+ "queue",
873
+ );
874
+
875
+ data.setColumnValue("messageQueue", undefined);
876
+
877
+ if (!messageQueueId) {
878
+ throw new BadDataException("Select a queue.");
879
+ }
880
+
881
+ const messageQueue: Model | null = await this.findOneBy({
882
+ query: {
883
+ _id: messageQueueId.toString(),
884
+ projectId: projectId,
885
+ },
886
+ select: {
887
+ _id: true,
888
+ },
889
+ props: {
890
+ isRoot: true,
891
+ },
892
+ });
893
+
894
+ if (!messageQueue) {
895
+ throw new BadDataException("Queue not found.");
896
+ }
897
+
898
+ data.setColumnValue("messageQueueId", messageQueueId);
899
+
900
+ return messageQueueId;
901
+ }
902
+
903
+ /**
904
+ * Record labels or owners that a rule attached to a queue on its own
905
+ * (MessageQueue.automaticAssignments), so the auto-archive sweep does not
906
+ * mistake them for a person's investment. One atomic statement; ids
907
+ * deduped. Never throws - it only annotates a write that happened.
908
+ */
909
+ @CaptureSpan()
910
+ public async recordAutomaticAssignments(data: {
911
+ messageQueueId: ObjectID;
912
+ kind: MessageQueueAutomaticAssignmentKind;
913
+ ids: Array<ObjectID | string>;
914
+ }): Promise<void> {
915
+ const ids: Array<string> = normalizeAssignmentIds(data.ids);
916
+
917
+ if (ids.length === 0 || !AUTOMATIC_ASSIGNMENT_KINDS.includes(data.kind)) {
918
+ return;
919
+ }
920
+
921
+ try {
922
+ await this.getRepository().manager.query(
923
+ `UPDATE "MessageQueue"
924
+ SET "automaticAssignments" =
925
+ (CASE WHEN jsonb_typeof("automaticAssignments") = 'object' THEN "automaticAssignments" ELSE '{}'::jsonb END)
926
+ || jsonb_build_object(
927
+ $2::text,
928
+ (
929
+ SELECT COALESCE(jsonb_agg(DISTINCT assigned.id), '[]'::jsonb)
930
+ FROM jsonb_array_elements_text(
931
+ (CASE WHEN jsonb_typeof("automaticAssignments" -> $2::text) = 'array' THEN "automaticAssignments" -> $2::text ELSE '[]'::jsonb END)
932
+ || $3::jsonb
933
+ ) AS assigned(id)
934
+ )
935
+ )
936
+ WHERE "_id" = $1`,
937
+ [data.messageQueueId.toString(), data.kind, JSON.stringify(ids)],
938
+ );
939
+ } catch (error) {
940
+ logger.warn(
941
+ `MessageQueueService: could not record automatic ${data.kind} on queue ${data.messageQueueId.toString()}: ${
942
+ error instanceof Error ? error.message : String(error)
943
+ }`,
944
+ );
945
+ }
946
+ }
947
+
948
+ /**
949
+ * The opposite of recordAutomaticAssignments: a person (re)added these
950
+ * labels or owners, so from now on they count as investment. Never throws.
951
+ */
952
+ @CaptureSpan()
953
+ public async forgetAutomaticAssignments(data: {
954
+ messageQueueId: ObjectID;
955
+ kind: MessageQueueAutomaticAssignmentKind;
956
+ ids: Array<ObjectID | string>;
957
+ }): Promise<void> {
958
+ const ids: Array<string> = normalizeAssignmentIds(data.ids);
959
+
960
+ if (ids.length === 0 || !AUTOMATIC_ASSIGNMENT_KINDS.includes(data.kind)) {
961
+ return;
962
+ }
963
+
964
+ try {
965
+ await this.getRepository().manager.query(
966
+ `UPDATE "MessageQueue"
967
+ SET "automaticAssignments" = "automaticAssignments" || jsonb_build_object(
968
+ $2::text,
969
+ (
970
+ SELECT COALESCE(jsonb_agg(assigned.id), '[]'::jsonb)
971
+ FROM jsonb_array_elements_text("automaticAssignments" -> $2::text) AS assigned(id)
972
+ WHERE NOT (assigned.id = ANY($3::text[]))
973
+ )
974
+ )
975
+ WHERE "_id" = $1
976
+ AND jsonb_typeof("automaticAssignments") = 'object'
977
+ AND jsonb_typeof("automaticAssignments" -> $2::text) = 'array'`,
978
+ [data.messageQueueId.toString(), data.kind, ids],
979
+ );
980
+ } catch (error) {
981
+ logger.warn(
982
+ `MessageQueueService: could not forget automatic ${data.kind} on queue ${data.messageQueueId.toString()}: ${
983
+ error instanceof Error ? error.message : String(error)
984
+ }`,
985
+ );
986
+ }
987
+ }
988
+
989
+ @CaptureSpan()
990
+ public async getMessageQueueLinkInDashboard(
991
+ projectId: ObjectID,
992
+ messageQueueId: ObjectID,
993
+ ): Promise<URL> {
994
+ const dashboardUrl: URL = await DatabaseConfig.getDashboardUrl();
995
+
996
+ return URL.fromString(dashboardUrl.toString()).addRoute(
997
+ `/${projectId.toString()}/queues/${messageQueueId.toString()}`,
998
+ );
999
+ }
1000
+
1001
+ // "[Queue orders.created](https://…)" - the form a markdown message names a queue by.
1002
+ @CaptureSpan()
1003
+ public async getMessageQueueMarkdownLink(
1004
+ projectId: ObjectID,
1005
+ messageQueueId: ObjectID,
1006
+ ): Promise<string> {
1007
+ const name: string = await this.getMessageQueueName({
1008
+ messageQueueId: messageQueueId,
1009
+ });
1010
+ const link: URL = await this.getMessageQueueLinkInDashboard(
1011
+ projectId,
1012
+ messageQueueId,
1013
+ );
1014
+
1015
+ return `[Queue ${name}](${link.toString()})`;
1016
+ }
1017
+
1018
+ // For tests: forget the cached auto-create counts and budget warnings.
1019
+ public clearAutoCreateBudgetMemo(): void {
1020
+ this.autoCreateCountMemo.clear();
1021
+ this.autoCreateBudgetWarningMemo.clear();
1022
+ }
1023
+
1024
+ // One live row by identifier, with the columns discovery reads back.
1025
+ private async findByQueueIdentifier(
1026
+ projectId: ObjectID,
1027
+ queueIdentifier: string,
1028
+ ): Promise<Model | null> {
1029
+ return await this.findOneBy({
1030
+ query: {
1031
+ projectId: projectId,
1032
+ queueIdentifier: queueIdentifier,
1033
+ },
1034
+ select: DISCOVERY_SELECT,
1035
+ props: {
1036
+ isRoot: true,
1037
+ },
1038
+ });
1039
+ }
1040
+
1041
+ /*
1042
+ * What a sighting tells the row it names: the system is refined within its
1043
+ * family, and a row the sweep archived is restored.
1044
+ */
1045
+ private async recordIdentitySighting(
1046
+ row: Model,
1047
+ system: string,
1048
+ ): Promise<void> {
1049
+ await this.refineMessagingSystem(row, system);
1050
+ await this.restoreIfAutoArchived(row);
1051
+ }
1052
+
1053
+ /*
1054
+ * The more specific system of the row's family (jms -> activemq), written
1055
+ * only while the row still says what was read - a compare-and-set, so two
1056
+ * sightings cannot interleave - and never outside the family: the
1057
+ * identifier (and so the entity key telemetry is joined on) never moves.
1058
+ * Never throws: a refinement must not fail the discovery that saw it.
1059
+ */
1060
+ private async refineMessagingSystem(
1061
+ row: Model,
1062
+ system: string,
1063
+ ): Promise<void> {
1064
+ const current: string | undefined = row.messagingSystem;
1065
+ const next: string | null = getMoreSpecificMessagingSystem(current, system);
1066
+
1067
+ if (!next || next === current || !row.id || !row.projectId) {
1068
+ return;
1069
+ }
1070
+
1071
+ try {
1072
+ const refined: unknown = await this.getRepository().manager.query(
1073
+ `WITH "refined" AS (
1074
+ UPDATE "MessageQueue"
1075
+ SET "messagingSystem" = $1,
1076
+ "updatedAt" = CURRENT_TIMESTAMP
1077
+ WHERE "_id" = $2
1078
+ AND "projectId" = $3
1079
+ AND "deletedAt" IS NULL
1080
+ AND "messagingSystem" IS NOT DISTINCT FROM $4
1081
+ RETURNING "_id"
1082
+ )
1083
+ SELECT "_id" FROM "refined"`,
1084
+ [
1085
+ truncateShortText(next),
1086
+ row.id.toString(),
1087
+ row.projectId.toString(),
1088
+ current === undefined ? null : current,
1089
+ ],
1090
+ );
1091
+
1092
+ if (Array.isArray(refined) && refined.length > 0) {
1093
+ row.messagingSystem = next;
1094
+ }
1095
+ } catch (error) {
1096
+ logger.warn(
1097
+ `MessageQueueService: could not refine the messaging system of queue ${row.id.toString()} to ${next}: ${
1098
+ error instanceof Error ? error.message : String(error)
1099
+ }`,
1100
+ { projectId: row.projectId.toString() } as LogAttributes,
1101
+ );
1102
+ }
1103
+ }
1104
+
1105
+ /*
1106
+ * Restore a row the auto-archive sweep archived, now that it was seen
1107
+ * again. The conditions live in the UPDATE itself, so a row a person
1108
+ * archived (autoArchivedAt cleared - see onUpdateSuccess) or a row a person
1109
+ * restored in the meantime is never touched. Never throws: a restore must
1110
+ * not fail the discovery that triggered it.
1111
+ */
1112
+ private async restoreIfAutoArchived(row: Model): Promise<boolean> {
1113
+ if (!row.isArchived || !row.autoArchivedAt || !row.id || !row.projectId) {
1114
+ return false;
1115
+ }
1116
+
1117
+ try {
1118
+ const restored: unknown = await this.getRepository().manager.query(
1119
+ `WITH "restored" AS (
1120
+ UPDATE "MessageQueue"
1121
+ SET "isArchived" = false,
1122
+ "archivedAt" = NULL,
1123
+ "archivedByUserId" = NULL,
1124
+ "autoArchivedAt" = NULL,
1125
+ "updatedAt" = CURRENT_TIMESTAMP
1126
+ WHERE "_id" = $1
1127
+ AND "projectId" = $2
1128
+ AND "isArchived" = true
1129
+ AND "autoArchivedAt" IS NOT NULL
1130
+ AND "deletedAt" IS NULL
1131
+ RETURNING "_id"
1132
+ )
1133
+ SELECT "_id" FROM "restored"`,
1134
+ [row.id.toString(), row.projectId.toString()],
1135
+ );
1136
+
1137
+ /*
1138
+ * Nothing matched: a person restored it, or archived it themselves, in
1139
+ * the meantime. Their state stands - the in-memory row is left as read.
1140
+ */
1141
+ if (!Array.isArray(restored) || restored.length === 0) {
1142
+ return false;
1143
+ }
1144
+
1145
+ row.isArchived = false;
1146
+ delete row.autoArchivedAt;
1147
+
1148
+ return true;
1149
+ } catch (error) {
1150
+ logger.warn(
1151
+ `MessageQueueService: could not restore auto-archived queue ${row.id.toString()}: ${
1152
+ error instanceof Error ? error.message : String(error)
1153
+ }`,
1154
+ { projectId: row.projectId.toString() } as LogAttributes,
1155
+ );
1156
+
1157
+ return false;
1158
+ }
1159
+ }
1160
+
1161
+ /*
1162
+ * A person archived (restored = false) or restored a row: it is no longer
1163
+ * discovery's archive (autoArchivedAt cleared), and a restore is stamped
1164
+ * so the sweep leaves the row alone until it is seen again or the grace
1165
+ * period passes (manuallyRestoredAt; cleared again on an archive).
1166
+ */
1167
+ private async recordArchiveDecisionByPerson(
1168
+ messageQueueIds: Array<ObjectID>,
1169
+ restored: boolean,
1170
+ ): Promise<void> {
1171
+ const now: Date = OneUptimeDate.getCurrentDate();
1172
+
1173
+ for (const messageQueueId of messageQueueIds) {
1174
+ try {
1175
+ await this.updateColumnsByIdWithoutHooks({
1176
+ id: messageQueueId,
1177
+ data: {
1178
+ autoArchivedAt: null,
1179
+ manuallyRestoredAt: restored ? now : null,
1180
+ },
1181
+ skipUpdateDateColumn: true,
1182
+ });
1183
+ } catch (error) {
1184
+ logger.warn(
1185
+ `MessageQueueService: could not record the ${
1186
+ restored ? "restore" : "archive"
1187
+ } of queue ${messageQueueId.toString()}: ${
1188
+ error instanceof Error ? error.message : String(error)
1189
+ }`,
1190
+ );
1191
+ }
1192
+ }
1193
+ }
1194
+
1195
+ /*
1196
+ * The discovery path's budget gate: false when the project has reached its
1197
+ * auto-create budget - warned about once per project per ten minutes,
1198
+ * since every discovery pass would otherwise repeat it for every new
1199
+ * destination - or when the count cannot be read (fail closed).
1200
+ */
1201
+ private async allowsAutoCreate(
1202
+ projectId: ObjectID,
1203
+ queueIdentifier: string,
1204
+ ): Promise<boolean> {
1205
+ let underBudget: boolean = false;
1206
+
1207
+ try {
1208
+ underBudget = await this.isUnderAutoCreateBudgetCached(projectId);
1209
+ } catch (error) {
1210
+ logger.error(
1211
+ `MessageQueueService: auto-create budget check failed for project ${projectId.toString()}; not creating queue ${queueIdentifier}: ${
1212
+ error instanceof Error ? error.message : String(error)
1213
+ }`,
1214
+ { projectId: projectId.toString() } as LogAttributes,
1215
+ );
1216
+
1217
+ return false;
1218
+ }
1219
+
1220
+ if (!underBudget) {
1221
+ const key: string = projectId.toString();
1222
+
1223
+ if (!this.autoCreateBudgetWarningMemo.get(key)) {
1224
+ this.autoCreateBudgetWarningMemo.set(key, true);
1225
+
1226
+ logger.warn(
1227
+ `MessageQueueService: project ${key} reached its auto-create budget (MESSAGE_QUEUE_AUTO_CREATE_BUDGET=${this.getAutoCreateBudget()}); not creating queue ${queueIdentifier}, nor any other new queue until the project is under the budget again (this warning repeats at most every ten minutes). Raise the budget, archive or delete queues nobody needs, or add the queue manually.`,
1228
+ { projectId: key } as LogAttributes,
1229
+ );
1230
+ }
1231
+ }
1232
+
1233
+ return underBudget;
1234
+ }
1235
+
1236
+ // A row was auto-created: count it against the cached budget straight away.
1237
+ private noteAutoCreated(projectId: ObjectID): void {
1238
+ const key: string = projectId.toString();
1239
+ const cached: AutoCreateCount | undefined =
1240
+ this.autoCreateCountMemo.get(key);
1241
+
1242
+ if (!cached) {
1243
+ return;
1244
+ }
1245
+
1246
+ const remainingMs: number =
1247
+ cached.readAtMs + AUTO_CREATE_BUDGET_CACHE_MS - Date.now();
1248
+
1249
+ if (remainingMs <= 0) {
1250
+ this.autoCreateCountMemo.delete(key);
1251
+ return;
1252
+ }
1253
+
1254
+ this.autoCreateCountMemo.set(
1255
+ key,
1256
+ { count: cached.count + 1, readAtMs: cached.readAtMs },
1257
+ remainingMs,
1258
+ );
1259
+ }
1260
+
1261
+ /*
1262
+ * Rules run once, on creation only - exact parity with the other resource
1263
+ * types. Label engine first: it syncs the in-memory labels so the owner
1264
+ * engine can match rule-added labels. Fire and forget: they may not fail
1265
+ * the create they follow.
1266
+ */
1267
+ private runCreatedSideEffects(createdItem: Model): void {
1268
+ if (!createdItem.projectId || !createdItem.id) {
1269
+ return;
1270
+ }
1271
+
1272
+ Promise.resolve()
1273
+ .then(async () => {
1274
+ await MessageQueueLabelRuleEngineService.applyRulesToMessageQueue(
1275
+ createdItem,
1276
+ );
1277
+ })
1278
+ .then(async () => {
1279
+ await MessageQueueOwnerRuleEngineService.applyRulesToMessageQueue(
1280
+ createdItem,
1281
+ );
1282
+ })
1283
+ .catch((error: Error) => {
1284
+ logger.error(
1285
+ `Error applying queue rules in MessageQueueService: ${error}`,
1286
+ {
1287
+ projectId: createdItem.projectId?.toString(),
1288
+ messageQueueId: createdItem.id?.toString(),
1289
+ } as LogAttributes,
1290
+ );
1291
+ });
1292
+ }
1293
+ }
1294
+
1295
+ /**
1296
+ * The values a label or owner rule's messaging system pattern is matched
1297
+ * against: the canonical messaging.system value ("kafka") and its display
1298
+ * name ("Apache Kafka"), deduped, empty ones dropped - so both `^kafka$`
1299
+ * and `Kafka` say "every Kafka topic". An unknown system is matched as
1300
+ * stored.
1301
+ */
1302
+ export function getMessagingSystemRuleMatchValues(
1303
+ system: unknown,
1304
+ ): Array<string> {
1305
+ const raw: string = typeof system === "string" ? system.trim() : "";
1306
+ const canonical: string = normalizeMessagingSystem(raw) || raw;
1307
+ const values: Array<string> = [];
1308
+
1309
+ for (const value of [canonical, getMessagingSystemDisplayName(canonical)]) {
1310
+ if (value && !values.includes(value)) {
1311
+ values.push(value);
1312
+ }
1313
+ }
1314
+
1315
+ return values;
1316
+ }
1317
+
1318
+ /*
1319
+ * The system a sighting stores: its own specific system when that belongs
1320
+ * to the identity's family (activemq for a jms identity), else the family
1321
+ * itself - a row never stores a system outside the family its identifier
1322
+ * names.
1323
+ */
1324
+ function getSightingSystem(
1325
+ system: unknown,
1326
+ identity: MessageQueueIdentity,
1327
+ ): string {
1328
+ const specific: string | null = normalizeMessagingSystem(system);
1329
+
1330
+ if (specific && getMessagingIdentitySystem(specific) === identity.system) {
1331
+ return specific;
1332
+ }
1333
+
1334
+ return identity.system;
1335
+ }
1336
+
1337
+ /*
1338
+ * The destination as the sighting spells it, trimmed - when it is the one
1339
+ * the identity names; the identity's canonical destination otherwise.
1340
+ */
1341
+ function getDisplayDestination(
1342
+ destination: unknown,
1343
+ identity: MessageQueueIdentity,
1344
+ ): string {
1345
+ const display: string =
1346
+ typeof destination === "string" ? destination.trim() : "";
1347
+
1348
+ return display && canonicalizeEntityValue(display) === identity.destination
1349
+ ? display
1350
+ : identity.destination;
1351
+ }
1352
+
1353
+ /*
1354
+ * A broker address as the row may store it: trimmed, clamped to the column,
1355
+ * null when blank or when it holds a control character.
1356
+ */
1357
+ function cleanBrokerAddress(value: unknown): string | null {
1358
+ if (typeof value !== "string") {
1359
+ return null;
1360
+ }
1361
+
1362
+ const address: string = value.trim();
1363
+
1364
+ if (!address || hasControlCharacter(address)) {
1365
+ return null;
1366
+ }
1367
+
1368
+ return truncateLongText(address);
1369
+ }
1370
+
1371
+ /*
1372
+ * A broker datapoint's time as a sighting reports it: `now`, unless a valid
1373
+ * time no later than `now` was given.
1374
+ */
1375
+ function getSightingTime(at: unknown, now: Date): Date {
1376
+ if (!(at instanceof Date) || !Number.isFinite(at.getTime())) {
1377
+ return now;
1378
+ }
1379
+
1380
+ return at.getTime() > now.getTime() ? now : at;
1381
+ }
1382
+
1383
+ /*
1384
+ * A positive-integer env setting: unset or unparseable → the default, below
1385
+ * the floor → the floor.
1386
+ */
1387
+ function readIntegerEnv(data: {
1388
+ name: string;
1389
+ defaultValue: number;
1390
+ min: number;
1391
+ }): number {
1392
+ const raw: string | undefined = process.env[data.name];
1393
+
1394
+ if (raw === undefined || raw.trim() === "") {
1395
+ return data.defaultValue;
1396
+ }
1397
+
1398
+ const parsed: number = Number(raw.trim());
1399
+
1400
+ if (!Number.isFinite(parsed) || !Number.isInteger(parsed)) {
1401
+ return data.defaultValue;
1402
+ }
1403
+
1404
+ return Math.max(parsed, data.min);
1405
+ }
1406
+
1407
+ function readCount(rows: unknown): number {
1408
+ if (!Array.isArray(rows) || rows.length === 0) {
1409
+ return 0;
1410
+ }
1411
+
1412
+ const count: number = Number((rows[0] as { count?: unknown })?.count);
1413
+
1414
+ return Number.isFinite(count) ? count : 0;
1415
+ }
1416
+
1417
+ /*
1418
+ * The ids in a relation payload (an update's `labels`): model instances,
1419
+ * `{ _id }` / `{ id }` objects, ObjectIDs or id strings. Anything else is
1420
+ * skipped.
1421
+ */
1422
+ function readRelationIds(value: unknown): Array<string> {
1423
+ const ids: Array<string> = [];
1424
+
1425
+ for (const item of Array.isArray(value) ? value : []) {
1426
+ let id: unknown = item;
1427
+
1428
+ if (item && typeof item === "object" && !(item instanceof ObjectID)) {
1429
+ id =
1430
+ (item as { _id?: unknown; id?: unknown })._id ||
1431
+ (item as { _id?: unknown; id?: unknown }).id;
1432
+ }
1433
+
1434
+ const text: string =
1435
+ id instanceof ObjectID || typeof id === "string" ? id.toString() : "";
1436
+
1437
+ if (text) {
1438
+ ids.push(text);
1439
+ }
1440
+ }
1441
+
1442
+ return ids;
1443
+ }
1444
+
1445
+ /*
1446
+ * Assignment ids as automaticAssignments stores them: lowercase UUID strings
1447
+ * (what Postgres prints for a uuid column), deduped, invalid ones dropped.
1448
+ */
1449
+ function normalizeAssignmentIds(ids: Array<ObjectID | string>): Array<string> {
1450
+ const result: Array<string> = [];
1451
+
1452
+ for (const id of Array.isArray(ids) ? ids : []) {
1453
+ const text: string = (id ? id.toString() : "").trim().toLowerCase();
1454
+
1455
+ if (text && ObjectID.isValidUUID(text) && !result.includes(text)) {
1456
+ result.push(text);
1457
+ }
1458
+ }
1459
+
1460
+ return result;
1461
+ }
1462
+
1463
+ export default new Service();