@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,1439 @@
1
+ import Alert from "../../Models/DatabaseModels/Alert";
2
+ import Incident from "../../Models/DatabaseModels/Incident";
3
+ import Monitor from "../../Models/DatabaseModels/Monitor";
4
+ import ResourceAiAgent from "../../Models/DatabaseModels/ResourceAiAgent";
5
+ import BaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
6
+ import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
7
+ import OneUptimeDate from "../../Types/Date";
8
+ import BadDataException from "../../Types/Exception/BadDataException";
9
+ import NotAuthenticatedException from "../../Types/Exception/NotAuthenticatedException";
10
+ import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
11
+ import ObjectID from "../../Types/ObjectID";
12
+ import AiResourceType, {
13
+ AI_RESOURCE_TYPE_INFO,
14
+ ALL_AI_RESOURCE_TYPES,
15
+ AiResourceTypeInfo,
16
+ isAiResourceType,
17
+ } from "../../Types/ResourceAiAgent/AiResourceType";
18
+ import {
19
+ RESOURCE_AI_AGENT_IMAGE_REPOSITORY,
20
+ RESOURCE_AI_AGENT_RESOURCE_TYPE_ENV,
21
+ RESOURCE_AI_ALLOW_WRITES_ENV,
22
+ RESOURCE_AI_WRITE_TARGETS_ENV,
23
+ ResourceAiAccessGap,
24
+ ResourceAiAccessStatus,
25
+ ResourceAiAgentPosture,
26
+ ResourceAiAgentSummary,
27
+ ResourceAiRemediationMode,
28
+ parseResourceAiRemediationMode,
29
+ } from "../../Types/ResourceAiAgent/ResourceAiAccess";
30
+ import ModelPermission from "../Types/Database/Permissions/Index";
31
+ import QueryHelper from "../Types/Database/QueryHelper";
32
+ import Select from "../Types/Database/Select";
33
+ import MonitorResourceContextUtil from "../Utils/Monitor/MonitorResourceContext";
34
+ import { SeriesResolvedResourceIds } from "../Utils/Monitor/SeriesResourceLinker";
35
+ import logger from "../Utils/Logger";
36
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
37
+ import AlertService from "./AlertService";
38
+ import CephClusterService from "./CephClusterService";
39
+ import DatabaseServerService from "./DatabaseServerService";
40
+ import DatabaseService from "./DatabaseService";
41
+ import DockerHostService from "./DockerHostService";
42
+ import DockerSwarmClusterService from "./DockerSwarmClusterService";
43
+ import HostService from "./HostService";
44
+ import IncidentService from "./IncidentService";
45
+ import KubernetesClusterAiAccessService, {
46
+ AI_BALANCE_INSUFFICIENT_NEXT_STEP,
47
+ KubernetesClusterAiAccessProjectGates,
48
+ } from "./KubernetesClusterAiAccessService";
49
+ import MonitorService from "./MonitorService";
50
+ import PodmanHostService from "./PodmanHostService";
51
+ import ProxmoxClusterService from "./ProxmoxClusterService";
52
+ import ResourceAiAgentService from "./ResourceAiAgentService";
53
+ import VMwareVCenterService from "./VMwareVCenterService";
54
+
55
+ /*
56
+ * OneUptime AI access to an infrastructure resource — a Docker or Podman
57
+ * host, a Docker Swarm, Proxmox, VMware or Ceph cluster, a database server
58
+ * or a host — through that resource's AI agent (a ResourceAiAgent row).
59
+ *
60
+ * The resource-agnostic sibling of KubernetesClusterAiAccessService, and
61
+ * shaped like it: it answers, from CURRENT configuration, whether AI can
62
+ * run commands on a resource and what it may do there, and turns every
63
+ * reason it cannot into a row of a checklist with a next step. The same
64
+ * status feeds the AI runs (which only ever act on a resource this module
65
+ * calls ready), the investigation's prompt, and the resource's AI agent
66
+ * page.
67
+ *
68
+ * A resource is reached through exactly ONE target: its own resource AI
69
+ * agent. There are no Runners and no credentials here — the agent holds the
70
+ * resource's credentials itself and never receives one from OneUptime.
71
+ *
72
+ * The project-wide gates (AI on, a provider, a balance, auto-remediation)
73
+ * are the Kubernetes service's, read once per call and shared, so a project
74
+ * setting reads the same for a cluster and for every other resource.
75
+ */
76
+
77
+ export type ResourceAiAccessProjectGates =
78
+ KubernetesClusterAiAccessProjectGates;
79
+
80
+ // One resource a subject (an incident or an alert) is linked to.
81
+ export interface ResourceAiAccessRef {
82
+ resourceType: AiResourceType;
83
+ resourceId: string;
84
+ }
85
+
86
+ /*
87
+ * A resource row as the status computation reads it, whichever table it
88
+ * came from. Built by loadResource / loadResources, never by callers.
89
+ */
90
+ export interface ResourceAiAccessRow {
91
+ resourceType: AiResourceType;
92
+ id: ObjectID;
93
+ projectId: ObjectID;
94
+ // The name the dashboard shows (the row's name, else its identifier).
95
+ name: string;
96
+ /*
97
+ * The identity the resource's collector reports and its agent registers
98
+ * with (hostIdentifier, the cluster/vCenter name, the database endpoint).
99
+ */
100
+ identifier?: string | undefined;
101
+ isAiInvestigationEnabled: boolean;
102
+ aiRemediationMode: ResourceAiRemediationMode;
103
+ aiCommandAllowlist: Array<string>;
104
+ aiAccessConfiguredAt?: Date | undefined;
105
+ aiAccessLastVerifiedAt?: Date | undefined;
106
+ aiAccessLastError?: string | undefined;
107
+ isArchived: boolean;
108
+ }
109
+
110
+ /*
111
+ * The resource and the agent a command for it would go to right now: the
112
+ * resource's ONLINE agent (ResourceAiAgentService.findOnlineAgentForResource),
113
+ * or null when it has none. resource is null when the resource does not
114
+ * exist in the project.
115
+ */
116
+ export interface LoadedResourceAiAccessTarget {
117
+ resource: ResourceAiAccessRow | null;
118
+ agent: ResourceAiAgent | null;
119
+ }
120
+
121
+ // The most resources one incident or alert offers an investigation.
122
+ export const MAX_RESOURCES_PER_SUBJECT: number = 10;
123
+
124
+ /*
125
+ * How many of a subject's linked resources are read per query while
126
+ * looking for its unarchived ones (getResourcesForSubject): one read covers
127
+ * any ordinary subject, and a subject linked to many archived resources is
128
+ * read on in batches until the cap is reached.
129
+ */
130
+ const SUBJECT_RESOURCE_READ_BATCH_SIZE: number = MAX_RESOURCES_PER_SUBJECT * 5;
131
+
132
+ // The columns every resource model carries for AI access.
133
+ const AI_ACCESS_COLUMNS: Record<string, boolean> = {
134
+ _id: true,
135
+ projectId: true,
136
+ name: true,
137
+ isArchived: true,
138
+ isAiInvestigationEnabled: true,
139
+ aiRemediationMode: true,
140
+ aiCommandAllowlist: true,
141
+ aiAccessConfiguredAt: true,
142
+ aiAccessLastVerifiedAt: true,
143
+ aiAccessLastError: true,
144
+ };
145
+
146
+ type SubjectRelation =
147
+ | "dockerHosts"
148
+ | "podmanHosts"
149
+ | "dockerSwarmClusters"
150
+ | "proxmoxClusters"
151
+ | "vmwareVCenters"
152
+ | "cephClusters"
153
+ | "databaseServers"
154
+ | "hosts";
155
+
156
+ /*
157
+ * How each resource type is read: its table's service, the extra columns
158
+ * its identity lives in, the Incident/Alert relation that links it to a
159
+ * subject, and the list the monitor-step fallback fills for it.
160
+ */
161
+ interface ResourceAiAccessModelSpec {
162
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
163
+ service: DatabaseService<any>;
164
+ identityColumns: Record<string, boolean>;
165
+ subjectRelation: SubjectRelation;
166
+ resolvedIdsKey: keyof SeriesResolvedResourceIds;
167
+ }
168
+
169
+ const MODEL_SPECS: Readonly<Record<AiResourceType, ResourceAiAccessModelSpec>> =
170
+ {
171
+ [AiResourceType.DockerHost]: {
172
+ service: DockerHostService,
173
+ identityColumns: { hostIdentifier: true },
174
+ subjectRelation: "dockerHosts",
175
+ resolvedIdsKey: "dockerHostIds",
176
+ },
177
+ [AiResourceType.PodmanHost]: {
178
+ service: PodmanHostService,
179
+ identityColumns: { hostIdentifier: true },
180
+ subjectRelation: "podmanHosts",
181
+ resolvedIdsKey: "podmanHostIds",
182
+ },
183
+ [AiResourceType.DockerSwarmCluster]: {
184
+ service: DockerSwarmClusterService,
185
+ identityColumns: {},
186
+ subjectRelation: "dockerSwarmClusters",
187
+ resolvedIdsKey: "dockerSwarmClusterIds",
188
+ },
189
+ [AiResourceType.ProxmoxCluster]: {
190
+ service: ProxmoxClusterService,
191
+ identityColumns: {},
192
+ subjectRelation: "proxmoxClusters",
193
+ resolvedIdsKey: "proxmoxClusterIds",
194
+ },
195
+ [AiResourceType.VMwareVCenter]: {
196
+ service: VMwareVCenterService,
197
+ identityColumns: {},
198
+ subjectRelation: "vmwareVCenters",
199
+ resolvedIdsKey: "vmwareVCenterIds",
200
+ },
201
+ [AiResourceType.CephCluster]: {
202
+ service: CephClusterService,
203
+ identityColumns: {},
204
+ subjectRelation: "cephClusters",
205
+ resolvedIdsKey: "cephClusterIds",
206
+ },
207
+ [AiResourceType.DatabaseServer]: {
208
+ service: DatabaseServerService,
209
+ identityColumns: {
210
+ dbSystem: true,
211
+ serverAddress: true,
212
+ serverPort: true,
213
+ },
214
+ subjectRelation: "databaseServers",
215
+ resolvedIdsKey: "databaseServerIds",
216
+ },
217
+ [AiResourceType.Host]: {
218
+ service: HostService,
219
+ identityColumns: { hostIdentifier: true },
220
+ subjectRelation: "hosts",
221
+ resolvedIdsKey: "hostIds",
222
+ },
223
+ };
224
+
225
+ /*
226
+ * What an operator checks when the agent is online but cannot reach its
227
+ * resource: the one thing each agent needs besides the network.
228
+ */
229
+ const REACH_HINTS: Readonly<Record<AiResourceType, string>> = {
230
+ [AiResourceType.DockerHost]:
231
+ "that the Docker socket (/var/run/docker.sock) is mounted into the agent's container",
232
+ [AiResourceType.PodmanHost]:
233
+ "that the Podman socket (/run/podman/podman.sock) is mounted into the agent's container",
234
+ [AiResourceType.DockerSwarmCluster]:
235
+ "that the agent runs on a swarm MANAGER node with the Docker socket mounted",
236
+ [AiResourceType.ProxmoxCluster]: "PVE_HOST and the agent's Proxmox API token",
237
+ [AiResourceType.VMwareVCenter]:
238
+ "the vCenter URL and the credentials in the agent's environment",
239
+ [AiResourceType.CephCluster]:
240
+ "the Ceph config and keyring mounted into the agent's container",
241
+ [AiResourceType.DatabaseServer]:
242
+ "the database address and the read-only credentials in the agent's environment",
243
+ [AiResourceType.Host]:
244
+ "that the agent runs privileged with the host's PID namespace (pid: host)",
245
+ };
246
+
247
+ // "Docker host", but "host" and "database server" for the generic nouns.
248
+ export function describeResourceNoun(resourceType: AiResourceType): string {
249
+ if (resourceType === AiResourceType.Host) {
250
+ return "host";
251
+ }
252
+
253
+ if (resourceType === AiResourceType.DatabaseServer) {
254
+ return "database server";
255
+ }
256
+
257
+ return isAiResourceType(resourceType)
258
+ ? AI_RESOURCE_TYPE_INFO[resourceType].displayName
259
+ : "resource";
260
+ }
261
+
262
+ /*
263
+ * Where every next step sends an operator: the resource's AI agent page
264
+ * (AI → AI agent in its side menu). Shown verbatim in the investigation's
265
+ * report and panel, so it always names the page.
266
+ */
267
+ export function getResourceAiAgentPage(resourceType: AiResourceType): string {
268
+ return `the ${describeResourceNoun(resourceType)}'s AI agent page (AI → AI agent)`;
269
+ }
270
+
271
+ /*
272
+ * How to install the resource's agent, as one sentence: the image, the
273
+ * type, and the identity to register with — spelled with this resource's
274
+ * own identity when it is known, so the agent lands on THIS row.
275
+ */
276
+ export function getResourceAiAgentInstallNextStep(data: {
277
+ resourceType: AiResourceType;
278
+ resourceId?: string | undefined;
279
+ identifier?: string | undefined;
280
+ }): string {
281
+ const info: AiResourceTypeInfo = AI_RESOURCE_TYPE_INFO[data.resourceType];
282
+ const noun: string = describeResourceNoun(data.resourceType);
283
+ let identity: string;
284
+
285
+ if (data.resourceType === AiResourceType.DatabaseServer) {
286
+ identity = data.resourceId
287
+ ? ` and DATABASE_SERVER_ID=${data.resourceId}`
288
+ : " and DATABASE_SERVER_ID set to this database server's id";
289
+ } else {
290
+ const variable: string = info.identityEnvVars[0] || "the identity";
291
+ identity = data.identifier
292
+ ? ` and ${variable}=${data.identifier}`
293
+ : ` and ${variable} set to the name its collector reports`;
294
+ }
295
+
296
+ return `Install the ${info.agentDisplayName} next to this ${noun}'s telemetry collector: run the ${RESOURCE_AI_AGENT_IMAGE_REPOSITORY} image with ${RESOURCE_AI_AGENT_RESOURCE_TYPE_ENV}=${info.agentAlias}${identity}. The complete snippet is on ${getResourceAiAgentPage(
297
+ data.resourceType,
298
+ )}.`;
299
+ }
300
+
301
+ type DateLike = Date | string | null | undefined;
302
+
303
+ function toDate(value: DateLike): Date | null {
304
+ if (!value) {
305
+ return null;
306
+ }
307
+
308
+ const date: Date = value instanceof Date ? value : new Date(value);
309
+
310
+ return Number.isNaN(date.getTime()) ? null : date;
311
+ }
312
+
313
+ function toIsoString(value: DateLike): string | undefined {
314
+ const date: Date | null = toDate(value);
315
+
316
+ return date ? OneUptimeDate.toString(date) : undefined;
317
+ }
318
+
319
+ /*
320
+ * The allowlist column is jsonb; a client may save it as an array or as a
321
+ * JSON string. Anything unusable normalizes to empty — nothing risky
322
+ * auto-executes.
323
+ */
324
+ export function normalizeResourceAllowlist(value: unknown): Array<string> {
325
+ let raw: unknown = value;
326
+
327
+ if (typeof raw === "string") {
328
+ try {
329
+ raw = JSON.parse(raw);
330
+ } catch {
331
+ raw = [value];
332
+ }
333
+ }
334
+
335
+ if (!Array.isArray(raw)) {
336
+ return [];
337
+ }
338
+
339
+ return raw
340
+ .filter((pattern: unknown): pattern is string => {
341
+ return typeof pattern === "string" && pattern.trim().length > 0;
342
+ })
343
+ .map((pattern: string): string => {
344
+ return pattern.trim();
345
+ });
346
+ }
347
+
348
+ function refKey(resourceType: string, resourceId: string): string {
349
+ return `${resourceType}:${resourceId.toLowerCase()}`;
350
+ }
351
+
352
+ function readString(value: unknown): string | undefined {
353
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
354
+ }
355
+
356
+ export class ResourceAiAccessServiceClass {
357
+ /*
358
+ * ------------------------------------------------------------------
359
+ * Readiness
360
+ * ------------------------------------------------------------------
361
+ */
362
+
363
+ // The project-wide gates, read exactly as they are for clusters.
364
+ @CaptureSpan()
365
+ public async getProjectGates(
366
+ projectId: ObjectID,
367
+ ): Promise<ResourceAiAccessProjectGates> {
368
+ return await KubernetesClusterAiAccessService.getProjectGates(projectId);
369
+ }
370
+
371
+ @CaptureSpan()
372
+ public async getStatusForResource(data: {
373
+ projectId: ObjectID;
374
+ resourceType: AiResourceType;
375
+ resourceId: ObjectID;
376
+ gates?: ResourceAiAccessProjectGates | undefined;
377
+ }): Promise<ResourceAiAccessStatus | null> {
378
+ const statuses: Array<ResourceAiAccessStatus> =
379
+ await this.getStatusesForResources({
380
+ projectId: data.projectId,
381
+ resources: [
382
+ {
383
+ resourceType: data.resourceType,
384
+ resourceId: data.resourceId.toString(),
385
+ },
386
+ ],
387
+ gates: data.gates,
388
+ });
389
+
390
+ return statuses[0] || null;
391
+ }
392
+
393
+ /*
394
+ * The status of several resources of one project, in the order asked
395
+ * for, with every resource's agent row read in ONE query. A resource
396
+ * that does not exist in the project (or, with excludeArchived, is
397
+ * archived) has no status. When the agent read fails every status reads
398
+ * as having no agent, which can only make it say less is reachable.
399
+ */
400
+ @CaptureSpan()
401
+ public async getStatusesForResources(data: {
402
+ projectId: ObjectID;
403
+ resources: Array<ResourceAiAccessRef>;
404
+ gates?: ResourceAiAccessProjectGates | undefined;
405
+ excludeArchived?: boolean | undefined;
406
+ }): Promise<Array<ResourceAiAccessStatus>> {
407
+ const rows: Array<ResourceAiAccessRow> = await this.loadResources({
408
+ projectId: data.projectId,
409
+ resources: data.resources,
410
+ excludeArchived: data.excludeArchived,
411
+ });
412
+
413
+ if (rows.length === 0) {
414
+ return [];
415
+ }
416
+
417
+ const gates: ResourceAiAccessProjectGates =
418
+ data.gates || (await this.getProjectGates(data.projectId));
419
+
420
+ let agentRows: Map<string, ResourceAiAgent> = new Map<
421
+ string,
422
+ ResourceAiAgent
423
+ >();
424
+
425
+ try {
426
+ agentRows = await this.findAgentRows({
427
+ projectId: data.projectId,
428
+ resources: rows,
429
+ });
430
+ } catch (error) {
431
+ logger.error(
432
+ `ResourceAiAccess: could not read the resource AI agents of project ${data.projectId.toString()}; every resource reads as having none: ${error}`,
433
+ );
434
+ }
435
+
436
+ return rows.map((row: ResourceAiAccessRow): ResourceAiAccessStatus => {
437
+ return this.buildStatus({
438
+ resource: row,
439
+ agentRow:
440
+ agentRows.get(refKey(row.resourceType, row.id.toString())) || null,
441
+ gates,
442
+ });
443
+ });
444
+ }
445
+
446
+ /*
447
+ * The readiness computation proper, for one resource row, its agent row
448
+ * (online or not; null when none ever registered) and the project gates.
449
+ * Pure: every read was done by the caller.
450
+ */
451
+ public buildStatus(data: {
452
+ resource: ResourceAiAccessRow;
453
+ agentRow: ResourceAiAgent | null;
454
+ gates: ResourceAiAccessProjectGates;
455
+ now?: Date | undefined;
456
+ }): ResourceAiAccessStatus {
457
+ const { resource, agentRow, gates } = data;
458
+ const type: AiResourceType = resource.resourceType;
459
+ const info: AiResourceTypeInfo = AI_RESOURCE_TYPE_INFO[type];
460
+ const noun: string = describeResourceNoun(type);
461
+ const page: string = getResourceAiAgentPage(type);
462
+ const gaps: Array<ResourceAiAccessGap> = [];
463
+
464
+ /*
465
+ * The agent as ResourceAiAgentService sees it: one online rule for the
466
+ * status and for the chokepoint (findOnlineAgentForResource).
467
+ */
468
+ const agent: ResourceAiAgentSummary | null = agentRow
469
+ ? ResourceAiAgentService.getAgentSummary(agentRow, data.now)
470
+ : null;
471
+ const posture: ResourceAiAgentPosture | null = agent?.posture || null;
472
+ const remediationMode: ResourceAiRemediationMode =
473
+ resource.aiRemediationMode;
474
+
475
+ if (!agent) {
476
+ gaps.push({
477
+ code: "ai_agent_not_connected",
478
+ title: `No ${info.agentDisplayName} is connected`,
479
+ nextStep: getResourceAiAgentInstallNextStep({
480
+ resourceType: type,
481
+ resourceId: resource.id.toString(),
482
+ identifier: resource.identifier,
483
+ }),
484
+ blocksInvestigation: true,
485
+ blocksRemediation: true,
486
+ });
487
+ } else if (!agent.isOnline) {
488
+ const lastAliveAt: Date | null = toDate(agentRow?.lastAliveAt);
489
+ const lastAliveText: string = lastAliveAt
490
+ ? OneUptimeDate.getDateAsFormattedString(lastAliveAt)
491
+ : "an unknown time";
492
+
493
+ gaps.push({
494
+ code: "ai_agent_offline",
495
+ title: `The ${info.agentDisplayName} is offline`,
496
+ nextStep: `It last reported in at ${lastAliveText}${
497
+ agent.connectionStatus === "disconnected"
498
+ ? " and then signed off (it was stopped, restarted or reset)"
499
+ : ""
500
+ }. Check that its container is running and can reach your OneUptime URL (its logs say why it cannot).`,
501
+ blocksInvestigation: true,
502
+ blocksRemediation: true,
503
+ });
504
+ } else if (!posture || posture.resourceType !== type) {
505
+ /*
506
+ * The agent always reports a posture for the type it serves; one
507
+ * that is missing, unreadable or for another type is not trusted
508
+ * with commands (the enqueue chokepoint refuses the same case).
509
+ */
510
+ gaps.push({
511
+ code: "ai_agent_unreachable_resource",
512
+ title: `The ${info.agentDisplayName} has not reported that it can reach this ${noun}`,
513
+ nextStep: `Wait for its next report (within a minute), or reset the agent on ${page}.`,
514
+ blocksInvestigation: true,
515
+ blocksRemediation: true,
516
+ });
517
+ } else if (posture.reachable !== true) {
518
+ gaps.push({
519
+ code: "ai_agent_unreachable_resource",
520
+ title: `The ${info.agentDisplayName} cannot reach this ${noun}`,
521
+ nextStep: `Its last check failed${
522
+ posture.reachError ? `: ${posture.reachError}` : ""
523
+ }. Check ${REACH_HINTS[type]}, then use "Test connection" on ${page}.`,
524
+ blocksInvestigation: true,
525
+ blocksRemediation: true,
526
+ });
527
+ }
528
+
529
+ if (!resource.isAiInvestigationEnabled) {
530
+ gaps.push({
531
+ code: "investigation_disabled",
532
+ title: `AI investigation is turned off for this ${noun}`,
533
+ nextStep: `Turn on AI investigation on ${page}.`,
534
+ blocksInvestigation: true,
535
+ blocksRemediation: false,
536
+ });
537
+ }
538
+
539
+ if (remediationMode === ResourceAiRemediationMode.Disabled) {
540
+ gaps.push({
541
+ code: "remediation_disabled",
542
+ title: `AI fixes are turned off for this ${noun}`,
543
+ nextStep: `Set "Fixes" to "Ask for approval", "Automatic" or "Bypass approval" on ${page}.`,
544
+ blocksInvestigation: false,
545
+ blocksRemediation: true,
546
+ });
547
+ } else if (agent && posture?.allowWrites !== true) {
548
+ gaps.push({
549
+ code: "remediation_write_access_missing",
550
+ title: `The ${info.agentDisplayName} is read-only`,
551
+ nextStep: `Set ${RESOURCE_AI_ALLOW_WRITES_ENV}=true on the ${info.agentDisplayName} and restart it (${RESOURCE_AI_WRITE_TARGETS_ENV} limits what it may change).`,
552
+ blocksInvestigation: false,
553
+ blocksRemediation: true,
554
+ });
555
+ }
556
+
557
+ if (!gates.isAiEnabled) {
558
+ gaps.push({
559
+ code: "ai_disabled_for_project",
560
+ title: "AI is disabled for this project",
561
+ nextStep: "Enable AI under Project Settings → AI Features.",
562
+ blocksInvestigation: true,
563
+ blocksRemediation: true,
564
+ });
565
+ }
566
+
567
+ if (!gates.hasLlmProvider) {
568
+ gaps.push({
569
+ code: "llm_provider_missing",
570
+ title: "No AI provider is configured",
571
+ nextStep:
572
+ "Add a provider under Project Settings → AI → LLM Providers (or use OneUptime AI credits).",
573
+ blocksInvestigation: true,
574
+ blocksRemediation: true,
575
+ });
576
+ }
577
+
578
+ if (gates.aiBalanceBlocker) {
579
+ gaps.push({
580
+ code: "ai_balance_insufficient",
581
+ title: "The project is out of AI credits",
582
+ nextStep: AI_BALANCE_INSUFFICIENT_NEXT_STEP,
583
+ blocksInvestigation: true,
584
+ blocksRemediation: true,
585
+ });
586
+ }
587
+
588
+ if (!gates.isAutoRemediationEnabled) {
589
+ gaps.push({
590
+ code: "auto_remediation_disabled_for_project",
591
+ title: "Auto-remediation is disabled for this project",
592
+ nextStep:
593
+ "Enable auto-remediation under Project Settings → AI Features.",
594
+ blocksInvestigation: false,
595
+ blocksRemediation: true,
596
+ });
597
+ }
598
+
599
+ const blocksInvestigation: boolean = gaps.some(
600
+ (gap: ResourceAiAccessGap): boolean => {
601
+ return gap.blocksInvestigation;
602
+ },
603
+ );
604
+ const blocksRemediation: boolean = gaps.some(
605
+ (gap: ResourceAiAccessGap): boolean => {
606
+ return gap.blocksRemediation;
607
+ },
608
+ );
609
+
610
+ return {
611
+ resourceType: type,
612
+ resourceId: resource.id.toString(),
613
+ resourceName: resource.name,
614
+ isAiInvestigationEnabled: resource.isAiInvestigationEnabled,
615
+ aiRemediationMode: remediationMode,
616
+ aiCommandAllowlist: resource.aiCommandAllowlist,
617
+ aiAccessConfiguredAt: toIsoString(resource.aiAccessConfiguredAt) || null,
618
+ aiAccessLastVerifiedAt:
619
+ toIsoString(resource.aiAccessLastVerifiedAt) || null,
620
+ aiAccessLastError: resource.aiAccessLastError || null,
621
+ agent,
622
+ gaps,
623
+ isInvestigationReady:
624
+ resource.isAiInvestigationEnabled && !blocksInvestigation,
625
+ isRemediationReady:
626
+ remediationMode !== ResourceAiRemediationMode.Disabled &&
627
+ !blocksRemediation,
628
+ };
629
+ }
630
+
631
+ /*
632
+ * ------------------------------------------------------------------
633
+ * Rows
634
+ * ------------------------------------------------------------------
635
+ */
636
+
637
+ /*
638
+ * One resource of the project (as root: the caller scopes by project),
639
+ * or null when it is not the project's. Lookup failures propagate: the
640
+ * enqueue chokepoint must fail closed on a resource it could not read.
641
+ */
642
+ @CaptureSpan()
643
+ public async loadResource(data: {
644
+ projectId: ObjectID;
645
+ resourceType: AiResourceType;
646
+ resourceId: ObjectID;
647
+ }): Promise<ResourceAiAccessRow | null> {
648
+ if (!isAiResourceType(data.resourceType)) {
649
+ return null;
650
+ }
651
+
652
+ const rows: Array<ResourceAiAccessRow> = await this.loadResources({
653
+ projectId: data.projectId,
654
+ resources: [
655
+ {
656
+ resourceType: data.resourceType,
657
+ resourceId: data.resourceId.toString(),
658
+ },
659
+ ],
660
+ });
661
+
662
+ return rows[0] || null;
663
+ }
664
+
665
+ /*
666
+ * Several resources of one project, one query per resource type, in the
667
+ * order asked for (duplicates and unknown types dropped).
668
+ */
669
+ @CaptureSpan()
670
+ public async loadResources(data: {
671
+ projectId: ObjectID;
672
+ resources: Array<ResourceAiAccessRef>;
673
+ excludeArchived?: boolean | undefined;
674
+ }): Promise<Array<ResourceAiAccessRow>> {
675
+ const wanted: Array<ResourceAiAccessRef> = [];
676
+ const seen: Set<string> = new Set<string>();
677
+
678
+ for (const ref of data.resources) {
679
+ if (
680
+ !ref ||
681
+ !isAiResourceType(ref.resourceType) ||
682
+ typeof ref.resourceId !== "string" ||
683
+ !ObjectID.isValidUUID(ref.resourceId)
684
+ ) {
685
+ continue;
686
+ }
687
+
688
+ const key: string = refKey(ref.resourceType, ref.resourceId);
689
+
690
+ if (seen.has(key)) {
691
+ continue;
692
+ }
693
+
694
+ seen.add(key);
695
+ wanted.push(ref);
696
+ }
697
+
698
+ const byKey: Map<string, ResourceAiAccessRow> = new Map<
699
+ string,
700
+ ResourceAiAccessRow
701
+ >();
702
+
703
+ for (const type of ALL_AI_RESOURCE_TYPES) {
704
+ const ids: Array<string> = wanted
705
+ .filter((ref: ResourceAiAccessRef): boolean => {
706
+ return ref.resourceType === type;
707
+ })
708
+ .map((ref: ResourceAiAccessRef): string => {
709
+ return ref.resourceId;
710
+ });
711
+
712
+ if (ids.length === 0) {
713
+ continue;
714
+ }
715
+
716
+ const spec: ResourceAiAccessModelSpec = MODEL_SPECS[type];
717
+
718
+ const models: Array<Record<string, unknown>> = (await spec.service.findBy(
719
+ {
720
+ query: {
721
+ projectId: data.projectId,
722
+ _id: QueryHelper.any(
723
+ ids.map((id: string): ObjectID => {
724
+ return new ObjectID(id);
725
+ }),
726
+ ),
727
+ ...(data.excludeArchived ? { isArchived: false } : {}),
728
+ },
729
+ select: { ...AI_ACCESS_COLUMNS, ...spec.identityColumns },
730
+ limit: ids.length,
731
+ skip: 0,
732
+ props: { isRoot: true },
733
+ },
734
+ )) as unknown as Array<Record<string, unknown>>;
735
+
736
+ for (const model of models) {
737
+ const row: ResourceAiAccessRow | null = this.toRow(type, model, data);
738
+
739
+ if (row) {
740
+ byKey.set(refKey(type, row.id.toString()), row);
741
+ }
742
+ }
743
+ }
744
+
745
+ const rows: Array<ResourceAiAccessRow> = [];
746
+
747
+ for (const ref of wanted) {
748
+ const row: ResourceAiAccessRow | undefined = byKey.get(
749
+ refKey(ref.resourceType, ref.resourceId),
750
+ );
751
+
752
+ if (row) {
753
+ rows.push(row);
754
+ }
755
+ }
756
+
757
+ return rows;
758
+ }
759
+
760
+ // A resource model read through its service, as the status reads it.
761
+ public toRow(
762
+ resourceType: AiResourceType,
763
+ model: Record<string, unknown>,
764
+ scope: { projectId: ObjectID; excludeArchived?: boolean | undefined },
765
+ ): ResourceAiAccessRow | null {
766
+ const idValue: unknown = model["_id"] || model["id"];
767
+ const id: string | undefined =
768
+ idValue instanceof ObjectID
769
+ ? idValue.toString()
770
+ : readString(idValue as string);
771
+
772
+ if (!id || !ObjectID.isValidUUID(id)) {
773
+ return null;
774
+ }
775
+
776
+ const projectIdValue: unknown = model["projectId"];
777
+ const projectId: string | undefined =
778
+ projectIdValue instanceof ObjectID
779
+ ? projectIdValue.toString()
780
+ : readString(projectIdValue as string);
781
+
782
+ // The query was project-scoped; a row that says otherwise is not used.
783
+ if (projectId && projectId !== scope.projectId.toString()) {
784
+ return null;
785
+ }
786
+
787
+ const isArchived: boolean = model["isArchived"] === true;
788
+
789
+ if (scope.excludeArchived && isArchived) {
790
+ return null;
791
+ }
792
+
793
+ const identifier: string | undefined = this.readIdentifier(
794
+ resourceType,
795
+ model,
796
+ );
797
+
798
+ return {
799
+ resourceType,
800
+ id: new ObjectID(id),
801
+ projectId: scope.projectId,
802
+ name:
803
+ readString(model["name"]) ||
804
+ identifier ||
805
+ AI_RESOURCE_TYPE_INFO[resourceType].displayName,
806
+ identifier,
807
+ isAiInvestigationEnabled: model["isAiInvestigationEnabled"] === true,
808
+ aiRemediationMode: parseResourceAiRemediationMode(
809
+ model["aiRemediationMode"],
810
+ ),
811
+ aiCommandAllowlist: normalizeResourceAllowlist(
812
+ model["aiCommandAllowlist"],
813
+ ),
814
+ aiAccessConfiguredAt:
815
+ toDate(model["aiAccessConfiguredAt"] as DateLike) || undefined,
816
+ aiAccessLastVerifiedAt:
817
+ toDate(model["aiAccessLastVerifiedAt"] as DateLike) || undefined,
818
+ aiAccessLastError: readString(model["aiAccessLastError"]),
819
+ isArchived,
820
+ };
821
+ }
822
+
823
+ /*
824
+ * The identity the resource's collector reports: hostIdentifier for
825
+ * hosts, the name for clusters and vCenters, and system|host:port for a
826
+ * database server.
827
+ */
828
+ private readIdentifier(
829
+ resourceType: AiResourceType,
830
+ model: Record<string, unknown>,
831
+ ): string | undefined {
832
+ if (
833
+ resourceType === AiResourceType.DockerHost ||
834
+ resourceType === AiResourceType.PodmanHost ||
835
+ resourceType === AiResourceType.Host
836
+ ) {
837
+ return readString(model["hostIdentifier"]);
838
+ }
839
+
840
+ if (resourceType === AiResourceType.DatabaseServer) {
841
+ const address: string | undefined = readString(model["serverAddress"]);
842
+
843
+ if (!address) {
844
+ return undefined;
845
+ }
846
+
847
+ const port: unknown = model["serverPort"];
848
+ const system: string | undefined = readString(model["dbSystem"]);
849
+
850
+ return `${system ? `${system}|` : ""}${address}${
851
+ typeof port === "number" && Number.isFinite(port) ? `:${port}` : ""
852
+ }`;
853
+ }
854
+
855
+ return readString(model["name"]);
856
+ }
857
+
858
+ /*
859
+ * The agent rows of these resources (online or not), keyed by
860
+ * type:resourceId — one query per resource type present
861
+ * (ResourceAiAgentService.findAgentsForResources). Never reads the key
862
+ * hash.
863
+ */
864
+ @CaptureSpan()
865
+ public async findAgentRows(data: {
866
+ projectId: ObjectID;
867
+ resources: Array<Pick<ResourceAiAccessRow, "resourceType" | "id">>;
868
+ }): Promise<Map<string, ResourceAiAgent>> {
869
+ const byKey: Map<string, ResourceAiAgent> = new Map<
870
+ string,
871
+ ResourceAiAgent
872
+ >();
873
+
874
+ for (const type of ALL_AI_RESOURCE_TYPES) {
875
+ const ids: Array<ObjectID> = data.resources
876
+ .filter(
877
+ (
878
+ resource: Pick<ResourceAiAccessRow, "resourceType" | "id">,
879
+ ): boolean => {
880
+ return resource.resourceType === type;
881
+ },
882
+ )
883
+ .map(
884
+ (
885
+ resource: Pick<ResourceAiAccessRow, "resourceType" | "id">,
886
+ ): ObjectID => {
887
+ return resource.id;
888
+ },
889
+ );
890
+
891
+ if (ids.length === 0) {
892
+ continue;
893
+ }
894
+
895
+ const rows: Map<string, ResourceAiAgent> =
896
+ await ResourceAiAgentService.findAgentsForResources({
897
+ projectId: data.projectId,
898
+ resourceType: type,
899
+ resourceIds: ids,
900
+ });
901
+
902
+ for (const [resourceId, row] of rows) {
903
+ byKey.set(refKey(type, resourceId), row);
904
+ }
905
+ }
906
+
907
+ return byKey;
908
+ }
909
+
910
+ /*
911
+ * ------------------------------------------------------------------
912
+ * The access target
913
+ * ------------------------------------------------------------------
914
+ */
915
+
916
+ /*
917
+ * The resource and the agent a command for it goes to NOW: its online
918
+ * agent, or null. Lookup failures propagate: the enqueue chokepoint must
919
+ * fail closed on a target it could not check.
920
+ */
921
+ @CaptureSpan()
922
+ public async loadAccessTarget(data: {
923
+ projectId: ObjectID;
924
+ resourceType: AiResourceType;
925
+ resourceId: ObjectID;
926
+ }): Promise<LoadedResourceAiAccessTarget> {
927
+ const resource: ResourceAiAccessRow | null = await this.loadResource(data);
928
+
929
+ if (!resource) {
930
+ return { resource: null, agent: null };
931
+ }
932
+
933
+ const agent: ResourceAiAgent | null =
934
+ await ResourceAiAgentService.findOnlineAgentForResource({
935
+ projectId: data.projectId,
936
+ resourceType: resource.resourceType,
937
+ resourceId: resource.id,
938
+ });
939
+
940
+ return { resource, agent: agent || null };
941
+ }
942
+
943
+ /*
944
+ * ------------------------------------------------------------------
945
+ * Subjects
946
+ * ------------------------------------------------------------------
947
+ */
948
+
949
+ /*
950
+ * The unarchived resources of the project an incident or alert is linked
951
+ * to, in the order ALL_AI_RESOURCE_TYPES lists the types, at most
952
+ * MAX_RESOURCES_PER_SUBJECT. Linked means the subject's resource
953
+ * relations (written when it was created, from its series labels and its
954
+ * monitors' configuration); when none of those is an unarchived resource
955
+ * of the project, the subject's monitors' step configuration is resolved
956
+ * again now (the resource may have appeared after the subject was
957
+ * created, or replaced an archived one), matching names
958
+ * case-insensitively like the linker does.
959
+ *
960
+ * Archived and missing resources are dropped BEFORE the cap: capping
961
+ * first would let ten archived links hide an active one behind them.
962
+ */
963
+ @CaptureSpan()
964
+ public async getResourcesForSubject(data: {
965
+ projectId: ObjectID;
966
+ incidentId?: ObjectID | undefined;
967
+ alertId?: ObjectID | undefined;
968
+ }): Promise<Array<ResourceAiAccessRef>> {
969
+ const linked: Map<AiResourceType, Array<string>> = new Map<
970
+ AiResourceType,
971
+ Array<string>
972
+ >();
973
+ const monitorIds: Array<ObjectID> = [];
974
+
975
+ if (data.alertId || data.incidentId) {
976
+ const relations: Array<{
977
+ type: AiResourceType;
978
+ ids: Array<string>;
979
+ }> = await Promise.all(
980
+ ALL_AI_RESOURCE_TYPES.map(
981
+ async (
982
+ type: AiResourceType,
983
+ ): Promise<{ type: AiResourceType; ids: Array<string> }> => {
984
+ return {
985
+ type,
986
+ ids: await this.readSubjectRelation({
987
+ projectId: data.projectId,
988
+ incidentId: data.incidentId,
989
+ alertId: data.alertId,
990
+ relation: MODEL_SPECS[type].subjectRelation,
991
+ }),
992
+ };
993
+ },
994
+ ),
995
+ );
996
+
997
+ for (const relation of relations) {
998
+ linked.set(relation.type, relation.ids);
999
+ }
1000
+
1001
+ monitorIds.push(
1002
+ ...(await this.readSubjectMonitorIds({
1003
+ projectId: data.projectId,
1004
+ incidentId: data.incidentId,
1005
+ alertId: data.alertId,
1006
+ })),
1007
+ );
1008
+ }
1009
+
1010
+ let refs: Array<ResourceAiAccessRef> = await this.keepUnarchivedRefs({
1011
+ projectId: data.projectId,
1012
+ refs: this.flattenRefs(linked),
1013
+ });
1014
+
1015
+ if (refs.length === 0 && monitorIds.length > 0) {
1016
+ refs = await this.keepUnarchivedRefs({
1017
+ projectId: data.projectId,
1018
+ refs: this.flattenRefs(
1019
+ await this.resolveMonitorResources({
1020
+ projectId: data.projectId,
1021
+ monitorIds,
1022
+ }),
1023
+ ),
1024
+ });
1025
+ }
1026
+
1027
+ return refs;
1028
+ }
1029
+
1030
+ /*
1031
+ * The first MAX_RESOURCES_PER_SUBJECT of these refs (in their order) that
1032
+ * are unarchived resources of the project, read in batches so a long
1033
+ * list of archived links costs a few reads, not one per link.
1034
+ */
1035
+ private async keepUnarchivedRefs(data: {
1036
+ projectId: ObjectID;
1037
+ refs: Array<ResourceAiAccessRef>;
1038
+ }): Promise<Array<ResourceAiAccessRef>> {
1039
+ const kept: Array<ResourceAiAccessRef> = [];
1040
+
1041
+ for (
1042
+ let start: number = 0;
1043
+ start < data.refs.length && kept.length < MAX_RESOURCES_PER_SUBJECT;
1044
+ start += SUBJECT_RESOURCE_READ_BATCH_SIZE
1045
+ ) {
1046
+ const rows: Array<ResourceAiAccessRow> = await this.loadResources({
1047
+ projectId: data.projectId,
1048
+ resources: data.refs.slice(
1049
+ start,
1050
+ start + SUBJECT_RESOURCE_READ_BATCH_SIZE,
1051
+ ),
1052
+ excludeArchived: true,
1053
+ });
1054
+
1055
+ for (const row of rows) {
1056
+ kept.push({
1057
+ resourceType: row.resourceType,
1058
+ resourceId: row.id.toString(),
1059
+ });
1060
+ }
1061
+ }
1062
+
1063
+ return kept.slice(0, MAX_RESOURCES_PER_SUBJECT);
1064
+ }
1065
+
1066
+ @CaptureSpan()
1067
+ public async getStatusesForSubject(data: {
1068
+ projectId: ObjectID;
1069
+ incidentId?: ObjectID | undefined;
1070
+ alertId?: ObjectID | undefined;
1071
+ }): Promise<Array<ResourceAiAccessStatus>> {
1072
+ const refs: Array<ResourceAiAccessRef> =
1073
+ await this.getResourcesForSubject(data);
1074
+
1075
+ if (refs.length === 0) {
1076
+ return [];
1077
+ }
1078
+
1079
+ return await this.getStatusesForResources({
1080
+ projectId: data.projectId,
1081
+ resources: refs,
1082
+ excludeArchived: true,
1083
+ });
1084
+ }
1085
+
1086
+ // Types in priority order, each type's ids in relation order, deduped.
1087
+ private flattenRefs(
1088
+ byType: Map<AiResourceType, Array<string>>,
1089
+ ): Array<ResourceAiAccessRef> {
1090
+ const refs: Array<ResourceAiAccessRef> = [];
1091
+ const seen: Set<string> = new Set<string>();
1092
+
1093
+ for (const type of ALL_AI_RESOURCE_TYPES) {
1094
+ for (const id of byType.get(type) || []) {
1095
+ const key: string = refKey(type, id);
1096
+
1097
+ if (!ObjectID.isValidUUID(id) || seen.has(key)) {
1098
+ continue;
1099
+ }
1100
+
1101
+ seen.add(key);
1102
+ refs.push({ resourceType: type, resourceId: id });
1103
+ }
1104
+ }
1105
+
1106
+ return refs;
1107
+ }
1108
+
1109
+ /*
1110
+ * One of the subject's resource relations, read on its own: reading all
1111
+ * eight many-to-many relations in one query would multiply their rows.
1112
+ */
1113
+ private async readSubjectRelation(data: {
1114
+ projectId: ObjectID;
1115
+ incidentId?: ObjectID | undefined;
1116
+ alertId?: ObjectID | undefined;
1117
+ relation: SubjectRelation;
1118
+ }): Promise<Array<string>> {
1119
+ const select: Record<string, unknown> = {
1120
+ _id: true,
1121
+ [data.relation]: { _id: true },
1122
+ };
1123
+
1124
+ let linked: Array<{ id?: ObjectID | null | undefined }> = [];
1125
+
1126
+ if (data.alertId) {
1127
+ const alert: Alert | null = await AlertService.findOneBy({
1128
+ query: { _id: data.alertId.toString(), projectId: data.projectId },
1129
+ select: select as never,
1130
+ props: { isRoot: true },
1131
+ });
1132
+
1133
+ linked = ((alert as unknown as Record<string, unknown> | null)?.[
1134
+ data.relation
1135
+ ] || []) as Array<{ id?: ObjectID | null | undefined }>;
1136
+ } else if (data.incidentId) {
1137
+ const incident: Incident | null = await IncidentService.findOneBy({
1138
+ query: { _id: data.incidentId.toString(), projectId: data.projectId },
1139
+ select: select as never,
1140
+ props: { isRoot: true },
1141
+ });
1142
+
1143
+ linked = ((incident as unknown as Record<string, unknown> | null)?.[
1144
+ data.relation
1145
+ ] || []) as Array<{ id?: ObjectID | null | undefined }>;
1146
+ }
1147
+
1148
+ const ids: Array<string> = [];
1149
+
1150
+ for (const resource of Array.isArray(linked) ? linked : []) {
1151
+ const id: string | undefined = resource?.id?.toString();
1152
+
1153
+ if (id) {
1154
+ ids.push(id);
1155
+ }
1156
+ }
1157
+
1158
+ return ids;
1159
+ }
1160
+
1161
+ private async readSubjectMonitorIds(data: {
1162
+ projectId: ObjectID;
1163
+ incidentId?: ObjectID | undefined;
1164
+ alertId?: ObjectID | undefined;
1165
+ }): Promise<Array<ObjectID>> {
1166
+ if (data.alertId) {
1167
+ const alert: Alert | null = await AlertService.findOneBy({
1168
+ query: { _id: data.alertId.toString(), projectId: data.projectId },
1169
+ select: { _id: true, monitorId: true },
1170
+ props: { isRoot: true },
1171
+ });
1172
+
1173
+ return alert?.monitorId ? [alert.monitorId] : [];
1174
+ }
1175
+
1176
+ if (data.incidentId) {
1177
+ const incident: Incident | null = await IncidentService.findOneBy({
1178
+ query: { _id: data.incidentId.toString(), projectId: data.projectId },
1179
+ select: { _id: true, monitors: { _id: true } },
1180
+ props: { isRoot: true },
1181
+ });
1182
+
1183
+ return (incident?.monitors || [])
1184
+ .map((monitor: Monitor): ObjectID | undefined => {
1185
+ return monitor.id || undefined;
1186
+ })
1187
+ .filter((id: ObjectID | undefined): id is ObjectID => {
1188
+ return Boolean(id);
1189
+ });
1190
+ }
1191
+
1192
+ return [];
1193
+ }
1194
+
1195
+ /*
1196
+ * What the subject's monitors' step configuration names now, resolved
1197
+ * the way the incident/alert creation path resolves it
1198
+ * (MonitorResourceContext: MonitorStepResourceIdentity, then
1199
+ * SeriesResourceLinker.resolveResourceRefs with case-insensitive
1200
+ * names). Best effort per monitor: that resolution never throws.
1201
+ */
1202
+ private async resolveMonitorResources(data: {
1203
+ projectId: ObjectID;
1204
+ monitorIds: Array<ObjectID>;
1205
+ }): Promise<Map<AiResourceType, Array<string>>> {
1206
+ const byType: Map<AiResourceType, Array<string>> = new Map<
1207
+ AiResourceType,
1208
+ Array<string>
1209
+ >();
1210
+
1211
+ const monitors: Array<Monitor> = await MonitorService.findBy({
1212
+ query: {
1213
+ _id: QueryHelper.any(
1214
+ data.monitorIds.slice(0, MAX_RESOURCES_PER_SUBJECT),
1215
+ ),
1216
+ projectId: data.projectId,
1217
+ },
1218
+ select: {
1219
+ _id: true,
1220
+ projectId: true,
1221
+ monitorType: true,
1222
+ monitorSteps: true,
1223
+ },
1224
+ limit: MAX_RESOURCES_PER_SUBJECT,
1225
+ skip: 0,
1226
+ props: { isRoot: true },
1227
+ });
1228
+
1229
+ for (const monitor of monitors) {
1230
+ const resolved: SeriesResolvedResourceIds =
1231
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
1232
+ monitor,
1233
+ });
1234
+
1235
+ for (const type of ALL_AI_RESOURCE_TYPES) {
1236
+ const ids: Array<string> =
1237
+ (resolved[MODEL_SPECS[type].resolvedIdsKey] as
1238
+ | Array<string>
1239
+ | undefined) || [];
1240
+
1241
+ if (ids.length > 0) {
1242
+ byType.set(type, [...(byType.get(type) || []), ...ids]);
1243
+ }
1244
+ }
1245
+ }
1246
+
1247
+ return byType;
1248
+ }
1249
+
1250
+ /*
1251
+ * ------------------------------------------------------------------
1252
+ * Who may change a resource
1253
+ * ------------------------------------------------------------------
1254
+ */
1255
+
1256
+ /*
1257
+ * Throws unless the caller may EDIT this resource: its update ACL, with
1258
+ * label-scoped allow and block rows decided from the row's own labels,
1259
+ * and the caller's Owned scope — exactly what a CRUD update of the row
1260
+ * would check. Approving an AI plan runs its commands on the resource as
1261
+ * root, so being allowed to start runbooks in the project is not enough
1262
+ * on its own: someone blocked from editing (or reading) a resource must
1263
+ * not be able to change it by approving a plan. Root and master admins
1264
+ * are not gated. A resource that does not exist in the project is
1265
+ * refused like one the caller may not edit.
1266
+ */
1267
+ @CaptureSpan()
1268
+ public async assertCallerMayChangeResource(data: {
1269
+ props: DatabaseCommonInteractionProps;
1270
+ projectId: ObjectID;
1271
+ resourceType: AiResourceType;
1272
+ resourceId: ObjectID;
1273
+ }): Promise<void> {
1274
+ if (data.props.isRoot || data.props.isMasterAdmin) {
1275
+ return;
1276
+ }
1277
+
1278
+ if (!isAiResourceType(data.resourceType)) {
1279
+ throw new BadDataException(
1280
+ `"${String(data.resourceType)}" is not a resource type.`,
1281
+ );
1282
+ }
1283
+
1284
+ const noun: string = describeResourceNoun(data.resourceType);
1285
+ const refusal: string = `You do not have permission to edit this ${noun}, so you cannot approve an AI plan that changes it. Ask someone who may edit the ${noun} to approve it, or dismiss the suggestion.`;
1286
+
1287
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1288
+ const service: DatabaseService<any> =
1289
+ MODEL_SPECS[data.resourceType].service;
1290
+
1291
+ const query: Record<string, unknown> = {
1292
+ _id: data.resourceId.toString(),
1293
+ projectId: data.projectId,
1294
+ };
1295
+
1296
+ /*
1297
+ * The caller's permissions are read for the resource's own project —
1298
+ * the permission layer reads the rows of props.tenantId.
1299
+ */
1300
+ const callerProps: DatabaseCommonInteractionProps = {
1301
+ ...data.props,
1302
+ tenantId: data.projectId,
1303
+ isMultiTenantRequest: false,
1304
+ };
1305
+
1306
+ /*
1307
+ * The row's labels, read as root: label-scoped allow and block rows are
1308
+ * decided per row, from them (DatabaseService.updateOneById's read).
1309
+ */
1310
+ const select: Select<BaseModel> = { _id: true };
1311
+ const accessControlColumn: string | null = service
1312
+ .getModel()
1313
+ .getAccessControlColumn();
1314
+
1315
+ if (accessControlColumn) {
1316
+ (select as Record<string, unknown>)[accessControlColumn] = {
1317
+ _id: true,
1318
+ name: true,
1319
+ };
1320
+ }
1321
+
1322
+ const row: BaseModel | null = (await service.findOneBy({
1323
+ query,
1324
+ select,
1325
+ props: { isRoot: true },
1326
+ })) as BaseModel | null;
1327
+
1328
+ if (!row) {
1329
+ throw new NotAuthorizedException(refusal);
1330
+ }
1331
+
1332
+ try {
1333
+ // Readable to the caller at all (a label-scoped read block refuses).
1334
+ const readable: BaseModel | null = (await service.findOneBy({
1335
+ query,
1336
+ select: { _id: true },
1337
+ props: callerProps,
1338
+ })) as BaseModel | null;
1339
+
1340
+ if (!readable) {
1341
+ throw new NotAuthorizedException(refusal);
1342
+ }
1343
+
1344
+ await ModelPermission.checkUpdatePermissionByModel({
1345
+ modelType: service.modelType,
1346
+ fetchModelWithAccessControlIds: async (): Promise<BaseModel> => {
1347
+ return row;
1348
+ },
1349
+ props: callerProps,
1350
+ });
1351
+
1352
+ /*
1353
+ * The caller's whole update scope as a query (labels, Owned scope):
1354
+ * the row must still be in it.
1355
+ */
1356
+ const permittedQuery: Record<string, unknown> =
1357
+ (await ModelPermission.checkUpdateQueryPermissions(
1358
+ service.modelType,
1359
+ query,
1360
+ {},
1361
+ callerProps,
1362
+ )) as Record<string, unknown>;
1363
+
1364
+ const permitted: BaseModel | null = (await service.findOneBy({
1365
+ query: permittedQuery,
1366
+ select: { _id: true },
1367
+ props: { isRoot: true },
1368
+ })) as BaseModel | null;
1369
+
1370
+ if (!permitted) {
1371
+ throw new NotAuthorizedException(refusal);
1372
+ }
1373
+ } catch (error) {
1374
+ if (
1375
+ error instanceof NotAuthorizedException ||
1376
+ error instanceof NotAuthenticatedException
1377
+ ) {
1378
+ throw new NotAuthorizedException(refusal);
1379
+ }
1380
+
1381
+ throw error;
1382
+ }
1383
+ }
1384
+
1385
+ /*
1386
+ * ------------------------------------------------------------------
1387
+ * Bookkeeping
1388
+ * ------------------------------------------------------------------
1389
+ */
1390
+
1391
+ /*
1392
+ * Best effort: the resource's AI agent page shows "last verified" / "last
1393
+ * error" from this. Written as root without the model's hooks — it is the
1394
+ * server's own record of what a command did, not an operator's change to
1395
+ * the resource's AI settings (the settings hooks stamp and police those).
1396
+ */
1397
+ @CaptureSpan()
1398
+ public async recordCommandOutcome(data: {
1399
+ resourceType: AiResourceType;
1400
+ resourceId: ObjectID;
1401
+ succeeded: boolean;
1402
+ errorMessage?: string | undefined;
1403
+ }): Promise<void> {
1404
+ try {
1405
+ if (!isAiResourceType(data.resourceType)) {
1406
+ throw new BadDataException(
1407
+ `"${String(data.resourceType)}" is not a resource type.`,
1408
+ );
1409
+ }
1410
+
1411
+ await MODEL_SPECS[data.resourceType].service.updateOneById({
1412
+ id: data.resourceId,
1413
+ data: (data.succeeded
1414
+ ? {
1415
+ aiAccessLastVerifiedAt: OneUptimeDate.getCurrentDate(),
1416
+ aiAccessLastError: null,
1417
+ }
1418
+ : {
1419
+ aiAccessLastError: (data.errorMessage || "Command failed.").slice(
1420
+ 0,
1421
+ 2000,
1422
+ ),
1423
+ }) as never,
1424
+ props: { isRoot: true, ignoreHooks: true },
1425
+ });
1426
+ } catch (error) {
1427
+ logger.error(
1428
+ `ResourceAiAccess: could not record a command outcome for ${String(
1429
+ data.resourceType,
1430
+ )} ${data.resourceId?.toString()}: ${error}`,
1431
+ );
1432
+ }
1433
+ }
1434
+ }
1435
+
1436
+ const ResourceAiAccessService: ResourceAiAccessServiceClass =
1437
+ new ResourceAiAccessServiceClass();
1438
+
1439
+ export default ResourceAiAccessService;