@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
@@ -16,6 +16,7 @@ import TablePermission from "../../../../../Server/Types/Database/Permissions/Ta
16
16
  import UpdatePermission from "../../../../../Server/Types/Database/Permissions/UpdatePermission";
17
17
  import DatabaseRequestType from "../../../../../Server/Types/BaseDatabase/DatabaseRequestType";
18
18
  import Query from "../../../../../Server/Types/Database/Query";
19
+ import QueryDeepPartialEntity from "../../../../../Types/Database/PartialEntity";
19
20
  import EnterpriseEdition from "../../../../../Server/Enterprise/EnterpriseEdition";
20
21
  import EnterpriseFeature, {
21
22
  ALL_ENTERPRISE_FEATURES,
@@ -60,10 +61,10 @@ import { setTestBillingEnabled } from "../../../Enterprise/TestBillingFlag";
60
61
 
61
62
  /*
62
63
  * EditionPermission is the license gate on enterprise CONFIGURATION: creating
63
- * or updating the eleven @TableEditionAccessControl({ requiresEnterprise })
64
- * models (project, global and status page SSO/OIDC, SCIM, team compliance).
64
+ * or updating the three @TableEditionAccessControl({ requiresEnterprise })
65
+ * models - project SCIM, status page SCIM and team compliance settings.
65
66
  *
66
- * The rules under test (design v2 section 0 and 3):
67
+ * The rules under test:
67
68
  * - billing on (the cloud): never refuses; plan gates live in
68
69
  * BillingPermission.
69
70
  * - internal root writes: never refused.
@@ -75,10 +76,18 @@ import { setTestBillingEnabled } from "../../../Enterprise/TestBillingFlag";
75
76
  * model's feature, and refused with the license message otherwise.
76
77
  * - an unknown snapshot (the first load has not finished, or reading it
77
78
  * throws) refuses writes - fail closed.
78
- * - the exception: an update that only tightens security (disabling an
79
- * identity provider, rotating a SCIM bearer token) needs no license, in
80
- * either edition. It is judged on what the update writes, which only
81
- * UpdatePermission has; without the data an update gets the full check.
79
+ * - the exception: an update that only tightens security (rotating a SCIM
80
+ * bearer token) needs no license, in either edition. It is judged on what
81
+ * the update writes, which only UpdatePermission has; without the data an
82
+ * update gets the full check.
83
+ *
84
+ * Single sign-on configuration (project, status page and global SAML/OIDC
85
+ * providers, and a global provider's project attachments) is Community
86
+ * Edition configuration: the edition check never refuses it, in any edition
87
+ * or license state, for any caller. Who may write it is decided by the usual
88
+ * table permissions (project owners and admins for project and status page
89
+ * providers, master admins for global ones), and on the cloud by the Scale
90
+ * plan gate (see SsoScalePlanGate.test.ts).
82
91
  *
83
92
  * Billing and the edition are pinned in every test: CI's config.env sets
84
93
  * BILLING_ENABLED=true, so an unpinned suite would only test the cloud path
@@ -110,14 +119,6 @@ type EditionState =
110
119
 
111
120
  const ENTERPRISE_MODELS: ReadonlyArray<[string, ModelType, EnterpriseFeature]> =
112
121
  [
113
- ["GlobalSSO", GlobalSSO, EnterpriseFeature.SSO],
114
- ["GlobalOIDC", GlobalOIDC, EnterpriseFeature.SSO],
115
- ["GlobalSSOProject", GlobalSSOProject, EnterpriseFeature.SSO],
116
- ["GlobalOIDCProject", GlobalOIDCProject, EnterpriseFeature.SSO],
117
- ["ProjectSSO", ProjectSSO, EnterpriseFeature.SSO],
118
- ["ProjectOIDC", ProjectOIDC, EnterpriseFeature.SSO],
119
- ["StatusPageSSO", StatusPageSSO, EnterpriseFeature.SSO],
120
- ["StatusPageOIDC", StatusPageOIDC, EnterpriseFeature.SSO],
121
122
  ["ProjectSCIM", ProjectSCIM, EnterpriseFeature.SCIM],
122
123
  ["StatusPageSCIM", StatusPageSCIM, EnterpriseFeature.SCIM],
123
124
  [
@@ -127,6 +128,34 @@ const ENTERPRISE_MODELS: ReadonlyArray<[string, ModelType, EnterpriseFeature]> =
127
128
  ],
128
129
  ];
129
130
 
131
+ // Community Edition configuration: never gated by the edition check.
132
+ const SSO_MODELS: ReadonlyArray<[string, ModelType]> = [
133
+ ["GlobalSSO", GlobalSSO],
134
+ ["GlobalOIDC", GlobalOIDC],
135
+ ["GlobalSSOProject", GlobalSSOProject],
136
+ ["GlobalOIDCProject", GlobalOIDCProject],
137
+ ["ProjectSSO", ProjectSSO],
138
+ ["ProjectOIDC", ProjectOIDC],
139
+ ["StatusPageSSO", StatusPageSSO],
140
+ ["StatusPageOIDC", StatusPageOIDC],
141
+ ];
142
+
143
+ // The single sign-on models a project owner configures.
144
+ const PROJECT_SSO_MODELS: ReadonlyArray<[string, ModelType]> = [
145
+ ["ProjectSSO", ProjectSSO],
146
+ ["ProjectOIDC", ProjectOIDC],
147
+ ["StatusPageSSO", StatusPageSSO],
148
+ ["StatusPageOIDC", StatusPageOIDC],
149
+ ];
150
+
151
+ // The single sign-on models only a master admin configures.
152
+ const GLOBAL_SSO_MODELS: ReadonlyArray<[string, ModelType]> = [
153
+ ["GlobalSSO", GlobalSSO],
154
+ ["GlobalOIDC", GlobalOIDC],
155
+ ["GlobalSSOProject", GlobalSSOProject],
156
+ ["GlobalOIDCProject", GlobalOIDCProject],
157
+ ];
158
+
130
159
  const ORDINARY_MODELS: ReadonlyArray<[string, ModelType]> = [
131
160
  ["Project", Project],
132
161
  ["Monitor", Monitor],
@@ -212,6 +241,11 @@ const propsFor: (caller: Caller) => DatabaseCommonInteractionProps = (
212
241
  return buildUserProps([Permission.ProjectOwner]);
213
242
  };
214
243
 
244
+ const masterAdminProps: () => DatabaseCommonInteractionProps =
245
+ (): DatabaseCommonInteractionProps => {
246
+ return { userId, isMasterAdmin: true };
247
+ };
248
+
215
249
  const describeEdition: (edition: EditionState) => string = (
216
250
  edition: EditionState,
217
251
  ): string => {
@@ -302,16 +336,19 @@ const runEditionCheck: (input: {
302
336
  modelType: ModelType;
303
337
  operation: DatabaseRequestType;
304
338
  caller: Caller;
339
+ data?: unknown;
305
340
  }) => Outcome = (input: {
306
341
  modelType: ModelType;
307
342
  operation: DatabaseRequestType;
308
343
  caller: Caller;
344
+ data?: unknown;
309
345
  }): Outcome => {
310
346
  try {
311
347
  const result: unknown = EditionPermissions.checkEditionPermissions(
312
348
  input.modelType,
313
349
  propsFor(input.caller),
314
350
  input.operation,
351
+ input.data,
315
352
  );
316
353
 
317
354
  // A Promise here would mean a refusal could be lost to a missed await.
@@ -394,9 +431,29 @@ const allEditionStates: () => Array<EditionState> = (): Array<EditionState> => {
394
431
 
395
432
  states.push({ kind: "enterprise", snapshot: null });
396
433
 
434
+ // A usable license that leaves every runtime feature out.
435
+ states.push({
436
+ kind: "enterprise",
437
+ snapshot: createLicenseSnapshot({
438
+ features: [EnterpriseFeature.TeamCompliance],
439
+ }),
440
+ });
441
+
397
442
  return states;
398
443
  };
399
444
 
445
+ const withoutFeature: (
446
+ models: ReadonlyArray<[string, ModelType]>,
447
+ ) => Array<[string, ModelType, null]> = (
448
+ models: ReadonlyArray<[string, ModelType]>,
449
+ ): Array<[string, ModelType, null]> => {
450
+ return models.map(
451
+ ([name, modelType]: [string, ModelType]): [string, ModelType, null] => {
452
+ return [name, modelType, null];
453
+ },
454
+ );
455
+ };
456
+
400
457
  describe("EditionPermission.checkEditionPermissions", () => {
401
458
  beforeEach(() => {
402
459
  setTestBillingEnabled(false);
@@ -429,6 +486,25 @@ describe("EditionPermission.checkEditionPermissions", () => {
429
486
  },
430
487
  );
431
488
 
489
+ test.each([true, false])(
490
+ "billing=%p: the single sign-on models are never gated in any edition state",
491
+ (billing: boolean) => {
492
+ const mismatches: Array<string> = [];
493
+
494
+ for (const edition of allEditionStates()) {
495
+ mismatches.push(
496
+ ...findMismatches({
497
+ billing,
498
+ edition,
499
+ models: withoutFeature(SSO_MODELS),
500
+ }),
501
+ );
502
+ }
503
+
504
+ expect(mismatches).toEqual([]);
505
+ },
506
+ );
507
+
432
508
  test.each([true, false])(
433
509
  "billing=%p: ordinary models are never gated in any edition state",
434
510
  (billing: boolean) => {
@@ -439,15 +515,7 @@ describe("EditionPermission.checkEditionPermissions", () => {
439
515
  ...findMismatches({
440
516
  billing,
441
517
  edition,
442
- models: ORDINARY_MODELS.map(
443
- ([name, modelType]: [string, ModelType]): [
444
- string,
445
- ModelType,
446
- null,
447
- ] => {
448
- return [name, modelType, null];
449
- },
450
- ),
518
+ models: withoutFeature(ORDINARY_MODELS),
451
519
  }),
452
520
  );
453
521
  }
@@ -484,7 +552,7 @@ describe("EditionPermission.checkEditionPermissions", () => {
484
552
 
485
553
  expect(
486
554
  runEditionCheck({
487
- modelType: ProjectSSO,
555
+ modelType: ProjectSCIM,
488
556
  operation: DatabaseRequestType.Create,
489
557
  caller: "regular user",
490
558
  }),
@@ -521,6 +589,37 @@ describe("EditionPermission.checkEditionPermissions", () => {
521
589
  },
522
590
  );
523
591
 
592
+ test.each(SSO_MODELS)(
593
+ "%s: create and update are allowed, for users and master admins",
594
+ (_name: string, modelType: ModelType) => {
595
+ for (const caller of ALL_CALLERS) {
596
+ for (const operation of ALL_OPERATIONS) {
597
+ expect(runEditionCheck({ modelType, operation, caller })).toBe(
598
+ "allowed",
599
+ );
600
+ }
601
+ }
602
+
603
+ // Whatever the update writes: there is no tighten-only rule to meet.
604
+ for (const data of [
605
+ { isEnabled: true },
606
+ { isEnabled: false },
607
+ { name: "Okta", isEnabled: true },
608
+ {},
609
+ undefined,
610
+ ]) {
611
+ expect(
612
+ runEditionCheck({
613
+ modelType,
614
+ operation: DatabaseRequestType.Update,
615
+ caller: "regular user",
616
+ data,
617
+ }),
618
+ ).toBe("allowed");
619
+ }
620
+ },
621
+ );
622
+
524
623
  test.each(ENTERPRISE_MODELS)(
525
624
  "%s: read and delete stay allowed so leftover configuration can be seen and removed",
526
625
  (_name: string, modelType: ModelType) => {
@@ -636,23 +735,51 @@ describe("EditionPermission.checkEditionPermissions", () => {
636
735
  },
637
736
  );
638
737
 
738
+ test.each(UNUSABLE_STATUSES)(
739
+ "a %s license leaves single sign-on configuration writable, for users and master admins",
740
+ (status: EnterpriseLicenseStatus) => {
741
+ installFakeEnterpriseModule({
742
+ snapshot: createLicenseSnapshotWithStatus(status),
743
+ });
744
+
745
+ for (const [, modelType] of SSO_MODELS) {
746
+ for (const caller of ALL_CALLERS) {
747
+ for (const operation of ALL_OPERATIONS) {
748
+ expect(runEditionCheck({ modelType, operation, caller })).toBe(
749
+ "allowed",
750
+ );
751
+ }
752
+ }
753
+ }
754
+ },
755
+ );
756
+
639
757
  test("before the first license load finishes (no snapshot) writes are refused - fail closed", () => {
640
758
  installFakeEnterpriseModule({ snapshot: null });
641
759
 
642
760
  expect(
643
761
  runEditionCheck({
644
- modelType: GlobalSSO,
762
+ modelType: ProjectSCIM,
645
763
  operation: DatabaseRequestType.Create,
646
764
  caller: "master admin",
647
765
  }),
648
766
  ).toBe("license");
649
767
  expect(
650
768
  runEditionCheck({
651
- modelType: GlobalSSO,
769
+ modelType: ProjectSCIM,
652
770
  operation: DatabaseRequestType.Read,
653
771
  caller: "master admin",
654
772
  }),
655
773
  ).toBe("allowed");
774
+
775
+ // Single sign-on never waits for the license.
776
+ expect(
777
+ runEditionCheck({
778
+ modelType: GlobalSSO,
779
+ operation: DatabaseRequestType.Create,
780
+ caller: "master admin",
781
+ }),
782
+ ).toBe("allowed");
656
783
  });
657
784
 
658
785
  test("a snapshot read that throws refuses writes - fail closed", () => {
@@ -661,18 +788,25 @@ describe("EditionPermission.checkEditionPermissions", () => {
661
788
 
662
789
  expect(
663
790
  runEditionCheck({
664
- modelType: ProjectSSO,
791
+ modelType: TeamComplianceSetting,
665
792
  operation: DatabaseRequestType.Update,
666
793
  caller: "regular user",
667
794
  }),
668
795
  ).toBe("license");
669
796
  expect(
670
797
  runEditionCheck({
671
- modelType: ProjectSSO,
798
+ modelType: TeamComplianceSetting,
672
799
  operation: DatabaseRequestType.Delete,
673
800
  caller: "regular user",
674
801
  }),
675
802
  ).toBe("allowed");
803
+ expect(
804
+ runEditionCheck({
805
+ modelType: ProjectSSO,
806
+ operation: DatabaseRequestType.Update,
807
+ caller: "regular user",
808
+ }),
809
+ ).toBe("allowed");
676
810
  });
677
811
 
678
812
  test("the check follows the license as it changes, with no restart", () => {
@@ -773,7 +907,7 @@ describe("EditionPermission.checkEditionPermissions", () => {
773
907
  },
774
908
  );
775
909
 
776
- test("an empty feature list entitles nothing", () => {
910
+ test("an empty feature list entitles nothing, and single sign-on needs no feature", () => {
777
911
  installFakeEnterpriseModule({
778
912
  snapshot: createLicenseSnapshot({ features: [] }),
779
913
  });
@@ -787,6 +921,16 @@ describe("EditionPermission.checkEditionPermissions", () => {
787
921
  }),
788
922
  ).toBe("license");
789
923
  }
924
+
925
+ for (const [, modelType] of SSO_MODELS) {
926
+ expect(
927
+ runEditionCheck({
928
+ modelType,
929
+ operation: DatabaseRequestType.Create,
930
+ caller: "regular user",
931
+ }),
932
+ ).toBe("allowed");
933
+ }
790
934
  });
791
935
  });
792
936
 
@@ -794,6 +938,8 @@ describe("EditionPermission.checkEditionPermissions", () => {
794
938
  /*
795
939
  * The facade's guard test should make this impossible; if it ever
796
940
  * happens the gate must fail closed rather than let the write through.
941
+ * (It is also why the single sign-on models lost their
942
+ * requiresEnterprise decorator, not only their map entries.)
797
943
  */
798
944
  class UnmappedEnterpriseModel extends Monitor {}
799
945
 
@@ -885,12 +1031,13 @@ describe("EditionPermission wiring through the permission entry points", () => {
885
1031
  });
886
1032
 
887
1033
  describe("CreatePermission: master admins are checked before their early return", () => {
888
- test("a master admin cannot create a global SSO provider on the Community Edition", () => {
1034
+ test("a master admin cannot create a project's SCIM configuration on the Community Edition", () => {
889
1035
  expect(() => {
890
- CreatePermission.checkCreatePermissions(GlobalSSO, new GlobalSSO(), {
891
- userId,
892
- isMasterAdmin: true,
893
- });
1036
+ CreatePermission.checkCreatePermissions(
1037
+ ProjectSCIM,
1038
+ new ProjectSCIM(),
1039
+ masterAdminProps(),
1040
+ );
894
1041
  }).toThrow(
895
1042
  new PaymentRequiredException(
896
1043
  EnterpriseEdition.COMMUNITY_EDITION_MESSAGE,
@@ -898,16 +1045,17 @@ describe("EditionPermission wiring through the permission entry points", () => {
898
1045
  );
899
1046
  });
900
1047
 
901
- test("a master admin cannot create a global OIDC provider when the license expired", () => {
1048
+ test("a master admin cannot create team compliance settings when the license expired", () => {
902
1049
  installFakeEnterpriseModule({
903
1050
  snapshot: createLicenseSnapshotWithStatus("expired"),
904
1051
  });
905
1052
 
906
1053
  expect(() => {
907
- CreatePermission.checkCreatePermissions(GlobalOIDC, new GlobalOIDC(), {
908
- userId,
909
- isMasterAdmin: true,
910
- });
1054
+ CreatePermission.checkCreatePermissions(
1055
+ TeamComplianceSetting,
1056
+ new TeamComplianceSetting(),
1057
+ masterAdminProps(),
1058
+ );
911
1059
  }).toThrow(
912
1060
  new PaymentRequiredException(
913
1061
  EnterpriseEdition.LICENSE_REQUIRED_MESSAGE,
@@ -915,37 +1063,42 @@ describe("EditionPermission wiring through the permission entry points", () => {
915
1063
  );
916
1064
  });
917
1065
 
918
- test("a master admin can create one with a valid license", () => {
1066
+ test("a master admin can create them with a valid license", () => {
919
1067
  installFakeEnterpriseModule();
920
1068
 
921
1069
  expect(() => {
922
- CreatePermission.checkCreatePermissions(GlobalSSO, new GlobalSSO(), {
923
- userId,
924
- isMasterAdmin: true,
925
- });
1070
+ CreatePermission.checkCreatePermissions(
1071
+ StatusPageSCIM,
1072
+ new StatusPageSCIM(),
1073
+ masterAdminProps(),
1074
+ );
926
1075
  }).not.toThrow();
927
1076
  });
928
1077
 
929
1078
  test("internal root writes are not checked", () => {
930
1079
  expect(() => {
931
- CreatePermission.checkCreatePermissions(GlobalSSO, new GlobalSSO(), {
932
- isRoot: true,
933
- });
1080
+ CreatePermission.checkCreatePermissions(
1081
+ ProjectSCIM,
1082
+ new ProjectSCIM(),
1083
+ { isRoot: true },
1084
+ );
934
1085
  }).not.toThrow();
935
1086
  expect(() => {
936
- CreatePermission.checkCreatePermissions(GlobalSSO, new GlobalSSO(), {
937
- isRoot: true,
938
- isMasterAdmin: true,
939
- });
1087
+ CreatePermission.checkCreatePermissions(
1088
+ ProjectSCIM,
1089
+ new ProjectSCIM(),
1090
+ { isRoot: true, isMasterAdmin: true },
1091
+ );
940
1092
  }).not.toThrow();
941
1093
  });
942
1094
 
943
1095
  test("a master admin creating an ordinary model is unaffected", () => {
944
1096
  expect(() => {
945
- CreatePermission.checkCreatePermissions(Project, new Project(), {
946
- userId,
947
- isMasterAdmin: true,
948
- });
1097
+ CreatePermission.checkCreatePermissions(
1098
+ Project,
1099
+ new Project(),
1100
+ masterAdminProps(),
1101
+ );
949
1102
  }).not.toThrow();
950
1103
  });
951
1104
 
@@ -953,29 +1106,93 @@ describe("EditionPermission wiring through the permission entry points", () => {
953
1106
  setTestBillingEnabled(true);
954
1107
 
955
1108
  expect(() => {
956
- CreatePermission.checkCreatePermissions(GlobalSSO, new GlobalSSO(), {
957
- userId,
958
- isMasterAdmin: true,
959
- });
1109
+ CreatePermission.checkCreatePermissions(
1110
+ ProjectSCIM,
1111
+ new ProjectSCIM(),
1112
+ masterAdminProps(),
1113
+ );
960
1114
  }).not.toThrow();
961
1115
  });
1116
+
1117
+ describe.each([
1118
+ [
1119
+ "the Community Edition",
1120
+ (): void => {
1121
+ return uninstallEnterpriseModule();
1122
+ },
1123
+ ],
1124
+ [
1125
+ "an expired license",
1126
+ (): void => {
1127
+ installFakeEnterpriseModule({
1128
+ snapshot: createLicenseSnapshotWithStatus("expired"),
1129
+ });
1130
+ },
1131
+ ],
1132
+ [
1133
+ "no license snapshot yet",
1134
+ (): void => {
1135
+ installFakeEnterpriseModule({ snapshot: null });
1136
+ },
1137
+ ],
1138
+ [
1139
+ "a valid license",
1140
+ (): void => {
1141
+ installFakeEnterpriseModule();
1142
+ },
1143
+ ],
1144
+ ] as Array<[string, () => void]>)(
1145
+ "on %s",
1146
+ (_state: string, install: () => void) => {
1147
+ beforeEach(() => {
1148
+ install();
1149
+ });
1150
+
1151
+ test.each(GLOBAL_SSO_MODELS)(
1152
+ "a master admin can create %s (global single sign-on)",
1153
+ (_name: string, modelType: ModelType) => {
1154
+ expect(() => {
1155
+ CreatePermission.checkCreatePermissions(
1156
+ modelType,
1157
+ new modelType(),
1158
+ masterAdminProps(),
1159
+ );
1160
+ }).not.toThrow();
1161
+ },
1162
+ );
1163
+
1164
+ test.each(PROJECT_SSO_MODELS)(
1165
+ "a master admin can create %s too",
1166
+ (_name: string, modelType: ModelType) => {
1167
+ expect(() => {
1168
+ CreatePermission.checkCreatePermissions(
1169
+ modelType,
1170
+ new modelType(),
1171
+ masterAdminProps(),
1172
+ );
1173
+ }).not.toThrow();
1174
+ },
1175
+ );
1176
+ },
1177
+ );
962
1178
  });
963
1179
 
964
1180
  /*
965
- * These use { isEnabled: true }: switching a provider ON is configuration.
966
- * Switching one off is a tighten-only update, allowed without the license
967
- * (see "tighten-only updates" below).
1181
+ * These use a column that is not a tighten-only update: a SCIM change
1182
+ * other than rotating the bearer token is configuration.
968
1183
  */
969
1184
  describe("UpdatePermission: master admins are checked before their early return", () => {
970
- const query: Query<GlobalSSO> = { name: "Okta" } as Query<GlobalSSO>;
1185
+ const query: Query<ProjectSCIM> = {
1186
+ _id: "44444444-4444-4444-8444-444444444444",
1187
+ } as Query<ProjectSCIM>;
971
1188
 
972
- test("a master admin cannot update a global SSO provider on the Community Edition", async () => {
1189
+ test("a master admin cannot update a project's SCIM configuration on the Community Edition", async () => {
973
1190
  await expect(
974
1191
  UpdatePermission.checkUpdatePermissions(
975
- GlobalSSO,
1192
+ ProjectSCIM,
976
1193
  query,
977
- { isEnabled: true },
978
- { userId, isMasterAdmin: true },
1194
+ { autoProvisionUsers: true },
1195
+ masterAdminProps(),
979
1196
  ),
980
1197
  ).rejects.toThrow(
981
1198
  new PaymentRequiredException(
@@ -993,10 +1210,10 @@ describe("EditionPermission wiring through the permission entry points", () => {
993
1210
 
994
1211
  await expect(
995
1212
  UpdatePermission.checkUpdatePermissions(
996
- GlobalSSO,
1213
+ ProjectSCIM,
997
1214
  query,
998
- { isEnabled: true },
999
- { userId, isMasterAdmin: true },
1215
+ { autoProvisionUsers: true },
1216
+ masterAdminProps(),
1000
1217
  ),
1001
1218
  ).rejects.toThrow(
1002
1219
  new PaymentRequiredException(
@@ -1015,10 +1232,10 @@ describe("EditionPermission wiring through the permission entry points", () => {
1015
1232
 
1016
1233
  await expect(
1017
1234
  UpdatePermission.checkUpdatePermissions(
1018
- GlobalSSO,
1235
+ ProjectSCIM,
1019
1236
  query,
1020
- { isEnabled: true },
1021
- { userId, isMasterAdmin: true },
1237
+ { autoProvisionUsers: true },
1238
+ masterAdminProps(),
1022
1239
  ),
1023
1240
  ).resolves.toBe(query);
1024
1241
  },
@@ -1027,79 +1244,247 @@ describe("EditionPermission wiring through the permission entry points", () => {
1027
1244
  test("internal root updates are not checked", async () => {
1028
1245
  await expect(
1029
1246
  UpdatePermission.checkUpdatePermissions(
1030
- GlobalSSO,
1247
+ ProjectSCIM,
1031
1248
  query,
1032
- { isEnabled: false },
1249
+ { autoProvisionUsers: false },
1033
1250
  { isRoot: true },
1034
1251
  ),
1035
1252
  ).resolves.toBe(query);
1036
1253
  });
1254
+
1255
+ test.each([
1256
+ [
1257
+ "the Community Edition",
1258
+ (): void => {
1259
+ return uninstallEnterpriseModule();
1260
+ },
1261
+ ],
1262
+ ...UNUSABLE_STATUSES.map((status: EnterpriseLicenseStatus) => {
1263
+ return [
1264
+ `a ${status} license`,
1265
+ (): void => {
1266
+ installFakeEnterpriseModule({
1267
+ snapshot: createLicenseSnapshotWithStatus(status),
1268
+ });
1269
+ },
1270
+ ];
1271
+ }),
1272
+ ] as Array<[string, () => void]>)(
1273
+ "on %s a master admin can switch global single sign-on providers on and edit them",
1274
+ async (_state: string, install: () => void) => {
1275
+ install();
1276
+
1277
+ const globalQuery: Query<GlobalSSO> = {
1278
+ name: "Okta",
1279
+ } as Query<GlobalSSO>;
1280
+
1281
+ await expect(
1282
+ UpdatePermission.checkUpdatePermissions(
1283
+ GlobalSSO,
1284
+ globalQuery,
1285
+ { isEnabled: true, name: "Okta (renamed)" },
1286
+ masterAdminProps(),
1287
+ ),
1288
+ ).resolves.toBe(globalQuery);
1289
+ await expect(
1290
+ UpdatePermission.checkUpdatePermissions(
1291
+ GlobalOIDC,
1292
+ globalQuery as unknown as Query<GlobalOIDC>,
1293
+ { isEnabled: false, restrictToAttachedProjects: false },
1294
+ masterAdminProps(),
1295
+ ),
1296
+ ).resolves.toBe(globalQuery);
1297
+ await expect(
1298
+ UpdatePermission.checkUpdatePermissions(
1299
+ GlobalSSOProject,
1300
+ globalQuery as unknown as Query<GlobalSSOProject>,
1301
+ { isEnabled: true },
1302
+ masterAdminProps(),
1303
+ ),
1304
+ ).resolves.toBe(globalQuery);
1305
+ await expect(
1306
+ UpdatePermission.checkUpdatePermissions(
1307
+ GlobalOIDCProject,
1308
+ globalQuery as unknown as Query<GlobalOIDCProject>,
1309
+ { isEnabled: true },
1310
+ masterAdminProps(),
1311
+ ),
1312
+ ).resolves.toBe(globalQuery);
1313
+ },
1314
+ );
1037
1315
  });
1038
1316
 
1039
- describe("DeletePermission: removing leftover configuration always works", () => {
1040
- test.each(ENTERPRISE_MODELS)(
1317
+ describe("DeletePermission: removing configuration always works", () => {
1318
+ test.each([
1319
+ ...ENTERPRISE_MODELS.map(
1320
+ ([name, modelType]: [string, ModelType, EnterpriseFeature]): [
1321
+ string,
1322
+ ModelType,
1323
+ ] => {
1324
+ return [name, modelType];
1325
+ },
1326
+ ),
1327
+ ...SSO_MODELS,
1328
+ ])(
1041
1329
  "a master admin can delete %s on the Community Edition",
1042
1330
  async (_name: string, modelType: ModelType) => {
1043
1331
  await expect(
1044
1332
  DeletePermission.checkDeletePermission(
1045
1333
  modelType,
1046
1334
  {},
1047
- { userId, isMasterAdmin: true },
1335
+ masterAdminProps(),
1048
1336
  ),
1049
1337
  ).resolves.toEqual({});
1050
1338
  },
1051
1339
  );
1052
1340
 
1053
1341
  test("a project owner passes the table-level delete check on the Community Edition", () => {
1054
- expect(() => {
1055
- TablePermission.checkTableLevelPermissions(
1056
- ProjectSSO,
1057
- buildUserProps([Permission.ProjectOwner]),
1058
- DatabaseRequestType.Delete,
1059
- );
1060
- }).not.toThrow();
1342
+ for (const modelType of [ProjectSCIM, ProjectSSO, StatusPageOIDC]) {
1343
+ expect(() => {
1344
+ TablePermission.checkTableLevelPermissions(
1345
+ modelType,
1346
+ buildUserProps([Permission.ProjectOwner]),
1347
+ DatabaseRequestType.Delete,
1348
+ );
1349
+ }).not.toThrow();
1350
+ }
1061
1351
  });
1062
1352
  });
1063
1353
 
1064
1354
  describe("TablePermission: the operation reaches the edition check", () => {
1065
- test("a project owner's create is refused on the Community Edition", () => {
1355
+ test("a project owner's create of SCIM configuration is refused on the Community Edition", () => {
1066
1356
  expect(() => {
1067
1357
  TablePermission.checkTableLevelPermissions(
1068
- ProjectSSO,
1358
+ ProjectSCIM,
1069
1359
  buildUserProps([Permission.ProjectOwner]),
1070
1360
  DatabaseRequestType.Create,
1071
1361
  );
1072
- }).toThrow(PaymentRequiredException);
1362
+ }).toThrow(
1363
+ new PaymentRequiredException(
1364
+ EnterpriseEdition.COMMUNITY_EDITION_MESSAGE,
1365
+ ),
1366
+ );
1073
1367
  });
1074
1368
 
1075
- test("a project owner's read is allowed on the Community Edition", () => {
1369
+ test("a project owner's read of SCIM configuration is allowed on the Community Edition", () => {
1076
1370
  expect(() => {
1077
1371
  TablePermission.checkTableLevelPermissions(
1078
- ProjectSSO,
1372
+ ProjectSCIM,
1079
1373
  buildUserProps([Permission.ProjectOwner]),
1080
1374
  DatabaseRequestType.Read,
1081
1375
  );
1082
1376
  }).not.toThrow();
1083
1377
  });
1084
1378
 
1085
- test("a project owner's create passes with a valid license", () => {
1379
+ test("a project owner's create of SCIM configuration passes with a valid license", () => {
1086
1380
  installFakeEnterpriseModule();
1087
1381
 
1088
1382
  expect(() => {
1089
1383
  TablePermission.checkTableLevelPermissions(
1090
- ProjectSSO,
1384
+ ProjectSCIM,
1091
1385
  buildUserProps([Permission.ProjectOwner]),
1092
1386
  DatabaseRequestType.Create,
1093
1387
  );
1094
1388
  }).not.toThrow();
1095
1389
  });
1096
1390
 
1391
+ describe.each([
1392
+ [
1393
+ "the Community Edition",
1394
+ (): void => {
1395
+ return uninstallEnterpriseModule();
1396
+ },
1397
+ ],
1398
+ ...UNUSABLE_STATUSES.map((status: EnterpriseLicenseStatus) => {
1399
+ return [
1400
+ `a ${status} license`,
1401
+ (): void => {
1402
+ installFakeEnterpriseModule({
1403
+ snapshot: createLicenseSnapshotWithStatus(status),
1404
+ });
1405
+ },
1406
+ ];
1407
+ }),
1408
+ [
1409
+ "a valid license",
1410
+ (): void => {
1411
+ installFakeEnterpriseModule();
1412
+ },
1413
+ ],
1414
+ ] as Array<[string, () => void]>)(
1415
+ "on %s",
1416
+ (_state: string, install: () => void) => {
1417
+ beforeEach(() => {
1418
+ install();
1419
+ });
1420
+
1421
+ test.each(PROJECT_SSO_MODELS)(
1422
+ "a project owner can create and read %s",
1423
+ (_name: string, modelType: ModelType) => {
1424
+ for (const operation of [
1425
+ DatabaseRequestType.Create,
1426
+ DatabaseRequestType.Read,
1427
+ DatabaseRequestType.Delete,
1428
+ ]) {
1429
+ expect(() => {
1430
+ TablePermission.checkTableLevelPermissions(
1431
+ modelType,
1432
+ buildUserProps([Permission.ProjectOwner]),
1433
+ operation,
1434
+ );
1435
+ }).not.toThrow();
1436
+ }
1437
+ },
1438
+ );
1439
+
1440
+ test.each(PROJECT_SSO_MODELS)(
1441
+ "a project admin can create %s",
1442
+ (_name: string, modelType: ModelType) => {
1443
+ expect(() => {
1444
+ TablePermission.checkTableLevelPermissions(
1445
+ modelType,
1446
+ buildUserProps([Permission.ProjectAdmin]),
1447
+ DatabaseRequestType.Create,
1448
+ );
1449
+ }).not.toThrow();
1450
+ },
1451
+ );
1452
+
1453
+ // The right roles still decide: the edition gate never replaced them.
1454
+ test.each(PROJECT_SSO_MODELS)(
1455
+ "a project member still cannot create %s",
1456
+ (_name: string, modelType: ModelType) => {
1457
+ expect(() => {
1458
+ TablePermission.checkTableLevelPermissions(
1459
+ modelType,
1460
+ buildUserProps([Permission.ProjectMember]),
1461
+ DatabaseRequestType.Create,
1462
+ );
1463
+ }).toThrow(NotAuthorizedException);
1464
+ },
1465
+ );
1466
+
1467
+ test.each(GLOBAL_SSO_MODELS)(
1468
+ "a project owner still cannot create %s (global single sign-on is for master admins)",
1469
+ (_name: string, modelType: ModelType) => {
1470
+ expect(() => {
1471
+ TablePermission.checkTableLevelPermissions(
1472
+ modelType,
1473
+ buildUserProps([Permission.ProjectOwner]),
1474
+ DatabaseRequestType.Create,
1475
+ );
1476
+ }).toThrow(NotAuthorizedException);
1477
+ },
1478
+ );
1479
+ },
1480
+ );
1481
+
1097
1482
  test("the edition check does not replace the permission check: a licensed install still refuses a user without permission", () => {
1098
1483
  installFakeEnterpriseModule();
1099
1484
 
1100
1485
  expect(() => {
1101
1486
  TablePermission.checkTableLevelPermissions(
1102
- ProjectSSO,
1487
+ ProjectSCIM,
1103
1488
  buildUserProps([Permission.ProjectMember]),
1104
1489
  DatabaseRequestType.Create,
1105
1490
  );
@@ -1107,13 +1492,15 @@ describe("EditionPermission wiring through the permission entry points", () => {
1107
1492
  });
1108
1493
 
1109
1494
  test("a signed-out caller still gets 'not logged in' before any edition answer", () => {
1110
- expect(() => {
1111
- TablePermission.checkTableLevelPermissions(
1112
- ProjectSSO,
1113
- {},
1114
- DatabaseRequestType.Create,
1115
- );
1116
- }).toThrow(NotAuthenticatedException);
1495
+ for (const modelType of [ProjectSCIM, ProjectSSO]) {
1496
+ expect(() => {
1497
+ TablePermission.checkTableLevelPermissions(
1498
+ modelType,
1499
+ {},
1500
+ DatabaseRequestType.Create,
1501
+ );
1502
+ }).toThrow(NotAuthenticatedException);
1503
+ }
1117
1504
  });
1118
1505
 
1119
1506
  /*
@@ -1129,7 +1516,7 @@ describe("EditionPermission wiring through the permission entry points", () => {
1129
1516
 
1130
1517
  expect(() => {
1131
1518
  TablePermission.checkTableLevelPermissions(
1132
- ProjectSSO,
1519
+ ProjectSCIM,
1133
1520
  buildUserProps([Permission.ProjectOwner]),
1134
1521
  DatabaseRequestType.Update,
1135
1522
  );
@@ -1138,7 +1525,7 @@ describe("EditionPermission wiring through the permission entry points", () => {
1138
1525
 
1139
1526
  expect(() => {
1140
1527
  TablePermission.checkTableLevelPermissions(
1141
- ProjectSSO,
1528
+ ProjectSCIM,
1142
1529
  buildUserProps([Permission.ProjectOwner]),
1143
1530
  DatabaseRequestType.Create,
1144
1531
  );
@@ -1148,9 +1535,9 @@ describe("EditionPermission wiring through the permission entry points", () => {
1148
1535
  });
1149
1536
 
1150
1537
  describe("UpdatePermission: every caller's update is edition-checked with its data", () => {
1151
- const query: Query<ProjectSSO> = {
1538
+ const query: Query<ProjectSCIM> = {
1152
1539
  _id: "33333333-3333-4333-8333-333333333333",
1153
- } as Query<ProjectSSO>;
1540
+ } as Query<ProjectSCIM>;
1154
1541
 
1155
1542
  const ownerProps: () => DatabaseCommonInteractionProps =
1156
1543
  (): DatabaseCommonInteractionProps => {
@@ -1161,18 +1548,18 @@ describe("EditionPermission wiring through the permission entry points", () => {
1161
1548
  // What follows the edition check needs a database; it is not under test.
1162
1549
  jest.spyOn(BasePermission, "checkPermissions").mockImplementation((async (
1163
1550
  _modelType: unknown,
1164
- checkedQuery: Query<ProjectSSO>,
1551
+ checkedQuery: Query<ProjectSCIM>,
1165
1552
  ) => {
1166
1553
  return { query: checkedQuery };
1167
1554
  }) as never);
1168
1555
  });
1169
1556
 
1170
- test("a project owner's ordinary update is refused on the Community Edition", async () => {
1557
+ test("a project owner's ordinary SCIM update is refused on the Community Edition", async () => {
1171
1558
  await expect(
1172
1559
  UpdatePermission.checkUpdatePermissions(
1173
- ProjectSSO,
1560
+ ProjectSCIM,
1174
1561
  query,
1175
- { name: "Okta (renamed)" },
1562
+ { autoProvisionUsers: true },
1176
1563
  ownerProps(),
1177
1564
  ),
1178
1565
  ).rejects.toThrow(
@@ -1183,7 +1570,7 @@ describe("EditionPermission wiring through the permission entry points", () => {
1183
1570
  });
1184
1571
 
1185
1572
  test.each(UNUSABLE_STATUSES)(
1186
- "a project owner cannot switch a provider on with a %s license",
1573
+ "a project owner cannot change SCIM provisioning with a %s license",
1187
1574
  async (status: EnterpriseLicenseStatus) => {
1188
1575
  installFakeEnterpriseModule({
1189
1576
  snapshot: createLicenseSnapshotWithStatus(status),
@@ -1191,9 +1578,9 @@ describe("EditionPermission wiring through the permission entry points", () => {
1191
1578
 
1192
1579
  await expect(
1193
1580
  UpdatePermission.checkUpdatePermissions(
1194
- ProjectSSO,
1581
+ ProjectSCIM,
1195
1582
  query,
1196
- { isEnabled: true },
1583
+ { enablePushGroups: true },
1197
1584
  ownerProps(),
1198
1585
  ),
1199
1586
  ).rejects.toThrow(
@@ -1205,7 +1592,7 @@ describe("EditionPermission wiring through the permission entry points", () => {
1205
1592
  );
1206
1593
 
1207
1594
  test.each(UNUSABLE_STATUSES)(
1208
- "a project owner can switch a provider off with a %s license",
1595
+ "a project owner can rotate a leaked SCIM bearer token with a %s license",
1209
1596
  async (status: EnterpriseLicenseStatus) => {
1210
1597
  installFakeEnterpriseModule({
1211
1598
  snapshot: createLicenseSnapshotWithStatus(status),
@@ -1213,30 +1600,15 @@ describe("EditionPermission wiring through the permission entry points", () => {
1213
1600
 
1214
1601
  await expect(
1215
1602
  UpdatePermission.checkUpdatePermissions(
1216
- ProjectSSO,
1603
+ ProjectSCIM,
1217
1604
  query,
1218
- { isEnabled: false },
1605
+ { bearerToken: ObjectID.generate().toString() },
1219
1606
  ownerProps(),
1220
1607
  ),
1221
1608
  ).resolves.toEqual(query);
1222
1609
  },
1223
1610
  );
1224
1611
 
1225
- test("a project owner can rotate a leaked SCIM bearer token with an expired license", async () => {
1226
- installFakeEnterpriseModule({
1227
- snapshot: createLicenseSnapshotWithStatus("expired"),
1228
- });
1229
-
1230
- await expect(
1231
- UpdatePermission.checkUpdatePermissions(
1232
- ProjectSCIM,
1233
- query as unknown as Query<ProjectSCIM>,
1234
- { bearerToken: ObjectID.generate().toString() },
1235
- ownerProps(),
1236
- ),
1237
- ).resolves.toEqual(query);
1238
- });
1239
-
1240
1612
  test("a project owner cannot rotate the token and change anything else in one update", async () => {
1241
1613
  installFakeEnterpriseModule({
1242
1614
  snapshot: createLicenseSnapshotWithStatus("expired"),
@@ -1245,7 +1617,7 @@ describe("EditionPermission wiring through the permission entry points", () => {
1245
1617
  await expect(
1246
1618
  UpdatePermission.checkUpdatePermissions(
1247
1619
  ProjectSCIM,
1248
- query as unknown as Query<ProjectSCIM>,
1620
+ query,
1249
1621
  {
1250
1622
  bearerToken: ObjectID.generate().toString(),
1251
1623
  autoProvisionUsers: true,
@@ -1259,16 +1631,16 @@ describe("EditionPermission wiring through the permission entry points", () => {
1259
1631
  * The allowance is about the license, never about who may write: a
1260
1632
  * caller without update permission is still turned away.
1261
1633
  */
1262
- test("switching a provider off still needs permission to update it", async () => {
1634
+ test("rotating a SCIM token still needs permission to update it", async () => {
1263
1635
  installFakeEnterpriseModule({
1264
1636
  snapshot: createLicenseSnapshotWithStatus("expired"),
1265
1637
  });
1266
1638
 
1267
1639
  await expect(
1268
1640
  UpdatePermission.checkUpdatePermissions(
1269
- ProjectSSO,
1641
+ ProjectSCIM,
1270
1642
  query,
1271
- { isEnabled: false },
1643
+ { bearerToken: ObjectID.generate().toString() },
1272
1644
  buildUserProps([Permission.ProjectMember]),
1273
1645
  ),
1274
1646
  ).rejects.toThrow(NotAuthorizedException);
@@ -1277,48 +1649,64 @@ describe("EditionPermission wiring through the permission entry points", () => {
1277
1649
  test("a signed-out caller gets 'not logged in' before any edition answer", async () => {
1278
1650
  await expect(
1279
1651
  UpdatePermission.checkUpdatePermissions(
1280
- ProjectSSO,
1652
+ ProjectSCIM,
1281
1653
  query,
1282
- { name: "Okta (renamed)" },
1654
+ { autoProvisionUsers: true },
1283
1655
  {},
1284
1656
  ),
1285
1657
  ).rejects.toThrow(NotAuthenticatedException);
1286
1658
  });
1287
1659
 
1288
- test("a master admin can switch a global provider off with an expired license, and on the Community Edition", async () => {
1289
- const globalQuery: Query<GlobalSSO> = {
1290
- name: "Okta",
1291
- } as Query<GlobalSSO>;
1292
-
1293
- await expect(
1294
- UpdatePermission.checkUpdatePermissions(
1295
- GlobalSSO,
1296
- globalQuery,
1297
- { isEnabled: false },
1298
- { userId, isMasterAdmin: true },
1299
- ),
1300
- ).resolves.toBe(globalQuery);
1660
+ test.each([
1661
+ [
1662
+ "the Community Edition",
1663
+ (): void => {
1664
+ return uninstallEnterpriseModule();
1665
+ },
1666
+ ],
1667
+ ...UNUSABLE_STATUSES.map((status: EnterpriseLicenseStatus) => {
1668
+ return [
1669
+ `a ${status} license`,
1670
+ (): void => {
1671
+ installFakeEnterpriseModule({
1672
+ snapshot: createLicenseSnapshotWithStatus(status),
1673
+ });
1674
+ },
1675
+ ];
1676
+ }),
1677
+ ] as Array<[string, () => void]>)(
1678
+ "on %s a project owner can edit, switch on and switch off single sign-on providers",
1679
+ async (_state: string, install: () => void) => {
1680
+ install();
1301
1681
 
1302
- installFakeEnterpriseModule({
1303
- snapshot: createLicenseSnapshotWithStatus("expired"),
1304
- });
1682
+ for (const [, modelType] of PROJECT_SSO_MODELS) {
1683
+ for (const data of [
1684
+ { isEnabled: true },
1685
+ { isEnabled: false },
1686
+ { name: "Okta (renamed)", isEnabled: true },
1687
+ ]) {
1688
+ await expect(
1689
+ UpdatePermission.checkUpdatePermissions(
1690
+ modelType,
1691
+ query as unknown as Query<BaseModel>,
1692
+ data as QueryDeepPartialEntity<BaseModel>,
1693
+ ownerProps(),
1694
+ ),
1695
+ ).resolves.toEqual(query);
1696
+ }
1697
+ }
1698
+ },
1699
+ );
1305
1700
 
1701
+ test("editing a single sign-on provider still needs permission to update it", async () => {
1306
1702
  await expect(
1307
1703
  UpdatePermission.checkUpdatePermissions(
1308
- GlobalSSO,
1309
- globalQuery,
1310
- { isEnabled: false },
1311
- { userId, isMasterAdmin: true },
1312
- ),
1313
- ).resolves.toBe(globalQuery);
1314
- await expect(
1315
- UpdatePermission.checkUpdatePermissions(
1316
- GlobalOIDC,
1317
- globalQuery as unknown as Query<GlobalOIDC>,
1318
- { isEnabled: false, restrictToAttachedProjects: false },
1319
- { userId, isMasterAdmin: true },
1704
+ ProjectSSO,
1705
+ query as unknown as Query<ProjectSSO>,
1706
+ { isEnabled: true },
1707
+ buildUserProps([Permission.ProjectMember]),
1320
1708
  ),
1321
- ).rejects.toThrow(PaymentRequiredException);
1709
+ ).rejects.toThrow(NotAuthorizedException);
1322
1710
  });
1323
1711
 
1324
1712
  test("the data reaches the edition check unchanged", async () => {
@@ -1328,10 +1716,12 @@ describe("EditionPermission wiring through the permission entry points", () => {
1328
1716
  EditionPermissions,
1329
1717
  "checkEditionPermissions",
1330
1718
  );
1331
- const data: { isEnabled: boolean } = { isEnabled: false };
1719
+ const data: { bearerToken: string } = {
1720
+ bearerToken: ObjectID.generate().toString(),
1721
+ };
1332
1722
 
1333
1723
  await UpdatePermission.checkUpdatePermissions(
1334
- ProjectSSO,
1724
+ ProjectSCIM,
1335
1725
  query,
1336
1726
  data,
1337
1727
  ownerProps(),
@@ -1349,21 +1739,11 @@ describe("EditionPermission wiring through the permission entry points", () => {
1349
1739
  });
1350
1740
 
1351
1741
  /*
1352
- * Tighten-only updates: the incident-response moves (disable an identity
1353
- * provider, rotate a leaked SCIM bearer token) need no license. Everything
1354
- * else about enterprise configuration still does.
1742
+ * Tighten-only updates: the incident-response move (rotate a leaked SCIM
1743
+ * bearer token) needs no license. Everything else about enterprise
1744
+ * configuration still does. Single sign-on configuration has no tighten-only
1745
+ * rules because it needs none: every update of it is allowed.
1355
1746
  */
1356
- const IDENTITY_PROVIDER_MODELS: ReadonlyArray<[string, ModelType]> = [
1357
- ["GlobalSSO", GlobalSSO],
1358
- ["GlobalOIDC", GlobalOIDC],
1359
- ["GlobalSSOProject", GlobalSSOProject],
1360
- ["GlobalOIDCProject", GlobalOIDCProject],
1361
- ["ProjectSSO", ProjectSSO],
1362
- ["ProjectOIDC", ProjectOIDC],
1363
- ["StatusPageSSO", StatusPageSSO],
1364
- ["StatusPageOIDC", StatusPageOIDC],
1365
- ];
1366
-
1367
1747
  const SCIM_MODELS: ReadonlyArray<[string, ModelType]> = [
1368
1748
  ["ProjectSCIM", ProjectSCIM],
1369
1749
  ["StatusPageSCIM", StatusPageSCIM],
@@ -1382,24 +1762,12 @@ const runUpdateCheck: (input: {
1382
1762
  caller: Caller;
1383
1763
  data: unknown;
1384
1764
  }): Outcome => {
1385
- try {
1386
- EditionPermissions.checkEditionPermissions(
1387
- input.modelType,
1388
- propsFor(input.caller),
1389
- DatabaseRequestType.Update,
1390
- input.data,
1391
- );
1392
-
1393
- return "allowed";
1394
- } catch (err) {
1395
- if (!(err instanceof PaymentRequiredException)) {
1396
- throw err;
1397
- }
1398
-
1399
- return err.message === EnterpriseEdition.COMMUNITY_EDITION_MESSAGE
1400
- ? "community"
1401
- : "license";
1402
- }
1765
+ return runEditionCheck({
1766
+ modelType: input.modelType,
1767
+ operation: DatabaseRequestType.Update,
1768
+ caller: input.caller,
1769
+ data: input.data,
1770
+ });
1403
1771
  };
1404
1772
 
1405
1773
  describe("EditionPermission: tighten-only updates", () => {
@@ -1415,34 +1783,6 @@ describe("EditionPermission: tighten-only updates", () => {
1415
1783
  });
1416
1784
 
1417
1785
  describe("isTightenOnlyUpdate", () => {
1418
- test.each(IDENTITY_PROVIDER_MODELS)(
1419
- "%s: only isEnabled=false is tighten-only",
1420
- (_name: string, modelType: ModelType) => {
1421
- const tableName: string = new modelType().tableName!;
1422
-
1423
- expect(
1424
- EditionPermissions.isTightenOnlyUpdate(tableName, {
1425
- isEnabled: false,
1426
- }),
1427
- ).toBe(true);
1428
-
1429
- for (const value of [true, "false", 0, null, "", {}]) {
1430
- expect(
1431
- EditionPermissions.isTightenOnlyUpdate(tableName, {
1432
- isEnabled: value,
1433
- }),
1434
- ).toBe(false);
1435
- }
1436
-
1437
- // Another model's tighten-only column is not this model's.
1438
- expect(
1439
- EditionPermissions.isTightenOnlyUpdate(tableName, {
1440
- bearerToken: newBearerToken(),
1441
- }),
1442
- ).toBe(false);
1443
- },
1444
- );
1445
-
1446
1786
  test.each(SCIM_MODELS)(
1447
1787
  "%s: only a new, long bearerToken is tighten-only",
1448
1788
  (_name: string, modelType: ModelType) => {
@@ -1482,32 +1822,43 @@ describe("EditionPermission: tighten-only updates", () => {
1482
1822
  },
1483
1823
  );
1484
1824
 
1825
+ test.each(SSO_MODELS)(
1826
+ "%s: has no tighten-only rules (single sign-on is not enterprise configuration)",
1827
+ (_name: string, modelType: ModelType) => {
1828
+ const tableName: string = new modelType().tableName!;
1829
+
1830
+ for (const data of [
1831
+ { isEnabled: false },
1832
+ { isEnabled: true },
1833
+ { bearerToken: newBearerToken() },
1834
+ ]) {
1835
+ expect(EditionPermissions.isTightenOnlyUpdate(tableName, data)).toBe(
1836
+ false,
1837
+ );
1838
+ }
1839
+ },
1840
+ );
1841
+
1485
1842
  test("one more column makes it an ordinary update", () => {
1486
1843
  expect(
1487
- EditionPermissions.isTightenOnlyUpdate("ProjectSSO", {
1488
- isEnabled: false,
1489
- name: "Okta",
1490
- }),
1491
- ).toBe(false);
1492
- expect(
1493
- EditionPermissions.isTightenOnlyUpdate("ProjectOIDC", {
1494
- isEnabled: false,
1495
- clientSecret: "new-secret",
1844
+ EditionPermissions.isTightenOnlyUpdate("ProjectSCIM", {
1845
+ bearerToken: newBearerToken(),
1846
+ enablePushGroups: true,
1496
1847
  }),
1497
1848
  ).toBe(false);
1498
1849
  expect(
1499
- EditionPermissions.isTightenOnlyUpdate("ProjectSCIM", {
1850
+ EditionPermissions.isTightenOnlyUpdate("StatusPageSCIM", {
1500
1851
  bearerToken: newBearerToken(),
1501
- enablePushGroups: true,
1852
+ autoDeprovisionUsers: false,
1502
1853
  }),
1503
1854
  ).toBe(false);
1504
1855
  });
1505
1856
 
1506
1857
  test("columns set to undefined are not written, so they do not count", () => {
1507
1858
  expect(
1508
- EditionPermissions.isTightenOnlyUpdate("ProjectSSO", {
1509
- isEnabled: false,
1510
- name: undefined,
1859
+ EditionPermissions.isTightenOnlyUpdate("ProjectSCIM", {
1860
+ bearerToken: newBearerToken(),
1861
+ enablePushGroups: undefined,
1511
1862
  }),
1512
1863
  ).toBe(true);
1513
1864
  });
@@ -1517,15 +1868,15 @@ describe("EditionPermission: tighten-only updates", () => {
1517
1868
  undefined,
1518
1869
  null,
1519
1870
  {},
1520
- { name: undefined },
1871
+ { bearerToken: undefined },
1521
1872
  [],
1522
- [{ isEnabled: false }],
1523
- "isEnabled=false",
1873
+ [{ bearerToken: newBearerToken() }],
1874
+ `bearerToken=${newBearerToken()}`,
1524
1875
  false,
1525
1876
  ]) {
1526
- expect(EditionPermissions.isTightenOnlyUpdate("ProjectSSO", data)).toBe(
1527
- false,
1528
- );
1877
+ expect(
1878
+ EditionPermissions.isTightenOnlyUpdate("ProjectSCIM", data),
1879
+ ).toBe(false);
1529
1880
  }
1530
1881
  });
1531
1882
 
@@ -1541,12 +1892,12 @@ describe("EditionPermission: tighten-only updates", () => {
1541
1892
  "__proto__",
1542
1893
  ]) {
1543
1894
  const data: Record<string, unknown> = JSON.parse(
1544
- `{"isEnabled": false, "${column}": false}`,
1895
+ `{"bearerToken": "${newBearerToken()}", "${column}": false}`,
1545
1896
  );
1546
1897
 
1547
- expect(EditionPermissions.isTightenOnlyUpdate("ProjectSSO", data)).toBe(
1548
- false,
1549
- );
1898
+ expect(
1899
+ EditionPermissions.isTightenOnlyUpdate("ProjectSCIM", data),
1900
+ ).toBe(false);
1550
1901
  }
1551
1902
  });
1552
1903
 
@@ -1567,7 +1918,7 @@ describe("EditionPermission: tighten-only updates", () => {
1567
1918
  for (const tableName of ["Monitor", "Project", "", null, undefined]) {
1568
1919
  expect(
1569
1920
  EditionPermissions.isTightenOnlyUpdate(tableName, {
1570
- isEnabled: false,
1921
+ bearerToken: newBearerToken(),
1571
1922
  }),
1572
1923
  ).toBe(false);
1573
1924
  }
@@ -1575,16 +1926,29 @@ describe("EditionPermission: tighten-only updates", () => {
1575
1926
  });
1576
1927
 
1577
1928
  describe("the list itself", () => {
1578
- test("covers exactly the identity provider and SCIM models", () => {
1579
- expect(
1580
- Array.from(EditionPermissions.getTightenOnlyColumns().keys()).sort(),
1581
- ).toEqual(
1582
- [...IDENTITY_PROVIDER_MODELS, ...SCIM_MODELS]
1583
- .map(([name]: [string, ModelType]): string => {
1584
- return name;
1585
- })
1586
- .sort(),
1929
+ test("covers exactly the SCIM models, and only their bearer token", () => {
1930
+ const columns: ReadonlyMap<
1931
+ string,
1932
+ ReadonlyArray<string>
1933
+ > = EditionPermissions.getTightenOnlyColumns();
1934
+
1935
+ expect(Array.from(columns.keys()).sort()).toEqual(
1936
+ ["ProjectSCIM", "StatusPageSCIM"].sort(),
1587
1937
  );
1938
+
1939
+ for (const [, tableColumns] of columns) {
1940
+ expect([...tableColumns]).toEqual(["bearerToken"]);
1941
+ }
1942
+ });
1943
+
1944
+ test("no single sign-on table is listed", () => {
1945
+ const tables: Array<string> = Array.from(
1946
+ EditionPermissions.getTightenOnlyColumns().keys(),
1947
+ );
1948
+
1949
+ for (const [name] of SSO_MODELS) {
1950
+ expect(tables).not.toContain(name);
1951
+ }
1588
1952
  });
1589
1953
 
1590
1954
  test("every listed table is an enterprise model, and every listed column is a real column of it", () => {
@@ -1646,7 +2010,7 @@ describe("EditionPermission: tighten-only updates", () => {
1646
2010
  },
1647
2011
  ],
1648
2012
  [
1649
- "a license without SSO, SCIM or team compliance",
2013
+ "a license without SCIM or team compliance",
1650
2014
  (): void => {
1651
2015
  installFakeEnterpriseModule({
1652
2016
  snapshot: createLicenseSnapshot({
@@ -1658,11 +2022,11 @@ describe("EditionPermission: tighten-only updates", () => {
1658
2022
  ];
1659
2023
 
1660
2024
  test.each(UNAVAILABLE_STATES)(
1661
- "with %s, switching any identity provider off is allowed, for users and master admins",
2025
+ "with %s, rotating a SCIM bearer token is allowed, for users and master admins",
1662
2026
  (_state: string, install: () => void) => {
1663
2027
  install();
1664
2028
 
1665
- for (const [, modelType] of IDENTITY_PROVIDER_MODELS) {
2029
+ for (const [, modelType] of SCIM_MODELS) {
1666
2030
  for (const caller of [
1667
2031
  "regular user",
1668
2032
  "master admin",
@@ -1671,7 +2035,7 @@ describe("EditionPermission: tighten-only updates", () => {
1671
2035
  runUpdateCheck({
1672
2036
  modelType,
1673
2037
  caller,
1674
- data: { isEnabled: false },
2038
+ data: { bearerToken: newBearerToken() },
1675
2039
  }),
1676
2040
  ).toBe("allowed");
1677
2041
  }
@@ -1680,18 +2044,23 @@ describe("EditionPermission: tighten-only updates", () => {
1680
2044
  );
1681
2045
 
1682
2046
  test.each(UNAVAILABLE_STATES)(
1683
- "with %s, rotating a SCIM bearer token is allowed",
2047
+ "with %s, every update of single sign-on configuration is allowed",
1684
2048
  (_state: string, install: () => void) => {
1685
2049
  install();
1686
2050
 
1687
- for (const [, modelType] of SCIM_MODELS) {
1688
- expect(
1689
- runUpdateCheck({
1690
- modelType,
1691
- caller: "regular user",
1692
- data: { bearerToken: newBearerToken() },
1693
- }),
1694
- ).toBe("allowed");
2051
+ for (const [, modelType] of SSO_MODELS) {
2052
+ for (const data of [
2053
+ { isEnabled: true },
2054
+ { isEnabled: false },
2055
+ { isEnabled: false, name: "Okta" },
2056
+ { name: "Okta" },
2057
+ {},
2058
+ undefined,
2059
+ ]) {
2060
+ expect(
2061
+ runUpdateCheck({ modelType, caller: "master admin", data }),
2062
+ ).toBe("allowed");
2063
+ }
1695
2064
  }
1696
2065
  },
1697
2066
  );
@@ -1705,25 +2074,13 @@ describe("EditionPermission: tighten-only updates", () => {
1705
2074
  ? "license"
1706
2075
  : "community";
1707
2076
 
1708
- for (const [, modelType] of IDENTITY_PROVIDER_MODELS) {
1709
- for (const data of [
1710
- { isEnabled: true },
1711
- { isEnabled: false, name: "Okta" },
1712
- { name: "Okta" },
1713
- {},
1714
- undefined,
1715
- ]) {
1716
- expect(
1717
- runUpdateCheck({ modelType, caller: "regular user", data }),
1718
- ).toBe(expected);
1719
- }
1720
- }
1721
-
1722
2077
  for (const [, modelType] of SCIM_MODELS) {
1723
2078
  for (const data of [
1724
2079
  { bearerToken: "short" },
1725
2080
  { bearerToken: newBearerToken(), autoDeprovisionUsers: false },
1726
2081
  { autoProvisionUsers: false },
2082
+ {},
2083
+ undefined,
1727
2084
  ]) {
1728
2085
  expect(
1729
2086
  runUpdateCheck({ modelType, caller: "master admin", data }),
@@ -1749,10 +2106,10 @@ describe("EditionPermission: tighten-only updates", () => {
1749
2106
 
1750
2107
  expect(() => {
1751
2108
  EditionPermissions.checkEditionPermissions(
1752
- ProjectSSO,
2109
+ ProjectSCIM,
1753
2110
  propsFor("regular user"),
1754
2111
  DatabaseRequestType.Create,
1755
- { isEnabled: false },
2112
+ { bearerToken: newBearerToken() },
1756
2113
  );
1757
2114
  }).toThrow(
1758
2115
  new PaymentRequiredException(
@@ -1768,7 +2125,7 @@ describe("EditionPermission: tighten-only updates", () => {
1768
2125
 
1769
2126
  expect(
1770
2127
  runUpdateCheck({
1771
- modelType: ProjectSSO,
2128
+ modelType: ProjectSCIM,
1772
2129
  caller: "regular user",
1773
2130
  data: undefined,
1774
2131
  }),
@@ -1780,9 +2137,9 @@ describe("EditionPermission: tighten-only updates", () => {
1780
2137
 
1781
2138
  expect(
1782
2139
  runUpdateCheck({
1783
- modelType: ProjectSSO,
2140
+ modelType: ProjectSCIM,
1784
2141
  caller: "regular user",
1785
- data: { isEnabled: true, name: "Okta" },
2142
+ data: { autoProvisionUsers: true, enablePushGroups: true },
1786
2143
  }),
1787
2144
  ).toBe("allowed");
1788
2145
 
@@ -1791,9 +2148,9 @@ describe("EditionPermission: tighten-only updates", () => {
1791
2148
 
1792
2149
  expect(
1793
2150
  runUpdateCheck({
1794
- modelType: ProjectSSO,
2151
+ modelType: ProjectSCIM,
1795
2152
  caller: "regular user",
1796
- data: { isEnabled: true },
2153
+ data: { autoProvisionUsers: true },
1797
2154
  }),
1798
2155
  ).toBe("allowed");
1799
2156
 
@@ -1801,9 +2158,9 @@ describe("EditionPermission: tighten-only updates", () => {
1801
2158
 
1802
2159
  expect(
1803
2160
  runUpdateCheck({
1804
- modelType: ProjectSSO,
2161
+ modelType: ProjectSCIM,
1805
2162
  caller: "root",
1806
- data: { isEnabled: true },
2163
+ data: { autoProvisionUsers: true },
1807
2164
  }),
1808
2165
  ).toBe("allowed");
1809
2166
  });