@oneuptime/common 14.0.10 → 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 (837) hide show
  1. package/Models/DatabaseModels/AIConversation.ts +127 -1
  2. package/Models/DatabaseModels/CephCluster.ts +12 -0
  3. package/Models/DatabaseModels/CloudResource.ts +12 -0
  4. package/Models/DatabaseModels/DatabaseServer.ts +12 -0
  5. package/Models/DatabaseModels/DockerHost.ts +12 -0
  6. package/Models/DatabaseModels/DockerSwarmCluster.ts +12 -0
  7. package/Models/DatabaseModels/GlobalOidc.ts +0 -4
  8. package/Models/DatabaseModels/GlobalOidcProject.ts +0 -4
  9. package/Models/DatabaseModels/GlobalSso.ts +0 -4
  10. package/Models/DatabaseModels/GlobalSsoProject.ts +0 -4
  11. package/Models/DatabaseModels/Host.ts +12 -0
  12. package/Models/DatabaseModels/IncidentForm.ts +594 -0
  13. package/Models/DatabaseModels/IncidentFormSubmission.ts +283 -0
  14. package/Models/DatabaseModels/IncidentTemplate.ts +59 -0
  15. package/Models/DatabaseModels/Index.ts +14 -0
  16. package/Models/DatabaseModels/IoTFleet.ts +12 -0
  17. package/Models/DatabaseModels/KubernetesCluster.ts +12 -0
  18. package/Models/DatabaseModels/MessageQueue.ts +1102 -0
  19. package/Models/DatabaseModels/MessageQueueLabelRule.ts +553 -0
  20. package/Models/DatabaseModels/MessageQueueOwnerRule.ts +633 -0
  21. package/Models/DatabaseModels/MessageQueueOwnerTeam.ts +491 -0
  22. package/Models/DatabaseModels/MessageQueueOwnerUser.ts +490 -0
  23. package/Models/DatabaseModels/PodmanHost.ts +12 -0
  24. package/Models/DatabaseModels/Project.ts +59 -0
  25. package/Models/DatabaseModels/ProjectOidc.ts +0 -4
  26. package/Models/DatabaseModels/ProjectSso.ts +0 -4
  27. package/Models/DatabaseModels/ProxmoxCluster.ts +12 -0
  28. package/Models/DatabaseModels/RumApplication.ts +12 -0
  29. package/Models/DatabaseModels/ServerlessFunction.ts +12 -0
  30. package/Models/DatabaseModels/Service.ts +12 -0
  31. package/Models/DatabaseModels/StatusPageOidc.ts +0 -4
  32. package/Models/DatabaseModels/StatusPageSso.ts +0 -4
  33. package/Models/DatabaseModels/TeamComplianceSetting.ts +47 -2
  34. package/Models/DatabaseModels/VMwareVCenter.ts +12 -0
  35. package/Server/API/AIChatAPI.ts +13 -114
  36. package/Server/API/AIInvestigationAPI.ts +3 -3
  37. package/Server/API/AIInvestigationConversationAPI.ts +266 -0
  38. package/Server/API/IncidentFormAPI.ts +376 -0
  39. package/Server/API/ProjectOIDC.ts +16 -25
  40. package/Server/API/ProjectSSO.ts +16 -24
  41. package/Server/API/StatusPageAPI.ts +42 -77
  42. package/Server/Enterprise/EnterpriseEdition.ts +93 -28
  43. package/Server/Enterprise/EnterpriseFeature.ts +25 -3
  44. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +1 -1
  45. package/Server/Enterprise/EnterpriseServerModule.ts +4 -1
  46. package/Server/EnvironmentConfig.ts +1 -1
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.ts +129 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.ts +52 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.ts +75 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.ts +477 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  52. package/Server/Middleware/IncidentFormRateLimit.ts +847 -0
  53. package/Server/Middleware/UserAuthorization.ts +16 -38
  54. package/Server/Services/AIService.ts +10 -13
  55. package/Server/Services/IncidentCustomFieldService.ts +112 -2
  56. package/Server/Services/IncidentEpisodeMemberService.ts +24 -4
  57. package/Server/Services/IncidentEpisodeService.ts +10 -1
  58. package/Server/Services/IncidentFormService.ts +1566 -0
  59. package/Server/Services/IncidentFormSubmissionService.ts +97 -0
  60. package/Server/Services/IncidentGroupingEngineService.ts +45 -8
  61. package/Server/Services/IncidentService.ts +123 -5
  62. package/Server/Services/IncidentTemplateService.ts +22 -0
  63. package/Server/Services/Index.ts +14 -0
  64. package/Server/Services/MessageQueueLabelRuleEngineService.ts +321 -0
  65. package/Server/Services/MessageQueueLabelRuleService.ts +14 -0
  66. package/Server/Services/MessageQueueOwnerRuleEngineService.ts +412 -0
  67. package/Server/Services/MessageQueueOwnerRuleService.ts +14 -0
  68. package/Server/Services/MessageQueueOwnerTeamService.ts +62 -0
  69. package/Server/Services/MessageQueueOwnerUserService.ts +62 -0
  70. package/Server/Services/MessageQueueService.ts +1463 -0
  71. package/Server/Services/OpenTelemetryIngestService.ts +37 -4
  72. package/Server/Services/ProjectService.ts +0 -59
  73. package/Server/Services/StatusPagePrivateUserService.ts +1 -4
  74. package/Server/Services/StatusPageService.ts +1 -51
  75. package/Server/Services/TeamComplianceSettingService.ts +163 -42
  76. package/Server/Services/UserNotificationRuleService.ts +8 -1
  77. package/Server/Services/WorkspaceNotificationSummaryService.ts +12 -3
  78. package/Server/Types/Database/Permissions/CreatePermission.ts +17 -3
  79. package/Server/Types/Database/Permissions/EditionPermission.ts +140 -38
  80. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +16 -0
  81. package/Server/Types/Database/Permissions/TablePermission.ts +3 -3
  82. package/Server/Types/Database/Permissions/UpdatePermission.ts +20 -6
  83. package/Server/Utils/AI/Chat/AgentContextCompactor.ts +200 -0
  84. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +307 -48
  85. package/Server/Utils/AI/Chat/ChatRunCancellation.ts +156 -0
  86. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +78 -18
  87. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  88. package/Server/Utils/AI/Chat/ToolOutputPager.ts +322 -0
  89. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +88 -30
  90. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +13 -1
  91. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +0 -32
  92. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +27 -25
  93. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +7 -1
  94. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +34 -14
  95. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +69 -24
  96. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +9 -0
  97. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +53 -10
  98. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +27 -10
  99. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +27 -10
  100. package/Server/Utils/AI/SRE/InvestigationQueue.ts +16 -19
  101. package/Server/Utils/AI/SRE/InvestigationThread.ts +646 -0
  102. package/Server/Utils/AI/SRE/InvestigationThreadService.ts +715 -0
  103. package/Server/Utils/AI/Toolbox/Serializer.ts +10 -3
  104. package/Server/Utils/EditionEnforcement.ts +19 -202
  105. package/Server/Utils/LLM/LLMService.ts +259 -63
  106. package/Server/Utils/RelaxedScimTeamLocksReport.ts +245 -0
  107. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  108. package/Server/Utils/SameOriginRequest.ts +203 -0
  109. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  110. package/Server/Utils/Telemetry/EntityRegistry.ts +4 -1
  111. package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +1402 -0
  112. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +4 -1
  113. package/Server/Utils/VendorAssets.ts +3 -3
  114. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +3 -1
  115. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +3 -1
  116. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +10 -1
  117. package/Tests/App/Accounts/IncidentFormPage.test.tsx +2036 -0
  118. package/Tests/App/Accounts/IncidentFormServerMessages.test.ts +119 -0
  119. package/Tests/App/Accounts/IncidentFormUtils.test.ts +1157 -0
  120. package/Tests/App/Accounts/LoginPasskey.test.tsx +6 -4
  121. package/Tests/App/Accounts/LoginSso.test.tsx +724 -0
  122. package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +338 -0
  123. package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +331 -0
  124. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +47 -33
  125. package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +1021 -0
  126. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +876 -78
  127. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +20 -3
  128. package/Tests/App/Dashboard/CephProxmoxVMwareDocumentationCards.test.tsx +359 -0
  129. package/Tests/App/Dashboard/CephSetupGuide.test.ts +961 -0
  130. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +381 -95
  131. package/Tests/App/Dashboard/CloudSetupGuide.test.ts +1463 -0
  132. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +174 -12
  133. package/Tests/App/Dashboard/ContainerSetupGuideCards.test.tsx +345 -0
  134. package/Tests/App/Dashboard/CoreListEmptyStates.test.tsx +501 -0
  135. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +0 -1
  136. package/Tests/App/Dashboard/DatabaseDocumentationCard.test.tsx +400 -0
  137. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +5 -0
  138. package/Tests/App/Dashboard/DatabaseSetupGuide.test.ts +1869 -0
  139. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +44 -0
  140. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +50 -9
  141. package/Tests/App/Dashboard/DockerSetupGuide.test.ts +899 -0
  142. package/Tests/App/Dashboard/DockerSwarmSetupGuide.test.ts +964 -0
  143. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +141 -7
  144. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +52 -39
  145. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +7 -1
  146. package/Tests/App/Dashboard/GettingStartedTaskRoutes.test.tsx +331 -0
  147. package/Tests/App/Dashboard/HomeOverviewStatsFirstRun.test.tsx +925 -0
  148. package/Tests/App/Dashboard/HostDocumentationCard.test.tsx +225 -0
  149. package/Tests/App/Dashboard/HostSetupGuide.test.ts +1183 -0
  150. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +69 -45
  151. package/Tests/App/Dashboard/IncidentCreateTemplateCustomFieldSettings.test.tsx +745 -0
  152. package/Tests/App/Dashboard/IncidentCreateTemplateOwners.test.tsx +414 -0
  153. package/Tests/App/Dashboard/IncidentCustomFieldCreateSettingsForm.test.ts +1042 -0
  154. package/Tests/App/Dashboard/IncidentCustomFieldSettingsCard.test.tsx +1816 -0
  155. package/Tests/App/Dashboard/IncidentFormPlan.test.ts +89 -0
  156. package/Tests/App/Dashboard/IncidentFormShareLinkCard.test.tsx +846 -0
  157. package/Tests/App/Dashboard/IncidentFormsPages.test.tsx +1324 -0
  158. package/Tests/App/Dashboard/IncidentTemplateCustomFieldSettings.test.tsx +630 -0
  159. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +13 -0
  160. package/Tests/App/Dashboard/IncomingEmailMonitorLinkVerifyHint.test.tsx +104 -0
  161. package/Tests/App/Dashboard/InvestigationConversation.test.tsx +1107 -0
  162. package/Tests/App/Dashboard/InvestigationConversationData.test.ts +546 -0
  163. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +170 -5
  164. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +207 -2
  165. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +729 -34
  166. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +9 -21
  167. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +274 -37
  168. package/Tests/App/Dashboard/InvestigationStatusBadge.test.tsx +130 -0
  169. package/Tests/App/Dashboard/IoTDocumentationCard.test.tsx +218 -0
  170. package/Tests/App/Dashboard/IoTSetupGuide.test.ts +1124 -0
  171. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +20 -6
  172. package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +107 -83
  173. package/Tests/App/Dashboard/KubernetesSetupGuide.test.ts +787 -0
  174. package/Tests/App/Dashboard/MessageQueueBreadcrumbs.test.tsx +228 -0
  175. package/Tests/App/Dashboard/MessageQueueBrokerHealth.test.tsx +1538 -0
  176. package/Tests/App/Dashboard/MessageQueueBrokerHealthMetricChart.test.tsx +969 -0
  177. package/Tests/App/Dashboard/MessageQueueBrokerHealthReads.test.ts +889 -0
  178. package/Tests/App/Dashboard/MessageQueueBrokerMetricsReach.test.ts +236 -0
  179. package/Tests/App/Dashboard/MessageQueueDocumentationCard.test.tsx +479 -0
  180. package/Tests/App/Dashboard/MessageQueueListPages.test.tsx +1232 -0
  181. package/Tests/App/Dashboard/MessageQueueMetricDescriptions.test.ts +244 -0
  182. package/Tests/App/Dashboard/MessageQueueMonitorLink.test.ts +952 -0
  183. package/Tests/App/Dashboard/MessageQueueMonitorLinkMonitorCreate.test.tsx +859 -0
  184. package/Tests/App/Dashboard/MessageQueueOverview.test.tsx +1773 -0
  185. package/Tests/App/Dashboard/MessageQueueOverviewPresentation.test.ts +196 -0
  186. package/Tests/App/Dashboard/MessageQueuePresentation.test.ts +799 -0
  187. package/Tests/App/Dashboard/MessageQueueProducersConsumers.test.tsx +680 -0
  188. package/Tests/App/Dashboard/MessageQueueRoutes.test.tsx +383 -0
  189. package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +278 -0
  190. package/Tests/App/Dashboard/MessageQueueSetupGuide.test.ts +2778 -0
  191. package/Tests/App/Dashboard/MessageQueueSideMenus.test.tsx +273 -0
  192. package/Tests/App/Dashboard/MessageQueueSpanPopulations.test.ts +930 -0
  193. package/Tests/App/Dashboard/MessageQueueSpanStore.ts +351 -0
  194. package/Tests/App/Dashboard/MessageQueueTelemetryScope.test.ts +375 -0
  195. package/Tests/App/Dashboard/MessageQueueTelemetryScopeTabs.test.tsx +668 -0
  196. package/Tests/App/Dashboard/MessageQueueViewPages.test.tsx +685 -0
  197. package/Tests/App/Dashboard/MonitorAndHomeNotOperationalMenus.test.tsx +342 -0
  198. package/Tests/App/Dashboard/MonitorCreateFirstRunDefaults.test.tsx +623 -0
  199. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +442 -0
  200. package/Tests/App/Dashboard/MonitorLogsPageViewSummary.test.tsx +814 -0
  201. package/Tests/App/Dashboard/MonitorSetupCardBodies.test.tsx +246 -0
  202. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +8 -0
  203. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +27 -12
  204. package/Tests/App/Dashboard/PlanGatedPage.test.tsx +292 -0
  205. package/Tests/App/Dashboard/PodmanSetupGuide.test.ts +948 -0
  206. package/Tests/App/Dashboard/ProductOrientation.test.tsx +5 -4
  207. package/Tests/App/Dashboard/ProductSettingsSectionCollapsed.test.tsx +266 -0
  208. package/Tests/App/Dashboard/ProxmoxSetupGuide.test.ts +1318 -0
  209. package/Tests/App/Dashboard/ResourceAiAgentAttentionServerParity.test.ts +555 -0
  210. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +298 -9
  211. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +453 -0
  212. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +16 -0
  213. package/Tests/App/Dashboard/ResourceConnectionGuideCard.test.tsx +444 -0
  214. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsInfra.test.tsx +798 -0
  215. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsPlatforms.test.tsx +717 -0
  216. package/Tests/App/Dashboard/ResourceConnectionGuides.test.ts +981 -0
  217. package/Tests/App/Dashboard/ResourceConnectionState.test.ts +132 -0
  218. package/Tests/App/Dashboard/RumDocumentationCard.test.tsx +293 -0
  219. package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +467 -0
  220. package/Tests/App/Dashboard/RumSetupGuide.test.ts +758 -0
  221. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +25 -0
  222. package/Tests/App/Dashboard/ServerlessDocumentationCard.test.tsx +254 -0
  223. package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1074 -0
  224. package/Tests/App/Dashboard/SetupGuide.test.ts +246 -0
  225. package/Tests/App/Dashboard/SetupGuideCard.test.tsx +756 -0
  226. package/Tests/App/Dashboard/SloListSideMenu.test.tsx +120 -0
  227. package/Tests/App/Dashboard/SsoPages.test.tsx +833 -0
  228. package/Tests/App/Dashboard/TelemetryDocumentation.test.tsx +253 -0
  229. package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +730 -0
  230. package/Tests/App/Dashboard/VMwareSetupGuide.test.ts +1033 -0
  231. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +87 -7
  232. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +28 -9
  233. package/Tests/Models/DatabaseModels/IncidentFormModel.test.ts +1250 -0
  234. package/Tests/Models/DatabaseModels/MessageQueueModels.test.ts +1983 -0
  235. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  236. package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +190 -14
  237. package/Tests/Models/IncidentTemplateCustomFieldSettingsColumn.test.ts +291 -0
  238. package/Tests/Server/API/AIInvestigationConversationAPI.test.ts +412 -0
  239. package/Tests/Server/API/GlobalConfigLicense.test.ts +38 -9
  240. package/Tests/Server/API/IncidentFormAPI.test.ts +942 -0
  241. package/Tests/Server/API/IncidentFormPublicRoutes.test.ts +1653 -0
  242. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -1
  243. package/Tests/Server/API/{SsoProviderListingsEdition.test.ts → SsoProviderListings.test.ts} +164 -110
  244. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +76 -54
  245. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +125 -42
  246. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +36 -10
  247. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +51 -9
  248. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +13 -8
  249. package/Tests/Server/Enterprise/SsoInCommunityEdition.test.ts +540 -0
  250. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  251. package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +438 -0
  252. package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleNotificationChannelsMigration.test.ts +255 -0
  253. package/Tests/Server/Infrastructure/Postgres/MessageQueueTablesMigration.test.ts +637 -0
  254. package/Tests/Server/Middleware/IncidentFormRateLimit.test.ts +1630 -0
  255. package/Tests/Server/Middleware/UserAuthorization.test.ts +16 -17
  256. package/Tests/Server/Middleware/UserAuthorizationSsoEnforcement.test.ts +544 -0
  257. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +37 -8
  258. package/Tests/Server/Services/IncidentCreatedFeedTitle.test.ts +212 -0
  259. package/Tests/Server/Services/IncidentCustomFieldDeleteFormQuestions.test.ts +297 -0
  260. package/Tests/Server/Services/IncidentFormOwnersCreatedNotification.test.ts +497 -0
  261. package/Tests/Server/Services/IncidentFormPostgres.test.ts +958 -0
  262. package/Tests/Server/Services/IncidentFormPublicForm.test.ts +1260 -0
  263. package/Tests/Server/Services/IncidentFormPublicSubmission.test.ts +2520 -0
  264. package/Tests/Server/Services/IncidentFormRegistration.test.ts +159 -0
  265. package/Tests/Server/Services/IncidentFormService.test.ts +663 -0
  266. package/Tests/Server/Services/IncidentFormSubmissionService.test.ts +430 -0
  267. package/Tests/Server/Services/IncidentFormSubmissionTemplateBranch.test.ts +473 -0
  268. package/Tests/Server/Services/IncidentGroupingTemplateSubstitution.test.ts +81 -0
  269. package/Tests/Server/Services/IncidentTemplateCustomFieldSettings.test.ts +262 -0
  270. package/Tests/Server/Services/IncidentTemplateOwnersOnDeclare.test.ts +566 -0
  271. package/Tests/Server/Services/IncidentTitleMarkdownSinks.test.ts +640 -0
  272. package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +3 -3
  273. package/Tests/Server/Services/MessageQueueOwnerServices.test.ts +440 -0
  274. package/Tests/Server/Services/MessageQueueRegistries.test.ts +577 -0
  275. package/Tests/Server/Services/MessageQueueRuleEngines.test.ts +900 -0
  276. package/Tests/Server/Services/MessageQueueService.test.ts +2210 -0
  277. package/Tests/Server/Services/MessageQueueSqlPostgres.test.ts +1271 -0
  278. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
  279. package/Tests/Server/Services/OpenTelemetryRetentionOverrideEdition.test.ts +474 -0
  280. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +21 -0
  281. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +3 -0
  282. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +0 -1
  283. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +56 -6
  284. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -1
  285. package/Tests/Server/Services/SsoRequirementReads.test.ts +454 -0
  286. package/Tests/Server/Services/SsoRequirementWrites.test.ts +529 -0
  287. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  288. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +107 -89
  289. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +1068 -176
  290. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +1962 -200
  291. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +654 -297
  292. package/Tests/Server/Types/Database/Permissions/RetentionOverrideColumns.test.ts +784 -0
  293. package/Tests/Server/Types/Database/Permissions/SsoScalePlanGate.test.ts +418 -0
  294. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +0 -1
  295. package/Tests/Server/Utils/AI/AIInvestigationEngineRunLimits.test.ts +136 -0
  296. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +15 -14
  297. package/Tests/Server/Utils/AI/AgentContextCompactor.test.ts +351 -0
  298. package/Tests/Server/Utils/AI/ChatAgentRunnerSharedThread.test.ts +842 -0
  299. package/Tests/Server/Utils/AI/ChatRunCancellation.test.ts +195 -0
  300. package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +10 -57
  301. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +20 -24
  302. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +7 -30
  303. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +225 -29
  304. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +266 -25
  305. package/Tests/Server/Utils/AI/InvestigationThread.test.ts +580 -0
  306. package/Tests/Server/Utils/AI/InvestigationThreadService.test.ts +801 -0
  307. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +525 -43
  308. package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +4 -2
  309. package/Tests/Server/Utils/AI/LLMServiceUnreachableProvider.test.ts +435 -0
  310. package/Tests/Server/Utils/AI/ObservabilityAssistantLimits.test.ts +462 -0
  311. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +14 -25
  312. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +2 -0
  313. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +297 -15
  314. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +10 -6
  315. package/Tests/Server/Utils/AI/ToolOutputPager.test.ts +382 -0
  316. package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +23 -4
  317. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +25 -6
  318. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +14 -3
  319. package/Tests/Server/Utils/EditionEnforcement.test.ts +107 -147
  320. package/Tests/Server/Utils/{CommunityEditionSsoReport.test.ts → RelaxedScimTeamLocksReport.test.ts} +212 -208
  321. package/Tests/Server/Utils/SameOriginRequest.test.ts +372 -0
  322. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +20 -0
  323. package/Tests/Server/Utils/Telemetry/MessageQueueDiscovery.test.ts +2590 -0
  324. package/Tests/Server/Utils/Telemetry/MessageQueueSpanQueryTwin.ts +246 -0
  325. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +23 -0
  326. package/Tests/Types/AI/AIAgentRunLimits.test.ts +255 -0
  327. package/Tests/Types/Code/JsonSyntax.test.ts +1300 -0
  328. package/Tests/Types/CustomField/CustomFieldCreateSettings.test.ts +1113 -0
  329. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +91 -0
  330. package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +30 -0
  331. package/Tests/Types/Incident/IncidentFormIpAllowlist.test.ts +227 -0
  332. package/Tests/Types/Incident/IncidentFormPublic.test.ts +1916 -0
  333. package/Tests/Types/MessageQueue/MessageQueueEntityKey.test.ts +916 -0
  334. package/Tests/Types/MessageQueue/MessageQueueIdentity.test.ts +567 -0
  335. package/Tests/Types/MessageQueue/MessageQueueManualIdentity.test.ts +686 -0
  336. package/Tests/Types/MessageQueue/MessageQueueMetricCatalog.test.ts +1726 -0
  337. package/Tests/Types/MessageQueue/MessageQueueMetricResolution.test.ts +1758 -0
  338. package/Tests/Types/MessageQueue/MessagingInstrumentationFixtures.test.ts +4686 -0
  339. package/Tests/Types/MessageQueue/MessagingSystem.test.ts +840 -0
  340. package/Tests/Types/MessageQueue/MessagingTelemetryFixtures.ts +3287 -0
  341. package/Tests/Types/MessageQueue/MessagingTelemetryResolver.test.ts +2966 -0
  342. package/Tests/Types/Monitor/MessageQueueAlertTemplates.test.ts +5401 -0
  343. package/Tests/Types/Monitor/MetricEngineFold.ts +154 -0
  344. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +5 -3
  345. package/Tests/Types/Team/ComplianceRule.test.ts +588 -37
  346. package/Tests/Types/Team/TeamComplianceStatus.test.ts +64 -11
  347. package/Tests/Types/XML.test.ts +51 -0
  348. package/Tests/UI/Components/CodeEditor/CodeEditor.test.tsx +2362 -0
  349. package/Tests/UI/Components/CodeEditor/CodeEditorCommands.test.ts +810 -0
  350. package/Tests/UI/Components/CodeEditor/CodeEditorHighlight.test.ts +338 -0
  351. package/Tests/UI/Components/CodeEditor/CodeEditorLanguages.test.ts +222 -0
  352. package/Tests/UI/Components/CodeEditor/CodeEditorStyles.test.ts +807 -0
  353. package/Tests/UI/Components/CodeEditor/NoMonaco.test.ts +245 -0
  354. package/Tests/UI/Components/CodeEditor/YamlEditor.test.tsx +729 -0
  355. package/Tests/UI/Components/CopyTextButton.test.tsx +76 -0
  356. package/Tests/UI/Components/EditionLabelLapseCopy.ts +51 -14
  357. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +131 -23
  358. package/Tests/UI/Components/ErrorMessageAction.test.tsx +142 -0
  359. package/Tests/UI/Components/FacetSidebarInScope.test.tsx +459 -0
  360. package/Tests/UI/Components/FacetValuesInScope.test.ts +270 -0
  361. package/Tests/UI/Components/Forms/FormFieldCodeEditors.test.tsx +294 -0
  362. package/Tests/UI/Components/Forms/FormFieldMarkdown.test.tsx +126 -0
  363. package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +22 -75
  364. package/Tests/UI/Components/Forms/ModelFormOnBeforeCreateMiscData.test.tsx +254 -0
  365. package/Tests/UI/Components/Icon.test.tsx +32 -0
  366. package/Tests/UI/Components/Input.test.tsx +31 -0
  367. package/Tests/UI/Components/LockedFilterChipScope.test.tsx +501 -0
  368. package/Tests/UI/Components/MarkdownConverters.test.ts +253 -1
  369. package/Tests/UI/Components/MarkdownEditor.test.tsx +2785 -2
  370. package/Tests/UI/Components/MarkdownEditorHistory.test.ts +243 -0
  371. package/Tests/UI/Components/MarkdownListEditing.test.ts +1118 -0
  372. package/Tests/UI/Components/MarkdownPaste.test.ts +1180 -0
  373. package/Tests/UI/Components/MarkdownViewerCopy.test.tsx +466 -0
  374. package/Tests/UI/Components/MarkdownVisualEditing.test.ts +1089 -0
  375. package/Tests/UI/Components/ModelTable/BaseModelTableEmptyStateAction.test.tsx +623 -0
  376. package/Tests/UI/Components/ResetObjectID.test.tsx +282 -0
  377. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  378. package/Tests/UI/Components/Table/EmptyTableMessage.test.ts +439 -0
  379. package/Tests/UI/Components/Table/TableEmptyState.test.tsx +352 -0
  380. package/Tests/UI/Components/TableRowMobileTitles.test.tsx +78 -0
  381. package/Tests/UI/Components/TextArea.test.tsx +19 -0
  382. package/Tests/UI/Components/Workflow/ModelColumnEditor.render.test.tsx +12 -29
  383. package/Tests/UI/Components/fixtures/MarkdownPasteFixtures.ts +460 -0
  384. package/Tests/UI/EsbuildConfig.test.ts +115 -39
  385. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +4 -4
  386. package/Tests/UI/Monitor/MonitorLogSummaryRender.test.tsx +377 -0
  387. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +81 -1
  388. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +17 -0
  389. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  390. package/Tests/Utils/Markdown/DashboardMarkdownRenderer.ts +81 -0
  391. package/Tests/Utils/Markdown/UntrustedMarkdown.test.ts +1339 -0
  392. package/Tests/Utils/Monitor/MonitorLogSummaryUtil.test.ts +862 -0
  393. package/Types/AI/AIAgentRunLimits.ts +146 -0
  394. package/Types/Code/CodeType.ts +2 -0
  395. package/Types/Code/JsonSyntax.ts +923 -0
  396. package/Types/CustomField/CustomFieldCreateSettings.ts +549 -0
  397. package/Types/CustomField/CustomFieldMappingCatalog.ts +77 -0
  398. package/Types/CustomField/CustomFieldValueValidator.ts +10 -7
  399. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +1 -1
  400. package/Types/Icon/IconProp.ts +2 -0
  401. package/Types/Incident/IncidentFormIpAllowlist.ts +206 -0
  402. package/Types/Incident/IncidentFormPublic.ts +1145 -0
  403. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +10 -3
  404. package/Types/MessageQueue/MessageQueueIdentity.ts +256 -0
  405. package/Types/MessageQueue/MessageQueueManualIdentity.ts +325 -0
  406. package/Types/MessageQueue/MessageQueueMetricCatalog.ts +1357 -0
  407. package/Types/MessageQueue/MessagingSystem.ts +518 -0
  408. package/Types/MessageQueue/MessagingTelemetryResolver.ts +2311 -0
  409. package/Types/Monitor/MessageQueueAlertTemplates.ts +2128 -0
  410. package/Types/Permission.ts +310 -0
  411. package/Types/ResourceAiAgent/ResourceAiAccess.ts +10 -4
  412. package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
  413. package/Types/Rules/RuleRun.ts +4 -0
  414. package/Types/Team/ComplianceNotificationChannel.ts +4 -3
  415. package/Types/Team/ComplianceRule.ts +71 -18
  416. package/Types/Team/ComplianceRuleType.ts +2 -2
  417. package/Types/Team/TeamComplianceStatus.ts +6 -2
  418. package/Types/Telemetry/EntityType.ts +16 -0
  419. package/Types/Telemetry/LockedFilterDetail.ts +22 -0
  420. package/Types/XML.ts +26 -0
  421. package/UI/Components/CodeEditor/CodeEditor.css +379 -0
  422. package/UI/Components/CodeEditor/CodeEditor.tsx +1128 -294
  423. package/UI/Components/CodeEditor/CodeEditorCommands.ts +774 -0
  424. package/UI/Components/CodeEditor/CodeEditorHighlight.ts +106 -0
  425. package/UI/Components/CodeEditor/CodeEditorLanguages.ts +164 -0
  426. package/UI/Components/CodeEditor/YamlEditor.tsx +28 -326
  427. package/UI/Components/CopyTextButton/CopyTextButton.tsx +5 -1
  428. package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +6 -25
  429. package/UI/Components/EditionLabel/EditionLabel.tsx +14 -13
  430. package/UI/Components/ErrorMessage/ErrorMessage.tsx +11 -1
  431. package/UI/Components/Forms/Fields/FormField.tsx +8 -0
  432. package/UI/Components/Forms/Types/Field.ts +8 -0
  433. package/UI/Components/Icon/Icon.tsx +18 -0
  434. package/UI/Components/Input/Input.tsx +11 -4
  435. package/UI/Components/LogsViewer/LogsViewer.tsx +4 -0
  436. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +21 -3
  437. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  438. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +877 -79
  439. package/UI/Components/Markdown.tsx/MarkdownEditorHistory.ts +284 -0
  440. package/UI/Components/Markdown.tsx/MarkdownListEditing.ts +1362 -0
  441. package/UI/Components/Markdown.tsx/MarkdownPaste.ts +1326 -0
  442. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +106 -10
  443. package/UI/Components/Markdown.tsx/MarkdownVisualEditing.ts +1032 -0
  444. package/UI/Components/ModelTable/BaseModelTable.tsx +85 -7
  445. package/UI/Components/ResetObjectID/ResetObjectID.tsx +35 -9
  446. package/UI/Components/Table/EmptyTableMessage.ts +81 -0
  447. package/UI/Components/Table/Table.tsx +50 -21
  448. package/UI/Components/Table/TableRow.tsx +9 -1
  449. package/UI/Components/TelemetryViewer/FacetVisibility.ts +97 -2
  450. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +13 -0
  451. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +214 -7
  452. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +21 -3
  453. package/UI/Components/TextArea/TextArea.tsx +9 -2
  454. package/UI/Components/Workflow/ModelFieldPicker.tsx +10 -12
  455. package/UI/Styles/Theme.css +8 -0
  456. package/UI/esbuild-config.js +2 -32
  457. package/Utils/LabelRuleImportExport.ts +2 -0
  458. package/Utils/Markdown/UntrustedMarkdown.ts +1513 -0
  459. package/Utils/Monitor/IncomingEmailMonitorRequestUtil.ts +41 -0
  460. package/Utils/Monitor/MonitorLogSummaryUtil.ts +212 -0
  461. package/Utils/Telemetry/EntityKey.ts +48 -0
  462. package/build/dist/Models/DatabaseModels/AIConversation.js +125 -1
  463. package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
  464. package/build/dist/Models/DatabaseModels/CephCluster.js +12 -0
  465. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  466. package/build/dist/Models/DatabaseModels/CloudResource.js +12 -0
  467. package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
  468. package/build/dist/Models/DatabaseModels/DatabaseServer.js +12 -0
  469. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  470. package/build/dist/Models/DatabaseModels/DockerHost.js +12 -0
  471. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  472. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +12 -0
  473. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  474. package/build/dist/Models/DatabaseModels/GlobalOidc.js +0 -4
  475. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  476. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +0 -4
  477. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
  478. package/build/dist/Models/DatabaseModels/GlobalSso.js +0 -4
  479. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  480. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +0 -4
  481. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
  482. package/build/dist/Models/DatabaseModels/Host.js +12 -0
  483. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  484. package/build/dist/Models/DatabaseModels/IncidentForm.js +605 -0
  485. package/build/dist/Models/DatabaseModels/IncidentForm.js.map +1 -0
  486. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js +299 -0
  487. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js.map +1 -0
  488. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +60 -0
  489. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  490. package/build/dist/Models/DatabaseModels/Index.js +14 -0
  491. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  492. package/build/dist/Models/DatabaseModels/IoTFleet.js +12 -0
  493. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
  494. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +12 -0
  495. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  496. package/build/dist/Models/DatabaseModels/MessageQueue.js +1106 -0
  497. package/build/dist/Models/DatabaseModels/MessageQueue.js.map +1 -0
  498. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js +562 -0
  499. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js.map +1 -0
  500. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js +643 -0
  501. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js.map +1 -0
  502. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js +506 -0
  503. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js.map +1 -0
  504. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js +505 -0
  505. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js.map +1 -0
  506. package/build/dist/Models/DatabaseModels/PodmanHost.js +12 -0
  507. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  508. package/build/dist/Models/DatabaseModels/Project.js +61 -0
  509. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  510. package/build/dist/Models/DatabaseModels/ProjectOidc.js +0 -4
  511. package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
  512. package/build/dist/Models/DatabaseModels/ProjectSso.js +0 -4
  513. package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
  514. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +12 -0
  515. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  516. package/build/dist/Models/DatabaseModels/RumApplication.js +12 -0
  517. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  518. package/build/dist/Models/DatabaseModels/ServerlessFunction.js +12 -0
  519. package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
  520. package/build/dist/Models/DatabaseModels/Service.js +12 -0
  521. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  522. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +0 -4
  523. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  524. package/build/dist/Models/DatabaseModels/StatusPageSso.js +0 -4
  525. package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
  526. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +49 -3
  527. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  528. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +12 -0
  529. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  530. package/build/dist/Server/API/AIChatAPI.js +9 -103
  531. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  532. package/build/dist/Server/API/AIInvestigationAPI.js +3 -3
  533. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  534. package/build/dist/Server/API/AIInvestigationConversationAPI.js +162 -0
  535. package/build/dist/Server/API/AIInvestigationConversationAPI.js.map +1 -0
  536. package/build/dist/Server/API/IncidentFormAPI.js +245 -0
  537. package/build/dist/Server/API/IncidentFormAPI.js.map +1 -0
  538. package/build/dist/Server/API/ProjectOIDC.js +16 -24
  539. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  540. package/build/dist/Server/API/ProjectSSO.js +16 -24
  541. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  542. package/build/dist/Server/API/StatusPageAPI.js +42 -75
  543. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  544. package/build/dist/Server/Enterprise/EnterpriseEdition.js +79 -25
  545. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -1
  546. package/build/dist/Server/Enterprise/EnterpriseFeature.js +24 -3
  547. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -1
  548. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +1 -1
  549. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -1
  550. package/build/dist/Server/EnvironmentConfig.js +1 -1
  551. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js +63 -0
  552. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js.map +1 -0
  553. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js +41 -0
  554. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js.map +1 -0
  555. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js +40 -0
  556. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js.map +1 -0
  557. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js +183 -0
  558. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js.map +1 -0
  559. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  560. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  561. package/build/dist/Server/Middleware/IncidentFormRateLimit.js +559 -0
  562. package/build/dist/Server/Middleware/IncidentFormRateLimit.js.map +1 -0
  563. package/build/dist/Server/Middleware/UserAuthorization.js +11 -30
  564. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  565. package/build/dist/Server/Services/AIService.js +10 -13
  566. package/build/dist/Server/Services/AIService.js.map +1 -1
  567. package/build/dist/Server/Services/IncidentCustomFieldService.js +83 -0
  568. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  569. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
  570. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  571. package/build/dist/Server/Services/IncidentEpisodeService.js +10 -1
  572. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  573. package/build/dist/Server/Services/IncidentFormService.js +1202 -0
  574. package/build/dist/Server/Services/IncidentFormService.js.map +1 -0
  575. package/build/dist/Server/Services/IncidentFormSubmissionService.js +91 -0
  576. package/build/dist/Server/Services/IncidentFormSubmissionService.js.map +1 -0
  577. package/build/dist/Server/Services/IncidentGroupingEngineService.js +20 -8
  578. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  579. package/build/dist/Server/Services/IncidentService.js +106 -4
  580. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  581. package/build/dist/Server/Services/IncidentTemplateService.js +18 -0
  582. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  583. package/build/dist/Server/Services/Index.js +14 -0
  584. package/build/dist/Server/Services/Index.js.map +1 -1
  585. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js +262 -0
  586. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js.map +1 -0
  587. package/build/dist/Server/Services/MessageQueueLabelRuleService.js +13 -0
  588. package/build/dist/Server/Services/MessageQueueLabelRuleService.js.map +1 -0
  589. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js +334 -0
  590. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js.map +1 -0
  591. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js +13 -0
  592. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js.map +1 -0
  593. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js +62 -0
  594. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js.map +1 -0
  595. package/build/dist/Server/Services/MessageQueueOwnerUserService.js +62 -0
  596. package/build/dist/Server/Services/MessageQueueOwnerUserService.js.map +1 -0
  597. package/build/dist/Server/Services/MessageQueueService.js +1140 -0
  598. package/build/dist/Server/Services/MessageQueueService.js.map +1 -0
  599. package/build/dist/Server/Services/OpenTelemetryIngestService.js +25 -4
  600. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  601. package/build/dist/Server/Services/ProjectService.js +0 -54
  602. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  603. package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -4
  604. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  605. package/build/dist/Server/Services/StatusPageService.js +0 -46
  606. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  607. package/build/dist/Server/Services/TeamComplianceSettingService.js +120 -31
  608. package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
  609. package/build/dist/Server/Services/UserNotificationRuleService.js +8 -1
  610. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  611. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +12 -3
  612. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
  613. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +6 -3
  614. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  615. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +109 -37
  616. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  617. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +16 -0
  618. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  619. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +3 -3
  620. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +9 -6
  621. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  622. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js +128 -0
  623. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js.map +1 -0
  624. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +192 -50
  625. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  626. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js +133 -0
  627. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js.map +1 -0
  628. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +53 -13
  629. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  630. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  631. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js +206 -0
  632. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js.map +1 -0
  633. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +53 -26
  634. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
  635. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +4 -2
  636. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
  637. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +1 -29
  638. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  639. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +24 -24
  640. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  641. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +7 -2
  642. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  643. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +29 -14
  644. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  645. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +38 -14
  646. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -1
  647. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +2 -0
  648. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -1
  649. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +40 -10
  650. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  651. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +19 -7
  652. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  653. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +19 -7
  654. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  655. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +15 -18
  656. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  657. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js +412 -0
  658. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js.map +1 -0
  659. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js +495 -0
  660. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js.map +1 -0
  661. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +10 -3
  662. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -1
  663. package/build/dist/Server/Utils/EditionEnforcement.js +20 -158
  664. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -1
  665. package/build/dist/Server/Utils/LLM/LLMService.js +193 -54
  666. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  667. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js +160 -0
  668. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js.map +1 -0
  669. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  670. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  671. package/build/dist/Server/Utils/SameOriginRequest.js +151 -0
  672. package/build/dist/Server/Utils/SameOriginRequest.js.map +1 -0
  673. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  674. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  675. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -1
  676. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  677. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +1015 -0
  678. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -0
  679. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +4 -1
  680. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  681. package/build/dist/Server/Utils/VendorAssets.js +3 -3
  682. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +3 -1
  683. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  684. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +3 -1
  685. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  686. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +10 -1
  687. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  688. package/build/dist/Types/AI/AIAgentRunLimits.js +91 -0
  689. package/build/dist/Types/AI/AIAgentRunLimits.js.map +1 -0
  690. package/build/dist/Types/Code/CodeType.js +2 -0
  691. package/build/dist/Types/Code/CodeType.js.map +1 -1
  692. package/build/dist/Types/Code/JsonSyntax.js +604 -0
  693. package/build/dist/Types/Code/JsonSyntax.js.map +1 -0
  694. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js +310 -0
  695. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js.map +1 -0
  696. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +38 -0
  697. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -1
  698. package/build/dist/Types/CustomField/CustomFieldValueValidator.js +10 -7
  699. package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -1
  700. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +1 -1
  701. package/build/dist/Types/Icon/IconProp.js +2 -0
  702. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  703. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js +119 -0
  704. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js.map +1 -0
  705. package/build/dist/Types/Incident/IncidentFormPublic.js +678 -0
  706. package/build/dist/Types/Incident/IncidentFormPublic.js.map +1 -0
  707. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +10 -3
  708. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
  709. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js +184 -0
  710. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js.map +1 -0
  711. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js +190 -0
  712. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js.map +1 -0
  713. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js +1057 -0
  714. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js.map +1 -0
  715. package/build/dist/Types/MessageQueue/MessagingSystem.js +394 -0
  716. package/build/dist/Types/MessageQueue/MessagingSystem.js.map +1 -0
  717. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js +1768 -0
  718. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js.map +1 -0
  719. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js +1207 -0
  720. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js.map +1 -0
  721. package/build/dist/Types/Permission.js +274 -0
  722. package/build/dist/Types/Permission.js.map +1 -1
  723. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +10 -4
  724. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -1
  725. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +12 -0
  726. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  727. package/build/dist/Types/Rules/RuleRun.js +4 -0
  728. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  729. package/build/dist/Types/Team/ComplianceNotificationChannel.js +4 -3
  730. package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -1
  731. package/build/dist/Types/Team/ComplianceRule.js +48 -14
  732. package/build/dist/Types/Team/ComplianceRule.js.map +1 -1
  733. package/build/dist/Types/Team/ComplianceRuleType.js +2 -2
  734. package/build/dist/Types/Telemetry/EntityType.js +16 -0
  735. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  736. package/build/dist/Types/XML.js +23 -0
  737. package/build/dist/Types/XML.js.map +1 -1
  738. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +641 -266
  739. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  740. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js +464 -0
  741. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js.map +1 -0
  742. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js +69 -0
  743. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js.map +1 -0
  744. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js +108 -0
  745. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js.map +1 -0
  746. package/build/dist/UI/Components/CodeEditor/YamlEditor.js +14 -186
  747. package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -1
  748. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
  749. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
  750. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +5 -14
  751. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -1
  752. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +14 -13
  753. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  754. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +1 -1
  755. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  756. package/build/dist/UI/Components/Forms/Fields/FormField.js +8 -3
  757. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  758. package/build/dist/UI/Components/Icon/Icon.js +8 -0
  759. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  760. package/build/dist/UI/Components/Input/Input.js +11 -3
  761. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  762. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +2 -1
  763. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  764. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +14 -4
  765. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  766. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  767. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  768. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +710 -65
  769. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  770. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js +238 -0
  771. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js.map +1 -0
  772. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js +1028 -0
  773. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js.map +1 -0
  774. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js +1088 -0
  775. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js.map +1 -0
  776. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +70 -10
  777. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  778. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js +887 -0
  779. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js.map +1 -0
  780. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +57 -6
  781. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  782. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +7 -5
  783. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
  784. package/build/dist/UI/Components/Table/EmptyTableMessage.js +51 -0
  785. package/build/dist/UI/Components/Table/EmptyTableMessage.js.map +1 -0
  786. package/build/dist/UI/Components/Table/Table.js +30 -11
  787. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  788. package/build/dist/UI/Components/Table/TableRow.js +9 -2
  789. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  790. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +63 -1
  791. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -1
  792. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +4 -2
  793. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  794. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +91 -10
  795. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
  796. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -4
  797. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  798. package/build/dist/UI/Components/TextArea/TextArea.js +9 -3
  799. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  800. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js +1 -2
  801. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js.map +1 -1
  802. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  803. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  804. package/build/dist/Utils/Markdown/UntrustedMarkdown.js +988 -0
  805. package/build/dist/Utils/Markdown/UntrustedMarkdown.js.map +1 -0
  806. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js +34 -0
  807. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js.map +1 -0
  808. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js +148 -0
  809. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js.map +1 -0
  810. package/build/dist/Utils/Telemetry/EntityKey.js +36 -0
  811. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  812. package/package.json +1 -3
  813. package/Server/Utils/CommunityEditionSsoReport.ts +0 -361
  814. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +0 -616
  815. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +0 -217
  816. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +0 -271
  817. package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +0 -215
  818. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +0 -784
  819. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +0 -518
  820. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +0 -419
  821. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +0 -769
  822. package/Tests/UI/Components/CodeEditor.test.tsx +0 -638
  823. package/Tests/UI/Components/MonacoLoader.test.ts +0 -67
  824. package/Tests/UI/Components/MonacoRuntime.test.ts +0 -121
  825. package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +0 -329
  826. package/Tests/UI/Components/YamlEditor.test.tsx +0 -847
  827. package/UI/Components/CodeEditor/MonacoLoader.ts +0 -36
  828. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -319
  829. package/UI/Components/Telemetry/TelemetryRetentionConfigSummary.tsx +0 -223
  830. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +0 -223
  831. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +0 -1
  832. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +0 -34
  833. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +0 -1
  834. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +0 -171
  835. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +0 -1
  836. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js +0 -119
  837. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js.map +0 -1
@@ -0,0 +1,1107 @@
1
+ import {
2
+ afterEach,
3
+ beforeEach,
4
+ describe,
5
+ expect,
6
+ jest,
7
+ test,
8
+ } from "@jest/globals";
9
+ import "@testing-library/jest-dom";
10
+ import {
11
+ act,
12
+ cleanup,
13
+ fireEvent,
14
+ render,
15
+ screen,
16
+ within,
17
+ } from "@testing-library/react";
18
+ import * as React from "react";
19
+ import getJestMockFunction, { MockFunction } from "../../MockType";
20
+
21
+ /*
22
+ * The conversation inside the AI investigation box, rendered for real with
23
+ * only the network, markdown and heavy chat widgets stubbed. It drives the
24
+ * component the way responders will: asking from a suggestion, typing,
25
+ * seeing who asked what, watching an answer being written, approving an
26
+ * action, stopping an answer, and choosing how much the AI may do.
27
+ */
28
+
29
+ const postMock: MockFunction = getJestMockFunction();
30
+ const getFriendlyMessageMock: MockFunction = getJestMockFunction();
31
+ const activityFeedMock: MockFunction = getJestMockFunction();
32
+ const widgetRendererMock: MockFunction = getJestMockFunction();
33
+
34
+ jest.mock("../../../UI/Utils/API/API", () => {
35
+ return {
36
+ __esModule: true,
37
+ default: {
38
+ post: (...args: Array<unknown>) => {
39
+ return postMock(...args);
40
+ },
41
+ getFriendlyMessage: (...args: Array<unknown>) => {
42
+ return getFriendlyMessageMock(...args);
43
+ },
44
+ },
45
+ };
46
+ });
47
+
48
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
49
+ return {
50
+ __esModule: true,
51
+ default: {
52
+ getCommonHeaders: () => {
53
+ return {};
54
+ },
55
+ },
56
+ };
57
+ });
58
+
59
+ jest.mock("../../../UI/Utils/User", () => {
60
+ return {
61
+ __esModule: true,
62
+ default: {
63
+ getName: () => {
64
+ return {
65
+ toString: () => {
66
+ return "Sam Lee";
67
+ },
68
+ };
69
+ },
70
+ getUserId: () => {
71
+ return {
72
+ toString: () => {
73
+ return "22222222-2222-4222-8222-222222222222";
74
+ },
75
+ };
76
+ },
77
+ },
78
+ };
79
+ });
80
+
81
+ /*
82
+ * The markdown renderer is stubbed, but it still calls the component's
83
+ * citation renderer for every [C#] in the text — exactly the contract the
84
+ * real inline-reference transform has — so the chips are really rendered.
85
+ */
86
+ jest.mock("../../../UI/Components/Markdown.tsx/LazyMarkdownViewer", () => {
87
+ return {
88
+ __esModule: true,
89
+ default: (props: {
90
+ text: string;
91
+ safeMode?: boolean;
92
+ inlineReferences?: {
93
+ renderCitation?: (id: string) => React.ReactElement | null;
94
+ };
95
+ }): React.ReactElement => {
96
+ const chips: Array<React.ReactElement | null> = Array.from(
97
+ props.text.matchAll(/\[(C\d+)\]/g),
98
+ ).map((match: RegExpMatchArray, index: number) => {
99
+ const chip: React.ReactElement | null =
100
+ props.inlineReferences?.renderCitation?.(match[1]!) ?? null;
101
+ return chip
102
+ ? React.createElement(React.Fragment, { key: index }, chip)
103
+ : null;
104
+ });
105
+
106
+ return React.createElement(
107
+ "div",
108
+ {
109
+ "data-testid": "answer-markdown",
110
+ "data-safe-mode": String(props.safeMode === true),
111
+ },
112
+ props.text,
113
+ ...chips,
114
+ );
115
+ },
116
+ };
117
+ });
118
+
119
+ const navigateToCitationTargetMock: MockFunction = getJestMockFunction();
120
+
121
+ jest.mock(
122
+ "../../../../App/FeatureSet/Dashboard/src/Components/AIChat/CitationTargetNav",
123
+ () => {
124
+ return {
125
+ __esModule: true,
126
+ navigateToCitationTarget: (...args: Array<unknown>) => {
127
+ return navigateToCitationTargetMock(...args);
128
+ },
129
+ };
130
+ },
131
+ );
132
+
133
+ jest.mock(
134
+ "../../../../App/FeatureSet/Dashboard/src/Components/AIChat/ChatActivityFeed",
135
+ () => {
136
+ return {
137
+ __esModule: true,
138
+ default: (props: { events: Array<unknown> }): React.ReactElement => {
139
+ activityFeedMock(props);
140
+ return React.createElement("div", { "data-testid": "live-steps" });
141
+ },
142
+ hasRenderableActivity: (events: Array<unknown>): boolean => {
143
+ return events.length > 0;
144
+ },
145
+ };
146
+ },
147
+ );
148
+
149
+ jest.mock(
150
+ "../../../../App/FeatureSet/Dashboard/src/Components/AIChat/Widgets/WidgetRenderer",
151
+ () => {
152
+ return {
153
+ __esModule: true,
154
+ default: (props: { widgets: Array<unknown> }): React.ReactElement => {
155
+ widgetRendererMock(props);
156
+ return React.createElement("div", { "data-testid": "answer-widgets" });
157
+ },
158
+ };
159
+ },
160
+ );
161
+
162
+ jest.mock(
163
+ "../../../../App/FeatureSet/Dashboard/src/Components/AIChat/CitationChips",
164
+ () => {
165
+ return {
166
+ __esModule: true,
167
+ default: (props: {
168
+ citations: Array<{ id: string; label: string }>;
169
+ }): React.ReactElement => {
170
+ return React.createElement(
171
+ "ul",
172
+ { "data-testid": "answer-sources" },
173
+ props.citations.map((citation: { id: string; label: string }) => {
174
+ return React.createElement(
175
+ "li",
176
+ { key: citation.id },
177
+ citation.label,
178
+ );
179
+ }),
180
+ );
181
+ },
182
+ };
183
+ },
184
+ );
185
+
186
+ import InvestigationConversation from "../../../../App/FeatureSet/Dashboard/src/Components/AI/InvestigationConversation/InvestigationConversation";
187
+ import {
188
+ THREAD_PERMISSION_MODE_STORAGE_KEY,
189
+ THREAD_POLL_BUSY_MS,
190
+ THREAD_POLL_IDLE_MS,
191
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/AI/InvestigationConversation/InvestigationConversationData";
192
+ import HTTPErrorResponse from "../../../Types/API/HTTPErrorResponse";
193
+ import AIChatMessageRole from "../../../Types/AI/AIChatMessageRole";
194
+ import AIChatMessageStatus from "../../../Types/AI/AIChatMessageStatus";
195
+ import AIChatPermissionMode from "../../../Types/AI/AIChatPermissionMode";
196
+ import { AIChatToolActionStatus } from "../../../Types/AI/AIChatTypes";
197
+ import AIRunEventType from "../../../Types/AI/AIRunEventType";
198
+ import AIRunStatus from "../../../Types/AI/AIRunStatus";
199
+ import { JSONObject } from "../../../Types/JSON";
200
+ import ObjectID from "../../../Types/ObjectID";
201
+
202
+ const PRIYA: string = "11111111-1111-4111-8111-111111111111";
203
+ const SAM: string = "22222222-2222-4222-8222-222222222222";
204
+ const INCIDENT_ID: ObjectID = new ObjectID(
205
+ "33333333-3333-4333-8333-333333333333",
206
+ );
207
+ const ALERT_ID: ObjectID = new ObjectID("44444444-4444-4444-8444-444444444444");
208
+ const RUN_ID: string = "55555555-5555-4555-8555-555555555555";
209
+ const ANSWER_ID: string = "66666666-6666-4666-8666-666666666666";
210
+
211
+ interface PostRequest {
212
+ url: { toString: () => string };
213
+ data: JSONObject;
214
+ }
215
+
216
+ function question(data: {
217
+ id: string;
218
+ content: string;
219
+ userId: string;
220
+ name: string;
221
+ }): JSONObject {
222
+ return {
223
+ _id: data.id,
224
+ role: AIChatMessageRole.User,
225
+ contentInMarkdown: data.content,
226
+ status: AIChatMessageStatus.Completed,
227
+ citations: [],
228
+ widgets: [],
229
+ toolActions: [],
230
+ errorMessage: null,
231
+ aiRunId: null,
232
+ createdAt: new Date().toISOString(),
233
+ author: { userId: data.userId, name: data.name },
234
+ };
235
+ }
236
+
237
+ function answer(data: {
238
+ id?: string;
239
+ content?: string;
240
+ status?: AIChatMessageStatus;
241
+ userId: string;
242
+ name: string;
243
+ citations?: Array<JSONObject>;
244
+ widgets?: Array<JSONObject>;
245
+ toolActions?: Array<JSONObject>;
246
+ errorMessage?: string;
247
+ }): JSONObject {
248
+ return {
249
+ _id: data.id || ANSWER_ID,
250
+ role: AIChatMessageRole.Assistant,
251
+ contentInMarkdown: data.content ?? "",
252
+ status: data.status || AIChatMessageStatus.Completed,
253
+ citations: data.citations || [],
254
+ widgets: data.widgets || [],
255
+ toolActions: data.toolActions || [],
256
+ errorMessage: data.errorMessage || null,
257
+ aiRunId: RUN_ID,
258
+ createdAt: new Date().toISOString(),
259
+ author: { userId: data.userId, name: data.name },
260
+ };
261
+ }
262
+
263
+ function threadResponse(data: {
264
+ messages: Array<JSONObject>;
265
+ isBusy?: boolean;
266
+ activeRun?: JSONObject | null;
267
+ }): { data: JSONObject } {
268
+ return {
269
+ data: {
270
+ conversationId:
271
+ data.messages.length > 0
272
+ ? "77777777-7777-4777-8777-777777777777"
273
+ : null,
274
+ messages: data.messages,
275
+ activeRun: data.activeRun ?? null,
276
+ isBusy: data.isBusy === true,
277
+ viewerUserId: SAM,
278
+ },
279
+ };
280
+ }
281
+
282
+ const EMPTY: { data: JSONObject } = threadResponse({ messages: [] });
283
+
284
+ // Respond by route, so polling and actions can interleave freely.
285
+ function routeResponses(responses: {
286
+ thread?: () => { data: JSONObject };
287
+ send?: () => { data: JSONObject } | HTTPErrorResponse;
288
+ approve?: () => { data: JSONObject };
289
+ cancel?: () => { data: JSONObject };
290
+ }): void {
291
+ postMock.mockImplementation(((request: PostRequest) => {
292
+ const path: string = request.url.toString();
293
+
294
+ if (path.endsWith("/ai-investigation/conversation/send-message")) {
295
+ return Promise.resolve(
296
+ responses.send
297
+ ? responses.send()
298
+ : { data: { assistantMessageId: ANSWER_ID, aiRunId: RUN_ID } },
299
+ );
300
+ }
301
+
302
+ if (path.endsWith("/ai-investigation/conversation/respond-to-approval")) {
303
+ return Promise.resolve(
304
+ responses.approve ? responses.approve() : { data: { aiRunId: RUN_ID } },
305
+ );
306
+ }
307
+
308
+ if (path.endsWith("/ai-investigation/conversation/cancel-run")) {
309
+ return Promise.resolve(
310
+ responses.cancel
311
+ ? responses.cancel()
312
+ : { data: { aiRunId: RUN_ID, cancelled: true } },
313
+ );
314
+ }
315
+
316
+ return Promise.resolve(responses.thread ? responses.thread() : EMPTY);
317
+ }) as never);
318
+ }
319
+
320
+ function requests(path: string): Array<PostRequest> {
321
+ return postMock.mock.calls
322
+ .map((call: Array<unknown>) => {
323
+ return call[0] as PostRequest;
324
+ })
325
+ .filter((request: PostRequest) => {
326
+ return request.url.toString().endsWith(path);
327
+ });
328
+ }
329
+
330
+ async function flush(): Promise<void> {
331
+ await act(async (): Promise<void> => {
332
+ for (let index: number = 0; index < 6; index++) {
333
+ await Promise.resolve();
334
+ }
335
+ });
336
+ }
337
+
338
+ async function tick(milliseconds: number): Promise<void> {
339
+ await act(async (): Promise<void> => {
340
+ jest.advanceTimersByTime(milliseconds);
341
+ for (let index: number = 0; index < 6; index++) {
342
+ await Promise.resolve();
343
+ }
344
+ });
345
+ }
346
+
347
+ function renderConversation(data?: {
348
+ subjectType?: "incident" | "alert";
349
+ subjectId?: ObjectID;
350
+ variant?: "embedded" | "card";
351
+ }): ReturnType<typeof render> {
352
+ return render(
353
+ <InvestigationConversation
354
+ subjectType={data?.subjectType || "incident"}
355
+ subjectId={data?.subjectId || INCIDENT_ID}
356
+ variant={data?.variant}
357
+ />,
358
+ );
359
+ }
360
+
361
+ function composer(): HTMLTextAreaElement {
362
+ return screen.getByRole("textbox") as HTMLTextAreaElement;
363
+ }
364
+
365
+ function sendButton(): HTMLElement {
366
+ return screen.getByTitle("Send (Enter)");
367
+ }
368
+
369
+ beforeEach(() => {
370
+ jest.useFakeTimers();
371
+ window.localStorage.clear();
372
+ getFriendlyMessageMock.mockImplementation((error: unknown): string => {
373
+ return error instanceof HTTPErrorResponse
374
+ ? error.message || "Request failed"
375
+ : "Request failed";
376
+ });
377
+ Object.assign(navigator, {
378
+ clipboard: {
379
+ writeText: jest.fn(() => {
380
+ return Promise.resolve();
381
+ }),
382
+ },
383
+ });
384
+ });
385
+
386
+ afterEach(() => {
387
+ cleanup();
388
+ jest.clearAllTimers();
389
+ jest.useRealTimers();
390
+ postMock.mockReset();
391
+ getFriendlyMessageMock.mockReset();
392
+ activityFeedMock.mockReset();
393
+ widgetRendererMock.mockReset();
394
+ navigateToCitationTargetMock.mockReset();
395
+ });
396
+
397
+ describe("InvestigationConversation — an empty thread", () => {
398
+ test("loads the incident's thread and invites the first question", async () => {
399
+ routeResponses({});
400
+
401
+ renderConversation();
402
+ expect(screen.getByText("Loading the conversation…")).toBeVisible();
403
+ await flush();
404
+
405
+ const load: PostRequest = requests("/ai-investigation/conversation")[0]!;
406
+ expect(load.data).toEqual({
407
+ subjectType: "incident",
408
+ subjectId: INCIDENT_ID.toString(),
409
+ });
410
+
411
+ expect(screen.getByText("Ask OneUptime AI")).toBeVisible();
412
+ expect(
413
+ screen.getByTestId("investigation-conversation-empty"),
414
+ ).toBeVisible();
415
+ expect(
416
+ screen.getByRole("button", { name: "What should I do right now?" }),
417
+ ).toBeVisible();
418
+ expect(
419
+ screen.getByText(/Everyone on this incident sees this conversation/),
420
+ ).toBeVisible();
421
+ });
422
+
423
+ test("the composer never steals focus from the page", async () => {
424
+ routeResponses({});
425
+
426
+ renderConversation();
427
+ await flush();
428
+
429
+ expect(document.activeElement).not.toBe(composer());
430
+ });
431
+
432
+ test("a question suggestion is asked in one click, in auto-run by default", async () => {
433
+ routeResponses({});
434
+
435
+ renderConversation();
436
+ await flush();
437
+
438
+ fireEvent.click(
439
+ screen.getByRole("button", { name: "What changed just before this?" }),
440
+ );
441
+ await flush();
442
+
443
+ const send: PostRequest = requests(
444
+ "/ai-investigation/conversation/send-message",
445
+ )[0]!;
446
+ expect(send.data["subjectType"]).toBe("incident");
447
+ expect(send.data["subjectId"]).toBe(INCIDENT_ID.toString());
448
+ expect(send.data["content"]).toContain(
449
+ "What changed right before this incident started",
450
+ );
451
+ expect(send.data["permissionMode"]).toBe(AIChatPermissionMode.AutoRun);
452
+ });
453
+
454
+ test("an action suggestion is placed in the composer, never sent on click", async () => {
455
+ routeResponses({});
456
+
457
+ renderConversation();
458
+ await flush();
459
+
460
+ fireEvent.click(
461
+ screen.getByRole("button", { name: "Acknowledge this incident" }),
462
+ );
463
+ await flush();
464
+
465
+ expect(composer().value).toBe("Acknowledge this incident.");
466
+ expect(
467
+ requests("/ai-investigation/conversation/send-message"),
468
+ ).toHaveLength(0);
469
+ });
470
+
471
+ test("an alert's thread talks about the alert", async () => {
472
+ routeResponses({});
473
+
474
+ renderConversation({ subjectType: "alert", subjectId: ALERT_ID });
475
+ await flush();
476
+
477
+ expect(requests("/ai-investigation/conversation")[0]!.data).toEqual({
478
+ subjectType: "alert",
479
+ subjectId: ALERT_ID.toString(),
480
+ });
481
+ expect(
482
+ screen.getByRole("button", { name: "Acknowledge this alert" }),
483
+ ).toBeVisible();
484
+ });
485
+
486
+ test("stands as its own card when asked to", async () => {
487
+ routeResponses({});
488
+
489
+ renderConversation({ variant: "card" });
490
+ await flush();
491
+
492
+ expect(screen.getByTestId("card")).toBeInTheDocument();
493
+ expect(screen.getAllByText("Ask OneUptime AI").length).toBeGreaterThan(0);
494
+ });
495
+ });
496
+
497
+ describe("InvestigationConversation — asking", () => {
498
+ test("typing and pressing Enter sends the question and shows it at once", async () => {
499
+ let asked: boolean = false;
500
+ routeResponses({
501
+ thread: () => {
502
+ return asked
503
+ ? threadResponse({
504
+ isBusy: true,
505
+ messages: [
506
+ question({
507
+ id: "q1",
508
+ content: "Which pods use the most memory?",
509
+ userId: SAM,
510
+ name: "Sam Lee",
511
+ }),
512
+ answer({
513
+ status: AIChatMessageStatus.InProgress,
514
+ userId: SAM,
515
+ name: "Sam Lee",
516
+ }),
517
+ ],
518
+ })
519
+ : EMPTY;
520
+ },
521
+ send: () => {
522
+ asked = true;
523
+ return { data: { assistantMessageId: ANSWER_ID, aiRunId: RUN_ID } };
524
+ },
525
+ });
526
+
527
+ renderConversation();
528
+ await flush();
529
+
530
+ fireEvent.change(composer(), {
531
+ target: { value: "Which pods use the most memory?" },
532
+ });
533
+ fireEvent.keyDown(composer(), { key: "Enter" });
534
+ await flush();
535
+
536
+ expect(
537
+ requests("/ai-investigation/conversation/send-message")[0]!.data[
538
+ "content"
539
+ ],
540
+ ).toBe("Which pods use the most memory?");
541
+ expect(composer().value).toBe("");
542
+ expect(screen.getByText("Which pods use the most memory?")).toBeVisible();
543
+ expect(screen.getByText("You")).toBeVisible();
544
+ expect(
545
+ screen.getByText("OneUptime AI is working on your question…"),
546
+ ).toBeVisible();
547
+ });
548
+
549
+ test("Shift+Enter does not send", async () => {
550
+ routeResponses({});
551
+
552
+ renderConversation();
553
+ await flush();
554
+
555
+ fireEvent.change(composer(), { target: { value: "line one" } });
556
+ fireEvent.keyDown(composer(), { key: "Enter", shiftKey: true });
557
+ await flush();
558
+
559
+ expect(
560
+ requests("/ai-investigation/conversation/send-message"),
561
+ ).toHaveLength(0);
562
+ });
563
+
564
+ test("a refused question is given back with the reason", async () => {
565
+ routeResponses({
566
+ send: () => {
567
+ return new HTTPErrorResponse(
568
+ 400,
569
+ {
570
+ message:
571
+ "OneUptime AI is still answering a question in this thread.",
572
+ },
573
+ {},
574
+ );
575
+ },
576
+ });
577
+ getFriendlyMessageMock.mockReturnValue(
578
+ "OneUptime AI is still answering a question in this thread.",
579
+ );
580
+
581
+ renderConversation();
582
+ await flush();
583
+
584
+ fireEvent.change(composer(), { target: { value: "And the node?" } });
585
+ fireEvent.click(sendButton());
586
+ await flush();
587
+
588
+ expect(
589
+ screen.getByText(
590
+ "OneUptime AI is still answering a question in this thread.",
591
+ ),
592
+ ).toBeVisible();
593
+ expect(composer().value).toBe("And the node?");
594
+ expect(screen.queryByText("Sending…")).toBeNull();
595
+ });
596
+
597
+ test("the chosen permission mode is used and remembered", async () => {
598
+ routeResponses({});
599
+
600
+ renderConversation();
601
+ await flush();
602
+
603
+ fireEvent.click(screen.getByTitle("Choose what the AI is allowed to do"));
604
+ fireEvent.click(screen.getByText("Read-only"));
605
+ await flush();
606
+
607
+ expect(
608
+ screen.getByText(
609
+ "OneUptime AI only reads and answers — it never changes anything.",
610
+ ),
611
+ ).toBeVisible();
612
+ expect(
613
+ window.localStorage.getItem(THREAD_PERMISSION_MODE_STORAGE_KEY),
614
+ ).toBe(AIChatPermissionMode.ReadOnly);
615
+
616
+ fireEvent.change(composer(), { target: { value: "What happened?" } });
617
+ fireEvent.click(sendButton());
618
+ await flush();
619
+
620
+ expect(
621
+ requests("/ai-investigation/conversation/send-message")[0]!.data[
622
+ "permissionMode"
623
+ ],
624
+ ).toBe(AIChatPermissionMode.ReadOnly);
625
+ });
626
+
627
+ test("a remembered mode is restored on the next visit", async () => {
628
+ window.localStorage.setItem(
629
+ THREAD_PERMISSION_MODE_STORAGE_KEY,
630
+ AIChatPermissionMode.AskForApproval,
631
+ );
632
+ routeResponses({});
633
+
634
+ renderConversation();
635
+ await flush();
636
+
637
+ expect(
638
+ screen.getByText("OneUptime AI asks before it changes anything."),
639
+ ).toBeVisible();
640
+ });
641
+ });
642
+
643
+ describe("InvestigationConversation — a shared thread", () => {
644
+ test("shows who asked what, and whom each answer was for", async () => {
645
+ routeResponses({
646
+ thread: () => {
647
+ return threadResponse({
648
+ messages: [
649
+ question({
650
+ id: "q1",
651
+ content: "Which pods use the most memory?",
652
+ userId: PRIYA,
653
+ name: "Priya Shah",
654
+ }),
655
+ answer({
656
+ content: "ClickHouse uses 120Gi [C1].",
657
+ userId: PRIYA,
658
+ name: "Priya Shah",
659
+ citations: [
660
+ {
661
+ id: "C1",
662
+ toolName: "run_kubectl",
663
+ label: 'kubectl top pods -A on cluster "prod"',
664
+ queryArguments: {},
665
+ rowCount: 1,
666
+ },
667
+ ],
668
+ }),
669
+ question({
670
+ id: "q2",
671
+ content: "And pgbouncer?",
672
+ userId: SAM,
673
+ name: "Sam Lee",
674
+ }),
675
+ ],
676
+ });
677
+ },
678
+ });
679
+
680
+ renderConversation();
681
+ await flush();
682
+
683
+ const questions: Array<HTMLElement> = screen.getAllByTestId(
684
+ "investigation-conversation-question",
685
+ );
686
+ expect(within(questions[0]!).getByText("Priya Shah")).toBeVisible();
687
+ expect(within(questions[1]!).getByText("You")).toBeVisible();
688
+
689
+ const reply: HTMLElement = screen.getByTestId(
690
+ "investigation-conversation-answer",
691
+ );
692
+ expect(within(reply).getByText("OneUptime AI")).toBeVisible();
693
+ expect(within(reply).getByText("to Priya Shah")).toBeVisible();
694
+ expect(within(reply).getByTestId("answer-markdown")).toHaveTextContent(
695
+ "ClickHouse uses 120Gi [C1].",
696
+ );
697
+ // Answers render through the safe markdown path.
698
+ expect(within(reply).getByTestId("answer-markdown")).toHaveAttribute(
699
+ "data-safe-mode",
700
+ "true",
701
+ );
702
+ expect(within(reply).getByTestId("answer-sources")).toHaveTextContent(
703
+ 'kubectl top pods -A on cluster "prod"',
704
+ );
705
+
706
+ // Everyone who asked, in the header.
707
+ expect(
708
+ screen.getByLabelText("2 people have asked in this conversation"),
709
+ ).toBeInTheDocument();
710
+ });
711
+
712
+ test("turns each [C#] into a chip naming its evidence, and opens linked evidence", async () => {
713
+ routeResponses({
714
+ thread: () => {
715
+ return threadResponse({
716
+ messages: [
717
+ answer({
718
+ content:
719
+ "Errors spiked [C1] while ClickHouse used 118Gi [C2]. [C9]",
720
+ userId: SAM,
721
+ name: "Sam Lee",
722
+ citations: [
723
+ {
724
+ id: "C1",
725
+ toolName: "search_logs",
726
+ label: "Error logs, last 1h",
727
+ queryArguments: {},
728
+ rowCount: 40,
729
+ target: { type: "Logs", params: {} },
730
+ },
731
+ {
732
+ id: "C2",
733
+ toolName: "run_kubectl",
734
+ label: 'kubectl top pods -A on cluster "prod"',
735
+ queryArguments: {},
736
+ rowCount: 1,
737
+ },
738
+ ],
739
+ }),
740
+ ],
741
+ });
742
+ },
743
+ });
744
+
745
+ renderConversation();
746
+ await flush();
747
+
748
+ const linked: HTMLElement = screen.getByRole("button", {
749
+ name: "Citation C1: Error logs, last 1h",
750
+ });
751
+ expect(linked).toHaveAttribute("title", "Error logs, last 1h");
752
+
753
+ fireEvent.click(linked);
754
+ expect(navigateToCitationTargetMock).toHaveBeenCalledWith({
755
+ type: "Logs",
756
+ params: {},
757
+ });
758
+
759
+ // Evidence with no page of its own is a chip, never a dead button.
760
+ const unlinked: HTMLElement = screen.getByLabelText(
761
+ 'Citation C2: kubectl top pods -A on cluster "prod"',
762
+ );
763
+ expect(unlinked.tagName).toBe("SPAN");
764
+
765
+ // A marker with no citation behind it stays plain text.
766
+ expect(document.querySelector('[data-citation-id="C9"]')).toBeNull();
767
+ });
768
+
769
+ test("another asker's charts and tables are not shown to the viewer", async () => {
770
+ const widget: JSONObject = {
771
+ id: "W1",
772
+ type: "Table",
773
+ title: "Top pods",
774
+ data: {},
775
+ };
776
+ routeResponses({
777
+ thread: () => {
778
+ return threadResponse({
779
+ messages: [
780
+ answer({
781
+ id: "a1",
782
+ content: "For Priya",
783
+ userId: PRIYA,
784
+ name: "Priya Shah",
785
+ widgets: [widget],
786
+ }),
787
+ answer({
788
+ id: "a2",
789
+ content: "For me",
790
+ userId: SAM,
791
+ name: "Sam Lee",
792
+ widgets: [widget],
793
+ }),
794
+ ],
795
+ });
796
+ },
797
+ });
798
+
799
+ renderConversation();
800
+ await flush();
801
+
802
+ expect(screen.getAllByTestId("answer-widgets")).toHaveLength(1);
803
+ const answers: Array<HTMLElement> = screen.getAllByTestId(
804
+ "investigation-conversation-answer",
805
+ );
806
+ expect(within(answers[0]!).queryByTestId("answer-widgets")).toBeNull();
807
+ expect(within(answers[1]!).getByTestId("answer-widgets")).toBeVisible();
808
+ });
809
+
810
+ test("an error and a stopped answer read plainly", async () => {
811
+ routeResponses({
812
+ thread: () => {
813
+ return threadResponse({
814
+ messages: [
815
+ answer({
816
+ id: "a1",
817
+ status: AIChatMessageStatus.Error,
818
+ errorMessage: "The AI provider is unavailable.",
819
+ userId: SAM,
820
+ name: "Sam Lee",
821
+ }),
822
+ answer({
823
+ id: "a2",
824
+ status: AIChatMessageStatus.Cancelled,
825
+ content: "Stopped by user.",
826
+ userId: SAM,
827
+ name: "Sam Lee",
828
+ }),
829
+ ],
830
+ });
831
+ },
832
+ });
833
+
834
+ renderConversation();
835
+ await flush();
836
+
837
+ expect(screen.getByText("The AI provider is unavailable.")).toBeVisible();
838
+ expect(screen.getByText("Ask again to retry.")).toBeVisible();
839
+ expect(screen.getByText("Stopped by user.")).toBeVisible();
840
+ });
841
+
842
+ test("copies an answer", async () => {
843
+ routeResponses({
844
+ thread: () => {
845
+ return threadResponse({
846
+ messages: [
847
+ answer({ content: "ClickHouse.", userId: SAM, name: "Sam Lee" }),
848
+ ],
849
+ });
850
+ },
851
+ });
852
+
853
+ renderConversation();
854
+ await flush();
855
+
856
+ fireEvent.click(screen.getByRole("button", { name: "Copy" }));
857
+ await flush();
858
+
859
+ expect(navigator.clipboard.writeText).toHaveBeenCalledWith("ClickHouse.");
860
+ expect(screen.getByRole("button", { name: "Copied" })).toBeVisible();
861
+ });
862
+ });
863
+
864
+ describe("InvestigationConversation — while OneUptime AI works", () => {
865
+ function busyThread(): { data: JSONObject } {
866
+ return threadResponse({
867
+ isBusy: true,
868
+ messages: [
869
+ question({
870
+ id: "q1",
871
+ content: "Which pods use the most memory?",
872
+ userId: PRIYA,
873
+ name: "Priya Shah",
874
+ }),
875
+ answer({
876
+ status: AIChatMessageStatus.InProgress,
877
+ userId: PRIYA,
878
+ name: "Priya Shah",
879
+ }),
880
+ ],
881
+ activeRun: {
882
+ aiRunId: RUN_ID,
883
+ assistantMessageId: ANSWER_ID,
884
+ status: AIRunStatus.Running,
885
+ events: [
886
+ {
887
+ _id: "88888888-8888-4888-8888-888888888888",
888
+ sequence: 1,
889
+ eventType: AIRunEventType.ToolCallStarted,
890
+ toolName: "run_kubectl",
891
+ },
892
+ ],
893
+ },
894
+ });
895
+ }
896
+
897
+ test("narrates whose question it is on and shows the live steps", async () => {
898
+ routeResponses({ thread: busyThread });
899
+
900
+ renderConversation();
901
+ await flush();
902
+
903
+ expect(
904
+ screen.getAllByText("OneUptime AI is working on Priya Shah's question…")
905
+ .length,
906
+ ).toBeGreaterThan(0);
907
+ expect(screen.getByTestId("live-steps")).toBeVisible();
908
+ expect(
909
+ (activityFeedMock.mock.calls[0]![0] as { events: Array<unknown> }).events,
910
+ ).toHaveLength(1);
911
+ });
912
+
913
+ test("a new question waits: typing works, sending does not", async () => {
914
+ routeResponses({ thread: busyThread });
915
+
916
+ renderConversation();
917
+ await flush();
918
+
919
+ fireEvent.change(composer(), { target: { value: "And the node?" } });
920
+ fireEvent.keyDown(composer(), { key: "Enter" });
921
+ await flush();
922
+
923
+ expect(composer().value).toBe("And the node?");
924
+ expect(
925
+ requests("/ai-investigation/conversation/send-message"),
926
+ ).toHaveLength(0);
927
+ expect(composer().placeholder).toBe(
928
+ "Type your next question — send it when this answer finishes…",
929
+ );
930
+ });
931
+
932
+ test("anyone on the incident can stop the answer", async () => {
933
+ routeResponses({ thread: busyThread });
934
+
935
+ renderConversation();
936
+ await flush();
937
+
938
+ fireEvent.click(screen.getByTitle("Stop generating"));
939
+ await flush();
940
+
941
+ expect(requests("/ai-investigation/conversation/cancel-run")).toHaveLength(
942
+ 1,
943
+ );
944
+ expect(
945
+ requests("/ai-investigation/conversation/cancel-run")[0]!.data,
946
+ ).toEqual({ subjectType: "incident", subjectId: INCIDENT_ID.toString() });
947
+ });
948
+
949
+ test("polls quickly while an answer is being written, slowly when idle", async () => {
950
+ let busy: boolean = true;
951
+ routeResponses({
952
+ thread: () => {
953
+ return busy ? busyThread() : EMPTY;
954
+ },
955
+ });
956
+
957
+ renderConversation();
958
+ await flush();
959
+
960
+ const loadsAfterMount: number = requests(
961
+ "/ai-investigation/conversation",
962
+ ).length;
963
+
964
+ await tick(THREAD_POLL_BUSY_MS);
965
+ expect(requests("/ai-investigation/conversation").length).toBe(
966
+ loadsAfterMount + 1,
967
+ );
968
+
969
+ busy = false;
970
+ await tick(THREAD_POLL_BUSY_MS);
971
+ const loadsWhenIdle: number = requests(
972
+ "/ai-investigation/conversation",
973
+ ).length;
974
+
975
+ await tick(THREAD_POLL_BUSY_MS);
976
+ expect(requests("/ai-investigation/conversation").length).toBe(
977
+ loadsWhenIdle,
978
+ );
979
+
980
+ await tick(THREAD_POLL_IDLE_MS);
981
+ expect(requests("/ai-investigation/conversation").length).toBe(
982
+ loadsWhenIdle + 1,
983
+ );
984
+ });
985
+ });
986
+
987
+ describe("InvestigationConversation — approvals", () => {
988
+ test("anyone can approve a paused action, and the decision is sent", async () => {
989
+ routeResponses({
990
+ thread: () => {
991
+ return threadResponse({
992
+ isBusy: true,
993
+ messages: [
994
+ answer({
995
+ status: AIChatMessageStatus.WaitingForApproval,
996
+ userId: PRIYA,
997
+ name: "Priya Shah",
998
+ toolActions: [
999
+ {
1000
+ id: "call-1",
1001
+ toolName: "acknowledge_incident",
1002
+ title: "Acknowledge incident #42",
1003
+ arguments: {},
1004
+ isMutation: true,
1005
+ requiresApproval: true,
1006
+ status: AIChatToolActionStatus.Pending,
1007
+ },
1008
+ ],
1009
+ }),
1010
+ ],
1011
+ });
1012
+ },
1013
+ });
1014
+
1015
+ renderConversation();
1016
+ await flush();
1017
+
1018
+ expect(
1019
+ screen.getByText(
1020
+ "I'd like to take this action. Review it and approve to continue.",
1021
+ ),
1022
+ ).toBeVisible();
1023
+ expect(screen.getByText("Acknowledge incident #42")).toBeVisible();
1024
+
1025
+ fireEvent.click(screen.getByRole("button", { name: /Run 1 action/ }));
1026
+ await flush();
1027
+
1028
+ const decision: PostRequest = requests(
1029
+ "/ai-investigation/conversation/respond-to-approval",
1030
+ )[0]!;
1031
+ expect(decision.data["assistantMessageId"]).toBe(ANSWER_ID);
1032
+ expect(decision.data["decisions"]).toEqual([
1033
+ { toolCallId: "call-1", approved: true },
1034
+ ]);
1035
+ });
1036
+ });
1037
+
1038
+ describe("InvestigationConversation — resilience", () => {
1039
+ test("a thread that cannot be loaded says so and can be retried", async () => {
1040
+ let fail: boolean = true;
1041
+ postMock.mockImplementation((() => {
1042
+ return fail
1043
+ ? Promise.resolve(
1044
+ new HTTPErrorResponse(500, { message: "Server error" }, {}),
1045
+ )
1046
+ : Promise.resolve(EMPTY);
1047
+ }) as never);
1048
+ getFriendlyMessageMock.mockReturnValue("Server error");
1049
+
1050
+ renderConversation();
1051
+ await flush();
1052
+
1053
+ expect(
1054
+ screen.getByText("Could not load the conversation: Server error"),
1055
+ ).toBeVisible();
1056
+
1057
+ fail = false;
1058
+ fireEvent.click(screen.getByRole("button", { name: "Try again" }));
1059
+ await flush();
1060
+
1061
+ expect(
1062
+ screen.getByTestId("investigation-conversation-empty"),
1063
+ ).toBeVisible();
1064
+ });
1065
+
1066
+ test("moving to another incident never shows the previous thread", async () => {
1067
+ routeResponses({
1068
+ thread: () => {
1069
+ return threadResponse({
1070
+ messages: [
1071
+ question({
1072
+ id: "q1",
1073
+ content: "Old incident question",
1074
+ userId: PRIYA,
1075
+ name: "Priya Shah",
1076
+ }),
1077
+ ],
1078
+ });
1079
+ },
1080
+ });
1081
+
1082
+ const view: ReturnType<typeof render> = renderConversation();
1083
+ await flush();
1084
+ expect(screen.getByText("Old incident question")).toBeVisible();
1085
+
1086
+ routeResponses({});
1087
+ const OTHER_INCIDENT: ObjectID = new ObjectID(
1088
+ "99999999-9999-4999-8999-999999999999",
1089
+ );
1090
+
1091
+ view.rerender(
1092
+ <InvestigationConversation
1093
+ subjectType="incident"
1094
+ subjectId={OTHER_INCIDENT}
1095
+ />,
1096
+ );
1097
+ await flush();
1098
+
1099
+ expect(screen.queryByText("Old incident question")).toBeNull();
1100
+ const loads: Array<PostRequest> = requests(
1101
+ "/ai-investigation/conversation",
1102
+ );
1103
+ expect(loads[loads.length - 1]!.data["subjectId"]).toBe(
1104
+ OTHER_INCIDENT.toString(),
1105
+ );
1106
+ });
1107
+ });