@oneuptime/common 14.0.10 → 14.0.12

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 (2124) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +63 -0
  2. package/Models/AnalyticsModels/Log.ts +26 -3
  3. package/Models/AnalyticsModels/Metric.ts +28 -3
  4. package/Models/AnalyticsModels/MetricItemAggMV1m.ts +21 -3
  5. package/Models/AnalyticsModels/SloHistory.ts +6 -4
  6. package/Models/DatabaseModels/AIConversation.ts +127 -1
  7. package/Models/DatabaseModels/AutoRemediationRule.ts +1 -1
  8. package/Models/DatabaseModels/CephCluster.ts +12 -0
  9. package/Models/DatabaseModels/CloudResource.ts +12 -0
  10. package/Models/DatabaseModels/CodeRepository.ts +1 -1
  11. package/Models/DatabaseModels/Dashboard.ts +148 -0
  12. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +11 -0
  13. package/Models/DatabaseModels/DatabaseServer.ts +12 -0
  14. package/Models/DatabaseModels/DatabaseServerEndpoint.ts +1 -0
  15. package/Models/DatabaseModels/DockerHost.ts +12 -0
  16. package/Models/DatabaseModels/DockerSwarmCluster.ts +12 -0
  17. package/Models/DatabaseModels/EnterpriseLicense.ts +2 -0
  18. package/Models/DatabaseModels/EnterpriseLicenseInstance.ts +1 -0
  19. package/Models/DatabaseModels/GlobalOidc.ts +0 -4
  20. package/Models/DatabaseModels/GlobalOidcProject.ts +0 -4
  21. package/Models/DatabaseModels/GlobalSso.ts +0 -4
  22. package/Models/DatabaseModels/GlobalSsoProject.ts +0 -4
  23. package/Models/DatabaseModels/Host.ts +12 -0
  24. package/Models/DatabaseModels/IncidentForm.ts +594 -0
  25. package/Models/DatabaseModels/IncidentFormSubmission.ts +283 -0
  26. package/Models/DatabaseModels/IncidentTemplate.ts +59 -0
  27. package/Models/DatabaseModels/IncomingCallLog.ts +13 -0
  28. package/Models/DatabaseModels/Index.ts +20 -0
  29. package/Models/DatabaseModels/IoTFleet.ts +12 -0
  30. package/Models/DatabaseModels/KubernetesCluster.ts +12 -0
  31. package/Models/DatabaseModels/LlmModelPrice.ts +1 -0
  32. package/Models/DatabaseModels/McpOAuthClient.ts +191 -0
  33. package/Models/DatabaseModels/McpOAuthGrant.ts +464 -0
  34. package/Models/DatabaseModels/McpOAuthToken.ts +228 -0
  35. package/Models/DatabaseModels/MessageQueue.ts +1102 -0
  36. package/Models/DatabaseModels/MessageQueueLabelRule.ts +553 -0
  37. package/Models/DatabaseModels/MessageQueueOwnerRule.ts +633 -0
  38. package/Models/DatabaseModels/MessageQueueOwnerTeam.ts +491 -0
  39. package/Models/DatabaseModels/MessageQueueOwnerUser.ts +490 -0
  40. package/Models/DatabaseModels/Monitor.ts +157 -0
  41. package/Models/DatabaseModels/MonitorSecret.ts +93 -1
  42. package/Models/DatabaseModels/NetworkEndpoint.ts +1 -0
  43. package/Models/DatabaseModels/OnCallDutyPolicy.ts +155 -0
  44. package/Models/DatabaseModels/PodmanHost.ts +12 -0
  45. package/Models/DatabaseModels/Project.ts +103 -101
  46. package/Models/DatabaseModels/ProjectOidc.ts +0 -4
  47. package/Models/DatabaseModels/ProjectSso.ts +0 -4
  48. package/Models/DatabaseModels/ProxmoxCluster.ts +12 -0
  49. package/Models/DatabaseModels/RumApplication.ts +12 -0
  50. package/Models/DatabaseModels/ServerlessFunction.ts +12 -0
  51. package/Models/DatabaseModels/Service.ts +12 -0
  52. package/Models/DatabaseModels/StatusPage.ts +155 -0
  53. package/Models/DatabaseModels/StatusPageOidc.ts +0 -4
  54. package/Models/DatabaseModels/StatusPageSso.ts +0 -4
  55. package/Models/DatabaseModels/TeamComplianceSetting.ts +47 -2
  56. package/Models/DatabaseModels/TelemetrySourceMap.ts +1 -0
  57. package/Models/DatabaseModels/VMwareVCenter.ts +12 -0
  58. package/Models/DatabaseModels/Workflow.ts +226 -7
  59. package/Server/API/AIAgentDataAPI.ts +1 -1
  60. package/Server/API/AIChatAPI.ts +13 -114
  61. package/Server/API/AIInvestigationAPI.ts +3 -3
  62. package/Server/API/AIInvestigationConversationAPI.ts +266 -0
  63. package/Server/API/AutoRemediationAPI.ts +9 -41
  64. package/Server/API/CommonAPI.ts +19 -0
  65. package/Server/API/DashboardAPI.ts +7 -3
  66. package/Server/API/IncidentFormAPI.ts +376 -0
  67. package/Server/API/ProjectOIDC.ts +16 -25
  68. package/Server/API/ProjectSSO.ts +16 -24
  69. package/Server/API/StatusPageAPI.ts +185 -166
  70. package/Server/Enterprise/EnterpriseEdition.ts +93 -28
  71. package/Server/Enterprise/EnterpriseFeature.ts +25 -3
  72. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +1 -1
  73. package/Server/Enterprise/EnterpriseServerModule.ts +4 -1
  74. package/Server/EnvironmentConfig.ts +28 -1
  75. package/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.ts +129 -0
  76. package/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.ts +52 -0
  77. package/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.ts +75 -0
  78. package/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.ts +477 -0
  79. package/Server/Infrastructure/Postgres/SchemaMigrations/1796800000000-FoldAiSwitchesIntoEnableAi.ts +105 -0
  80. package/Server/Infrastructure/Postgres/SchemaMigrations/1796900000000-AddMcpOAuthTables.ts +97 -0
  81. package/Server/Infrastructure/Postgres/SchemaMigrations/1797000000000-AddWorkflowIncomingEmailSecretKey.ts +36 -0
  82. package/Server/Infrastructure/Postgres/SchemaMigrations/1797100000000-AddMonitorSecretAccess.ts +55 -0
  83. package/Server/Infrastructure/Postgres/SchemaMigrations/1797200000000-AddArchiveToMoreResources.ts +167 -0
  84. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +18 -0
  85. package/Server/Middleware/IncidentFormRateLimit.ts +847 -0
  86. package/Server/Middleware/McpDelegationAuthorization.ts +204 -0
  87. package/Server/Middleware/McpOAuthRateLimit.ts +287 -0
  88. package/Server/Middleware/ProjectAuthorization.ts +23 -2
  89. package/Server/Middleware/UserAuthorization.ts +28 -38
  90. package/Server/Services/AIService.ts +11 -14
  91. package/Server/Services/AnalyticsDatabaseService.ts +22 -5
  92. package/Server/Services/ApiKeyService.ts +31 -7
  93. package/Server/Services/AutoRemediationRuleEngineService.ts +15 -27
  94. package/Server/Services/AutoRemediationRuleService.ts +1 -1
  95. package/Server/Services/DashboardService.ts +7 -2
  96. package/Server/Services/DatabaseServerService.ts +219 -0
  97. package/Server/Services/DatabaseService.ts +29 -32
  98. package/Server/Services/InboundEmail/InboundEmailProvider.ts +44 -0
  99. package/Server/Services/InboundEmail/Providers/SendGridInboundProvider.ts +57 -1
  100. package/Server/Services/IncidentCustomFieldService.ts +112 -2
  101. package/Server/Services/IncidentEpisodeMemberService.ts +24 -4
  102. package/Server/Services/IncidentEpisodeService.ts +10 -1
  103. package/Server/Services/IncidentFormService.ts +1566 -0
  104. package/Server/Services/IncidentFormSubmissionService.ts +97 -0
  105. package/Server/Services/IncidentGroupingEngineService.ts +45 -8
  106. package/Server/Services/IncidentService.ts +123 -5
  107. package/Server/Services/IncidentTemplateService.ts +22 -0
  108. package/Server/Services/IncomingCallMissedCallNotificationService.ts +280 -0
  109. package/Server/Services/IncomingCallPolicyService.ts +118 -0
  110. package/Server/Services/Index.ts +22 -0
  111. package/Server/Services/KubernetesClusterAiAccessService.ts +10 -47
  112. package/Server/Services/KubernetesClusterService.ts +3 -3
  113. package/Server/Services/LogAggregationService.ts +38 -5
  114. package/Server/Services/McpOAuthClientService.ts +148 -0
  115. package/Server/Services/McpOAuthGrantService.ts +275 -0
  116. package/Server/Services/McpOAuthTokenService.ts +213 -0
  117. package/Server/Services/MessageQueueLabelRuleEngineService.ts +321 -0
  118. package/Server/Services/MessageQueueLabelRuleService.ts +14 -0
  119. package/Server/Services/MessageQueueOwnerRuleEngineService.ts +412 -0
  120. package/Server/Services/MessageQueueOwnerRuleService.ts +14 -0
  121. package/Server/Services/MessageQueueOwnerTeamService.ts +62 -0
  122. package/Server/Services/MessageQueueOwnerUserService.ts +62 -0
  123. package/Server/Services/MessageQueueService.ts +1463 -0
  124. package/Server/Services/MetricAggregationService.ts +4 -4
  125. package/Server/Services/MonitorGroupService.ts +49 -28
  126. package/Server/Services/MonitorProbeService.ts +1 -0
  127. package/Server/Services/MonitorSecretService.ts +425 -0
  128. package/Server/Services/MonitorService.ts +15 -1
  129. package/Server/Services/OnCallDutyPolicyService.ts +36 -2
  130. package/Server/Services/OpenTelemetryIngestService.ts +37 -4
  131. package/Server/Services/ProjectService.ts +50 -80
  132. package/Server/Services/ResourceAiAccessService.ts +3 -14
  133. package/Server/Services/RunnerJobService.ts +2 -2
  134. package/Server/Services/RunnerService.ts +2 -2
  135. package/Server/Services/StatusPagePrivateUserService.ts +1 -4
  136. package/Server/Services/StatusPageService.ts +67 -59
  137. package/Server/Services/StatusPageSubscriberService.ts +23 -0
  138. package/Server/Services/TeamComplianceSettingService.ts +163 -42
  139. package/Server/Services/TeamMemberService.ts +352 -84
  140. package/Server/Services/UserNotificationRuleService.ts +8 -1
  141. package/Server/Services/UserNotificationSettingService.ts +20 -0
  142. package/Server/Services/WorkflowService.ts +31 -0
  143. package/Server/Services/WorkspaceNotificationSummaryService.ts +12 -3
  144. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +6 -0
  145. package/Server/Types/Database/Permissions/CreatePermission.ts +17 -3
  146. package/Server/Types/Database/Permissions/EditionPermission.ts +140 -38
  147. package/Server/Types/Database/Permissions/Index.ts +10 -0
  148. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +16 -0
  149. package/Server/Types/Database/Permissions/TablePermission.ts +3 -3
  150. package/Server/Types/Database/Permissions/UpdatePermission.ts +20 -6
  151. package/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.ts +2 -0
  152. package/Server/Types/Workflow/Components/Conditions/IfElse.ts +36 -138
  153. package/Server/Types/Workflow/Components/IncomingEmail.ts +216 -0
  154. package/Server/Types/Workflow/Components/Index.ts +32 -18
  155. package/Server/Types/Workflow/Components/Schedule.ts +25 -4
  156. package/Server/Utils/AI/Chat/AgentContextCompactor.ts +200 -0
  157. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +307 -48
  158. package/Server/Utils/AI/Chat/ChatRunCancellation.ts +156 -0
  159. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +78 -18
  160. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  161. package/Server/Utils/AI/Chat/ToolOutputPager.ts +322 -0
  162. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +88 -30
  163. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +13 -1
  164. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +1 -33
  165. package/Server/Utils/AI/CodeFix/CodeFixRunQueue.ts +1 -1
  166. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +56 -46
  167. package/Server/Utils/AI/CodeFix/OpenPullRequestCap.ts +25 -19
  168. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +7 -1
  169. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +49 -82
  170. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +69 -24
  171. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +9 -0
  172. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +53 -10
  173. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +64 -63
  174. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +8 -8
  175. package/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.ts +1 -1
  176. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +39 -29
  177. package/Server/Utils/AI/SRE/IncidentPostmortemRunner.ts +6 -5
  178. package/Server/Utils/AI/SRE/Insights/FixRouting.ts +3 -3
  179. package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +5 -5
  180. package/Server/Utils/AI/SRE/Insights/Triage.ts +6 -5
  181. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +8 -7
  182. package/Server/Utils/AI/SRE/InvestigationEligibility.ts +1 -1
  183. package/Server/Utils/AI/SRE/InvestigationQueue.ts +77 -72
  184. package/Server/Utils/AI/SRE/InvestigationThread.ts +646 -0
  185. package/Server/Utils/AI/SRE/InvestigationThreadService.ts +715 -0
  186. package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +1 -1
  187. package/Server/Utils/AI/Toolbox/AIActionTools.ts +11 -1
  188. package/Server/Utils/AI/Toolbox/AIMetaTools.ts +14 -8
  189. package/Server/Utils/AI/Toolbox/MonitorTools.ts +21 -3
  190. package/Server/Utils/AI/Toolbox/OnCallTools.ts +43 -9
  191. package/Server/Utils/AI/Toolbox/Serializer.ts +10 -3
  192. package/Server/Utils/AI/Toolbox/StatusPageTools.ts +36 -7
  193. package/Server/Utils/AI/Toolbox/WorkflowProbeTools.ts +26 -7
  194. package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +3 -1
  195. package/Server/Utils/EditionEnforcement.ts +19 -202
  196. package/Server/Utils/Express.ts +23 -0
  197. package/Server/Utils/IncomingCall/MissedCallNotification.ts +322 -0
  198. package/Server/Utils/LLM/LLMService.ts +259 -63
  199. package/Server/Utils/Mcp/McpDelegationToken.ts +171 -0
  200. package/Server/Utils/Mcp/McpOAuthConfig.ts +191 -0
  201. package/Server/Utils/Mcp/McpOAuthGrantAccess.ts +303 -0
  202. package/Server/Utils/Mcp/McpOAuthSecret.ts +149 -0
  203. package/Server/Utils/Mcp/McpOAuthSignedToken.ts +225 -0
  204. package/Server/Utils/Mcp/McpOAuthSso.ts +274 -0
  205. package/Server/Utils/Monitor/MonitorPayloadRedaction.ts +43 -0
  206. package/Server/Utils/Monitor/MonitorResource.ts +16 -3
  207. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +5 -8
  208. package/Server/Utils/RelaxedScimTeamLocksReport.ts +245 -0
  209. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  210. package/Server/Utils/SameOriginRequest.ts +203 -0
  211. package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +3 -3
  212. package/Server/Utils/Slo/SloMetricUtil.ts +3 -3
  213. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  214. package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +11 -3
  215. package/Server/Utils/Telemetry/EntityRegistry.ts +4 -1
  216. package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +1409 -0
  217. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +4 -1
  218. package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +171 -17
  219. package/Server/Utils/VendorAssets.ts +3 -3
  220. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +2 -0
  221. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +2 -0
  222. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +5 -1
  223. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +5 -1
  224. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +10 -1
  225. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +4 -0
  226. package/Server/Utils/Workspace/Slack/Actions/Alert.ts +2 -0
  227. package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +2 -0
  228. package/Server/Utils/Workspace/Slack/Actions/Incident.ts +4 -0
  229. package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +2 -0
  230. package/Tests/App/Accounts/IncidentFormPage.test.tsx +2036 -0
  231. package/Tests/App/Accounts/IncidentFormServerMessages.test.ts +119 -0
  232. package/Tests/App/Accounts/IncidentFormUtils.test.ts +1157 -0
  233. package/Tests/App/Accounts/LoginPasskey.test.tsx +33 -4
  234. package/Tests/App/Accounts/LoginSso.test.tsx +724 -0
  235. package/Tests/App/Accounts/McpAuthorizePage.test.tsx +2034 -0
  236. package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +338 -0
  237. package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +331 -0
  238. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +47 -33
  239. package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +1021 -0
  240. package/Tests/App/AdvancedMenuSectionsCollapsed.test.tsx +446 -0
  241. package/Tests/App/Dashboard/AIFeaturesSettingsPointers.test.tsx +55 -19
  242. package/Tests/App/Dashboard/AIInvestigationSettingsLimits.test.tsx +451 -0
  243. package/Tests/App/Dashboard/AIInvestigationStage.test.ts +141 -0
  244. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +876 -78
  245. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +20 -3
  246. package/Tests/App/Dashboard/AiAccessModes.test.ts +261 -0
  247. package/Tests/App/Dashboard/AiAccessRow.test.tsx +401 -0
  248. package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +19 -6
  249. package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +76 -33
  250. package/Tests/App/Dashboard/AnswerSources.test.tsx +359 -0
  251. package/Tests/App/Dashboard/ArchivableResourceListPages.test.tsx +655 -0
  252. package/Tests/App/Dashboard/ArchivedResourceBanner.test.tsx +543 -0
  253. package/Tests/App/Dashboard/ArchivedResourceNavigation.test.tsx +634 -0
  254. package/Tests/App/Dashboard/ArchivedResourceViewLayouts.test.tsx +321 -0
  255. package/Tests/App/Dashboard/BulkChangeStateModalSteps.test.ts +109 -0
  256. package/Tests/App/Dashboard/CephProxmoxVMwareDocumentationCards.test.tsx +359 -0
  257. package/Tests/App/Dashboard/CephSetupGuide.test.ts +961 -0
  258. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +381 -95
  259. package/Tests/App/Dashboard/CloudSetupGuide.test.ts +1463 -0
  260. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +174 -12
  261. package/Tests/App/Dashboard/CodeProduct.test.tsx +194 -0
  262. package/Tests/App/Dashboard/ContainerSetupGuideCards.test.tsx +345 -0
  263. package/Tests/App/Dashboard/ConversationComposer.test.tsx +439 -0
  264. package/Tests/App/Dashboard/CoreListEmptyStates.test.tsx +503 -0
  265. package/Tests/App/Dashboard/CorrelateResultSummary.test.tsx +15 -3
  266. package/Tests/App/Dashboard/CreateOAuthWorkflowVariableFormSteps.test.tsx +925 -0
  267. package/Tests/App/Dashboard/CreateOAuthWorkflowVariableModal.test.tsx +267 -20
  268. package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +493 -100
  269. package/Tests/App/Dashboard/DangerZone.test.tsx +146 -3
  270. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +0 -4
  271. package/Tests/App/Dashboard/DatabaseDocumentationCard.test.tsx +400 -0
  272. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +5 -0
  273. package/Tests/App/Dashboard/DatabaseSetupGuide.test.ts +1869 -0
  274. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +44 -0
  275. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +50 -9
  276. package/Tests/App/Dashboard/DeleteDialogsNameTheResource.test.tsx +257 -0
  277. package/Tests/App/Dashboard/DeveloperDocsGuides.test.ts +458 -0
  278. package/Tests/App/Dashboard/DeveloperDocsLocales.test.ts +124 -0
  279. package/Tests/App/Dashboard/DeveloperDocsPage.test.tsx +471 -0
  280. package/Tests/App/Dashboard/DeveloperMenuSections.test.tsx +657 -0
  281. package/Tests/App/Dashboard/DisabledWarningArchived.test.tsx +196 -0
  282. package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +52 -82
  283. package/Tests/App/Dashboard/DockerSetupGuide.test.ts +899 -0
  284. package/Tests/App/Dashboard/DockerSwarmSetupGuide.test.ts +964 -0
  285. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +208 -7
  286. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +52 -39
  287. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +47 -0
  288. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +7 -1
  289. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +2 -1
  290. package/Tests/App/Dashboard/GettingStartedTaskRoutes.test.tsx +331 -0
  291. package/Tests/App/Dashboard/HomeOverviewStatsFirstRun.test.tsx +942 -0
  292. package/Tests/App/Dashboard/HostDocumentationCard.test.tsx +225 -0
  293. package/Tests/App/Dashboard/HostSetupGuide.test.ts +1183 -0
  294. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +69 -45
  295. package/Tests/App/Dashboard/IncidentAlertLinkSideMenus.test.tsx +3 -1
  296. package/Tests/App/Dashboard/IncidentCreateTemplateCustomFieldSettings.test.tsx +745 -0
  297. package/Tests/App/Dashboard/IncidentCreateTemplateOwners.test.tsx +414 -0
  298. package/Tests/App/Dashboard/IncidentCustomFieldCreateSettingsForm.test.ts +1042 -0
  299. package/Tests/App/Dashboard/IncidentCustomFieldSettingsCard.test.tsx +1816 -0
  300. package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +19 -6
  301. package/Tests/App/Dashboard/IncidentFormPlan.test.ts +89 -0
  302. package/Tests/App/Dashboard/IncidentFormShareLinkCard.test.tsx +846 -0
  303. package/Tests/App/Dashboard/IncidentFormsPages.test.tsx +1324 -0
  304. package/Tests/App/Dashboard/IncidentTemplateCustomFieldSettings.test.tsx +630 -0
  305. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +95 -49
  306. package/Tests/App/Dashboard/IncomingEmailMonitorLinkVerifyHint.test.tsx +104 -0
  307. package/Tests/App/Dashboard/InventoryItemSideMenu.test.tsx +1 -0
  308. package/Tests/App/Dashboard/InvestigationConversation.test.tsx +2465 -0
  309. package/Tests/App/Dashboard/InvestigationConversationData.test.ts +998 -0
  310. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +170 -5
  311. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +341 -3
  312. package/Tests/App/Dashboard/InvestigationNotice.test.tsx +300 -0
  313. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1201 -34
  314. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +9 -21
  315. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +274 -37
  316. package/Tests/App/Dashboard/InvestigationStatusBadge.test.tsx +130 -0
  317. package/Tests/App/Dashboard/IoTDocumentationCard.test.tsx +218 -0
  318. package/Tests/App/Dashboard/IoTSetupGuide.test.ts +1124 -0
  319. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +126 -36
  320. package/Tests/App/Dashboard/KubernetesClusterAiAgentStatus.test.ts +743 -9
  321. package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +107 -83
  322. package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +838 -81
  323. package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +958 -7
  324. package/Tests/App/Dashboard/KubernetesSetupGuide.test.ts +787 -0
  325. package/Tests/App/Dashboard/McpAuthorizationResume.test.tsx +495 -0
  326. package/Tests/App/Dashboard/McpServerPage.test.tsx +1106 -0
  327. package/Tests/App/Dashboard/MessageQueueBreadcrumbs.test.tsx +228 -0
  328. package/Tests/App/Dashboard/MessageQueueBrokerHealth.test.tsx +1538 -0
  329. package/Tests/App/Dashboard/MessageQueueBrokerHealthMetricChart.test.tsx +969 -0
  330. package/Tests/App/Dashboard/MessageQueueBrokerHealthReads.test.ts +889 -0
  331. package/Tests/App/Dashboard/MessageQueueBrokerMetricsReach.test.ts +236 -0
  332. package/Tests/App/Dashboard/MessageQueueDocumentationCard.test.tsx +479 -0
  333. package/Tests/App/Dashboard/MessageQueueListPages.test.tsx +1232 -0
  334. package/Tests/App/Dashboard/MessageQueueMetricDescriptions.test.ts +244 -0
  335. package/Tests/App/Dashboard/MessageQueueMonitorLink.test.ts +952 -0
  336. package/Tests/App/Dashboard/MessageQueueMonitorLinkMonitorCreate.test.tsx +859 -0
  337. package/Tests/App/Dashboard/MessageQueueOverview.test.tsx +1773 -0
  338. package/Tests/App/Dashboard/MessageQueueOverviewPresentation.test.ts +196 -0
  339. package/Tests/App/Dashboard/MessageQueuePresentation.test.ts +799 -0
  340. package/Tests/App/Dashboard/MessageQueueProducersConsumers.test.tsx +680 -0
  341. package/Tests/App/Dashboard/MessageQueueRoutes.test.tsx +383 -0
  342. package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +278 -0
  343. package/Tests/App/Dashboard/MessageQueueSetupGuide.test.ts +2778 -0
  344. package/Tests/App/Dashboard/MessageQueueSideMenus.test.tsx +285 -0
  345. package/Tests/App/Dashboard/MessageQueueSpanPopulations.test.ts +930 -0
  346. package/Tests/App/Dashboard/MessageQueueSpanStore.ts +351 -0
  347. package/Tests/App/Dashboard/MessageQueueTelemetryScope.test.ts +375 -0
  348. package/Tests/App/Dashboard/MessageQueueTelemetryScopeTabs.test.tsx +668 -0
  349. package/Tests/App/Dashboard/MessageQueueViewPages.test.tsx +685 -0
  350. package/Tests/App/Dashboard/MonitorAndHomeNotOperationalMenus.test.tsx +342 -0
  351. package/Tests/App/Dashboard/MonitorCreateFirstRunDefaults.test.tsx +623 -0
  352. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +442 -0
  353. package/Tests/App/Dashboard/MonitorCriteriaAdvancedOptions.test.tsx +267 -0
  354. package/Tests/App/Dashboard/MonitorLogsPageViewSummary.test.tsx +814 -0
  355. package/Tests/App/Dashboard/MonitorOverviewInput.test.ts +3 -0
  356. package/Tests/App/Dashboard/MonitorSecretsAccessForm.test.tsx +727 -0
  357. package/Tests/App/Dashboard/MonitorSetupCardBodies.test.tsx +246 -0
  358. package/Tests/App/Dashboard/MonitorViewLayout.test.tsx +37 -0
  359. package/Tests/App/Dashboard/MovedRunnerSettingsRedirects.test.tsx +345 -0
  360. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +12 -1
  361. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +36 -4
  362. package/Tests/App/Dashboard/NotificationRuleFormParts.test.tsx +247 -0
  363. package/Tests/App/Dashboard/OAuthIdentityProviders.test.tsx +589 -0
  364. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +12 -1
  365. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +27 -12
  366. package/Tests/App/Dashboard/PermissionModePicker.test.tsx +316 -0
  367. package/Tests/App/Dashboard/PlanGatedPage.test.tsx +292 -0
  368. package/Tests/App/Dashboard/PodmanSetupGuide.test.ts +948 -0
  369. package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +83 -39
  370. package/Tests/App/Dashboard/ProductOrientation.test.tsx +35 -1
  371. package/Tests/App/Dashboard/ProductSettingsSectionCollapsed.test.tsx +266 -0
  372. package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +244 -76
  373. package/Tests/App/Dashboard/ProxmoxSetupGuide.test.ts +1318 -0
  374. package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +57 -1
  375. package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +190 -23
  376. package/Tests/App/Dashboard/ResourceAiAgentAttentionServerParity.test.ts +549 -0
  377. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +755 -111
  378. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +457 -0
  379. package/Tests/App/Dashboard/ResourceArchiveCopy.test.ts +218 -0
  380. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +16 -0
  381. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +16 -2
  382. package/Tests/App/Dashboard/ResourceConnectionGuideCard.test.tsx +444 -0
  383. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsInfra.test.tsx +798 -0
  384. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsPlatforms.test.tsx +717 -0
  385. package/Tests/App/Dashboard/ResourceConnectionGuides.test.ts +981 -0
  386. package/Tests/App/Dashboard/ResourceConnectionState.test.ts +132 -0
  387. package/Tests/App/Dashboard/RumDocumentationCard.test.tsx +293 -0
  388. package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +467 -0
  389. package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +1 -0
  390. package/Tests/App/Dashboard/RumSetupGuide.test.ts +758 -0
  391. package/Tests/App/Dashboard/RunbookRunnerRoutes.test.tsx +403 -0
  392. package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +26 -17
  393. package/Tests/App/Dashboard/RunnerNavigation.test.tsx +577 -0
  394. package/Tests/App/Dashboard/RunnerPagesInRunbooksFlow.test.tsx +581 -0
  395. package/Tests/App/Dashboard/RunnerProductSearch.test.tsx +195 -0
  396. package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +19 -6
  397. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +25 -0
  398. package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +2 -1
  399. package/Tests/App/Dashboard/SecurityEventSeverityPill.test.tsx +39 -15
  400. package/Tests/App/Dashboard/ServerlessDocumentationCard.test.tsx +254 -0
  401. package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1074 -0
  402. package/Tests/App/Dashboard/SetupGuide.test.ts +246 -0
  403. package/Tests/App/Dashboard/SetupGuideCard.test.tsx +756 -0
  404. package/Tests/App/Dashboard/SloListSideMenu.test.tsx +121 -0
  405. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +20 -1
  406. package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +14 -2
  407. package/Tests/App/Dashboard/SsoPages.test.tsx +833 -0
  408. package/Tests/App/Dashboard/TelemetryDocumentation.test.tsx +253 -0
  409. package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +107 -13
  410. package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +730 -0
  411. package/Tests/App/Dashboard/UserElementEmail.test.tsx +50 -0
  412. package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +42 -8
  413. package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +51 -1
  414. package/Tests/App/Dashboard/VMwareSetupGuide.test.ts +1033 -0
  415. package/Tests/App/Dashboard/WorkflowBuilderArchived.test.tsx +490 -0
  416. package/Tests/App/Dashboard/WorkflowBuilderIncomingEmailSecretKey.test.tsx +436 -0
  417. package/Tests/App/Dashboard/WorkflowBuilderRunDownload.test.tsx +416 -0
  418. package/Tests/App/Dashboard/WorkflowBuilderTurnOn.test.tsx +828 -0
  419. package/Tests/App/Dashboard/WorkflowBuilderWebhookSecretKey.test.tsx +499 -0
  420. package/Tests/App/Dashboard/WorkflowRunsLogsMenus.test.tsx +758 -0
  421. package/Tests/App/Dashboard/WorkflowRunsPages.test.tsx +507 -0
  422. package/Tests/App/Dashboard/WorkflowSettingsPage.test.tsx +172 -0
  423. package/Tests/App/Dashboard/WorkflowTemplatePicker.test.tsx +1425 -0
  424. package/Tests/App/Dashboard/WorkflowVariableCreateFormSteps.test.tsx +473 -0
  425. package/Tests/App/Dashboard/WorkflowVariableOAuthSettingsEditSteps.test.tsx +390 -0
  426. package/Tests/App/Dashboard/WorkflowVariableUtil.test.ts +357 -30
  427. package/Tests/App/Dashboard/WorkflowVariableView.test.tsx +49 -0
  428. package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +72 -2
  429. package/Tests/App/Dashboard/WorkspaceNotificationRuleFormSteps.test.tsx +499 -0
  430. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +31 -0
  431. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +87 -7
  432. package/Tests/DialogActionRules.ts +1696 -0
  433. package/Tests/Helpers/FormStepsScan.ts +1917 -0
  434. package/Tests/Helpers/ToggleUsageScan.ts +302 -0
  435. package/Tests/Models/AnalyticsModels/TelemetryTtlSettings.test.ts +164 -0
  436. package/Tests/Models/DatabaseModels/ArchivableResourceModels.test.ts +475 -0
  437. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +28 -9
  438. package/Tests/Models/DatabaseModels/IncidentFormModel.test.ts +1250 -0
  439. package/Tests/Models/DatabaseModels/IncomingCallLogWorkflow.test.ts +130 -0
  440. package/Tests/Models/DatabaseModels/MessageQueueModels.test.ts +1983 -0
  441. package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +0 -1
  442. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  443. package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +190 -14
  444. package/Tests/Models/DatabaseModels/WorkflowIncomingEmailSecretKeyAccessControl.test.ts +252 -0
  445. package/Tests/Models/DatabaseModels/WorkflowWebhookSecretKeyAccessControl.test.ts +223 -0
  446. package/Tests/Models/IncidentTemplateCustomFieldSettingsColumn.test.ts +291 -0
  447. package/Tests/Models/McpOAuthModels.test.ts +951 -0
  448. package/Tests/Server/API/AIInvestigationAPI.test.ts +6 -4
  449. package/Tests/Server/API/AIInvestigationConversationAPI.test.ts +412 -0
  450. package/Tests/Server/API/ArchivedPublicRoutes.test.ts +481 -0
  451. package/Tests/Server/API/AutoRemediationApproveClusterRound.test.ts +144 -105
  452. package/Tests/Server/API/AutoRemediationApproveEnableAiGate.test.ts +816 -0
  453. package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +37 -5
  454. package/Tests/Server/API/AutoRemediationApproveResourceRound.test.ts +68 -57
  455. package/Tests/Server/API/CommonAPIAuditIdentityProps.test.ts +468 -0
  456. package/Tests/Server/API/GlobalConfigLicense.test.ts +38 -9
  457. package/Tests/Server/API/IncidentFormAPI.test.ts +942 -0
  458. package/Tests/Server/API/IncidentFormPublicRoutes.test.ts +1653 -0
  459. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -1
  460. package/Tests/Server/API/ResourceAiAccessAPI.test.ts +0 -4
  461. package/Tests/Server/API/{SsoProviderListingsEdition.test.ts → SsoProviderListings.test.ts} +164 -110
  462. package/Tests/Server/API/StatusPagePublicReadsLeaveOutArchivedMonitors.test.ts +126 -0
  463. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +76 -54
  464. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +125 -42
  465. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +36 -10
  466. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +51 -9
  467. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +13 -8
  468. package/Tests/Server/Enterprise/SsoInCommunityEdition.test.ts +540 -0
  469. package/Tests/Server/Infrastructure/Postgres/AddArchiveToMoreResourcesMigration.test.ts +200 -0
  470. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  471. package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +438 -0
  472. package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleNotificationChannelsMigration.test.ts +255 -0
  473. package/Tests/Server/Infrastructure/Postgres/FoldAiSwitchesIntoEnableAiMigration.test.ts +543 -0
  474. package/Tests/Server/Infrastructure/Postgres/FoldAiSwitchesIntoEnableAiPostgres.test.ts +862 -0
  475. package/Tests/Server/Infrastructure/Postgres/MessageQueueTablesMigration.test.ts +637 -0
  476. package/Tests/Server/Middleware/IncidentFormRateLimit.test.ts +1630 -0
  477. package/Tests/Server/Middleware/McpDelegationAuthorization.test.ts +862 -0
  478. package/Tests/Server/Middleware/McpOAuthRateLimit.test.ts +959 -0
  479. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyIdentity.test.ts +361 -0
  480. package/Tests/Server/Middleware/UserAuthorization.test.ts +16 -17
  481. package/Tests/Server/Middleware/UserAuthorizationMcpDelegation.test.ts +568 -0
  482. package/Tests/Server/Middleware/UserAuthorizationSsoEnforcement.test.ts +544 -0
  483. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +97 -8
  484. package/Tests/Server/Services/AddMcpOAuthTablesMigration.test.ts +616 -0
  485. package/Tests/Server/Services/AiAccessEnableAiMasterSwitch.test.ts +761 -0
  486. package/Tests/Server/Services/AnalyticsDatabaseServiceReadOnlyCredentialBeforeHooks.test.ts +224 -0
  487. package/Tests/Server/Services/ApiKeyServiceResolvedName.test.ts +307 -0
  488. package/Tests/Server/Services/ArchivedStatusPageAndDashboardAccess.test.ts +505 -0
  489. package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +61 -4
  490. package/Tests/Server/Services/AutoRemediationCommandRuleEngine.test.ts +64 -13
  491. package/Tests/Server/Services/AutoRemediationEnableAiMasterSwitch.test.ts +767 -0
  492. package/Tests/Server/Services/AutoRemediationResourceRuleEngine.test.ts +47 -8
  493. package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +1 -1
  494. package/Tests/Server/Services/AutoRemediationRuleEngineService.test.ts +48 -6
  495. package/Tests/Server/Services/DatabaseServerService.test.ts +420 -0
  496. package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +296 -2
  497. package/Tests/Server/Services/DatabaseServiceReadOnlyCredentialBeforeHooks.test.ts +396 -0
  498. package/Tests/Server/Services/InboundEmail/SendGridInboundProviderRecipients.test.ts +172 -0
  499. package/Tests/Server/Services/IncidentCreatedFeedTitle.test.ts +212 -0
  500. package/Tests/Server/Services/IncidentCustomFieldDeleteFormQuestions.test.ts +297 -0
  501. package/Tests/Server/Services/IncidentFormOwnersCreatedNotification.test.ts +497 -0
  502. package/Tests/Server/Services/IncidentFormPostgres.test.ts +958 -0
  503. package/Tests/Server/Services/IncidentFormPublicForm.test.ts +1260 -0
  504. package/Tests/Server/Services/IncidentFormPublicSubmission.test.ts +2520 -0
  505. package/Tests/Server/Services/IncidentFormRegistration.test.ts +159 -0
  506. package/Tests/Server/Services/IncidentFormService.test.ts +663 -0
  507. package/Tests/Server/Services/IncidentFormSubmissionService.test.ts +430 -0
  508. package/Tests/Server/Services/IncidentFormSubmissionTemplateBranch.test.ts +473 -0
  509. package/Tests/Server/Services/IncidentGroupingTemplateSubstitution.test.ts +81 -0
  510. package/Tests/Server/Services/IncidentTemplateCustomFieldSettings.test.ts +262 -0
  511. package/Tests/Server/Services/IncidentTemplateOwnersOnDeclare.test.ts +566 -0
  512. package/Tests/Server/Services/IncidentTitleMarkdownSinks.test.ts +640 -0
  513. package/Tests/Server/Services/IncomingCallMissedCallNotificationService.test.ts +690 -0
  514. package/Tests/Server/Services/IncomingCallPolicyFindOwners.test.ts +287 -0
  515. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +4 -3
  516. package/Tests/Server/Services/KubernetesClusterAiAccessAgentRunnerAssignments.test.ts +1 -1
  517. package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +2 -4
  518. package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +26 -13
  519. package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +180 -44
  520. package/Tests/Server/Services/KubernetesClusterAiAccessTarget.test.ts +14 -10
  521. package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +3 -3
  522. package/Tests/Server/Services/LogAggregationService.test.ts +101 -1
  523. package/Tests/Server/Services/McpOAuthClientService.test.ts +562 -0
  524. package/Tests/Server/Services/McpOAuthGrantService.test.ts +899 -0
  525. package/Tests/Server/Services/McpOAuthPostgres.test.ts +942 -0
  526. package/Tests/Server/Services/McpOAuthTokenService.test.ts +782 -0
  527. package/Tests/Server/Services/MessageQueueOwnerServices.test.ts +440 -0
  528. package/Tests/Server/Services/MessageQueueRegistries.test.ts +577 -0
  529. package/Tests/Server/Services/MessageQueueRuleEngines.test.ts +900 -0
  530. package/Tests/Server/Services/MessageQueueService.test.ts +2210 -0
  531. package/Tests/Server/Services/MessageQueueSqlPostgres.test.ts +1271 -0
  532. package/Tests/Server/Services/MonitorGroupServiceBatchedStatuses.test.ts +35 -1
  533. package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +35 -0
  534. package/Tests/Server/Services/MonitorSecretAccessPostgres.test.ts +883 -0
  535. package/Tests/Server/Services/MonitorSecretService.test.ts +1097 -0
  536. package/Tests/Server/Services/OnCallDutyPolicyArchive.test.ts +157 -0
  537. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
  538. package/Tests/Server/Services/OpenTelemetryRetentionOverrideEdition.test.ts +474 -0
  539. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +21 -0
  540. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +3 -0
  541. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +0 -1
  542. package/Tests/Server/Services/ProjectServiceNewProjectAiDefaults.test.ts +132 -82
  543. package/Tests/Server/Services/ResourceAiAccessService.test.ts +28 -14
  544. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +56 -6
  545. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -1
  546. package/Tests/Server/Services/RunnerJobEnqueueKubectlAiAgent.test.ts +0 -2
  547. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +5 -0
  548. package/Tests/Server/Services/SsoRequirementReads.test.ts +454 -0
  549. package/Tests/Server/Services/SsoRequirementWrites.test.ts +529 -0
  550. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  551. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +107 -89
  552. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +1068 -176
  553. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +1962 -200
  554. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +13 -1
  555. package/Tests/Server/Services/TeamMemberInvitationAcceptancePostgres.test.ts +942 -0
  556. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +6 -1
  557. package/Tests/Server/Services/TeamMemberProjectInvitationAcceptance.test.ts +1256 -0
  558. package/Tests/Server/Services/TeamMemberSeatLimitExistingMember.test.ts +498 -0
  559. package/Tests/Server/Services/UserNotificationSettingIncomingCallDefaults.test.ts +190 -0
  560. package/Tests/Server/Services/WorkflowIncomingEmailSecretKeyPostgres.test.ts +323 -0
  561. package/Tests/Server/Services/WorkflowService.test.ts +188 -0
  562. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +654 -297
  563. package/Tests/Server/Types/Database/Permissions/RetentionOverrideColumns.test.ts +784 -0
  564. package/Tests/Server/Types/Database/Permissions/SsoScalePlanGate.test.ts +418 -0
  565. package/Tests/Server/Types/Workflow/Components/CustomCodeScriptError.test.ts +19 -20
  566. package/Tests/Server/Types/Workflow/Components/IfElse.test.ts +357 -66
  567. package/Tests/Server/Types/Workflow/Components/IncomingEmailTrigger.test.ts +670 -0
  568. package/Tests/Server/Types/Workflow/Components/TriggersSkipArchivedWorkflows.test.ts +257 -0
  569. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +317 -185
  570. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +47 -23
  571. package/Tests/Server/Utils/AI/AIInvestigationEngineRunLimits.test.ts +136 -0
  572. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +148 -17
  573. package/Tests/Server/Utils/AI/AIMetaTools.test.ts +31 -0
  574. package/Tests/Server/Utils/AI/AgentContextCompactor.test.ts +351 -0
  575. package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +2 -0
  576. package/Tests/Server/Utils/AI/ArchivedResourcesInAITools.test.ts +622 -0
  577. package/Tests/Server/Utils/AI/ChatAgentRunnerSharedThread.test.ts +842 -0
  578. package/Tests/Server/Utils/AI/ChatRunCancellation.test.ts +195 -0
  579. package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +10 -57
  580. package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +30 -1
  581. package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +5 -4
  582. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +202 -102
  583. package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +1 -1
  584. package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +1 -1
  585. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +101 -80
  586. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +225 -29
  587. package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +24 -0
  588. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +266 -25
  589. package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +41 -5
  590. package/Tests/Server/Utils/AI/InvestigationThread.test.ts +580 -0
  591. package/Tests/Server/Utils/AI/InvestigationThreadService.test.ts +801 -0
  592. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +525 -43
  593. package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +4 -2
  594. package/Tests/Server/Utils/AI/LLMServiceUnreachableProvider.test.ts +435 -0
  595. package/Tests/Server/Utils/AI/ObservabilityAssistantLimits.test.ts +462 -0
  596. package/Tests/Server/Utils/AI/OpenPullRequestCap.test.ts +62 -22
  597. package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +14 -10
  598. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +219 -129
  599. package/Tests/Server/Utils/AI/RemediationExecutionRunnerEnableAiGate.test.ts +598 -0
  600. package/Tests/Server/Utils/AI/RemediationExecutionRunnerProjectGates.test.ts +94 -158
  601. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +50 -66
  602. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +297 -15
  603. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +0 -4
  604. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +10 -6
  605. package/Tests/Server/Utils/AI/ToolOutputPager.test.ts +382 -0
  606. package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +23 -4
  607. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +25 -6
  608. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +14 -3
  609. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +8 -1
  610. package/Tests/Server/Utils/EditionEnforcement.test.ts +107 -147
  611. package/Tests/Server/Utils/IncomingCall/MissedCallNotification.test.ts +555 -0
  612. package/Tests/Server/Utils/Mcp/McpDelegationToken.test.ts +677 -0
  613. package/Tests/Server/Utils/Mcp/McpOAuthConfig.test.ts +549 -0
  614. package/Tests/Server/Utils/Mcp/McpOAuthGrantAccess.test.ts +1476 -0
  615. package/Tests/Server/Utils/Mcp/McpOAuthSecret.test.ts +721 -0
  616. package/Tests/Server/Utils/Mcp/McpOAuthSignedToken.test.ts +1042 -0
  617. package/Tests/Server/Utils/Mcp/McpOAuthSso.test.ts +1399 -0
  618. package/Tests/Server/Utils/Monitor/GeneratedInboundAddressRedaction.test.ts +109 -0
  619. package/Tests/Server/Utils/Monitor/MonitorPauseFlagsGuard.test.ts +237 -0
  620. package/Tests/Server/Utils/Monitor/MonitorResourceArchived.test.ts +165 -0
  621. package/Tests/Server/Utils/{CommunityEditionSsoReport.test.ts → RelaxedScimTeamLocksReport.test.ts} +212 -208
  622. package/Tests/Server/Utils/SameOriginRequest.test.ts +372 -0
  623. package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +262 -0
  624. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +20 -0
  625. package/Tests/Server/Utils/Telemetry/MessageQueueDiscovery.test.ts +2590 -0
  626. package/Tests/Server/Utils/Telemetry/MessageQueueSpanQueryTwin.ts +246 -0
  627. package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +976 -77
  628. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +23 -0
  629. package/Tests/Server/Utils/Topology/TopologyConcurrencyLimiter.test.ts +94 -39
  630. package/Tests/Server/Utils/Workspace/ArchivedOnCallPoliciesNotOffered.test.ts +133 -0
  631. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +10 -3
  632. package/Tests/Types/AI/AIAgentRunLimits.test.ts +255 -0
  633. package/Tests/Types/AI/AIWorkloadLimits.test.ts +101 -0
  634. package/Tests/Types/BaseDatabase/ReadOnlyCredential.test.ts +931 -0
  635. package/Tests/Types/Call/CallProvider.test.ts +54 -1
  636. package/Tests/Types/Code/JsonSyntax.test.ts +1300 -0
  637. package/Tests/Types/CustomField/CustomFieldCreateSettings.test.ts +1113 -0
  638. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +91 -0
  639. package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +30 -0
  640. package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +227 -1
  641. package/Tests/Types/Incident/IncidentFormIpAllowlist.test.ts +227 -0
  642. package/Tests/Types/Incident/IncidentFormPublic.test.ts +1916 -0
  643. package/Tests/Types/IncomingCall/MissedIncomingCall.test.ts +137 -0
  644. package/Tests/Types/Kubernetes/KubernetesAiAgentAccessContract.test.ts +23 -0
  645. package/Tests/Types/Mcp/McpOAuthScope.test.ts +491 -0
  646. package/Tests/Types/MessageQueue/MessageQueueEntityKey.test.ts +916 -0
  647. package/Tests/Types/MessageQueue/MessageQueueIdentity.test.ts +567 -0
  648. package/Tests/Types/MessageQueue/MessageQueueManualIdentity.test.ts +686 -0
  649. package/Tests/Types/MessageQueue/MessageQueueMetricCatalog.test.ts +1726 -0
  650. package/Tests/Types/MessageQueue/MessageQueueMetricResolution.test.ts +1758 -0
  651. package/Tests/Types/MessageQueue/MessagingInstrumentationFixtures.test.ts +4686 -0
  652. package/Tests/Types/MessageQueue/MessagingSystem.test.ts +840 -0
  653. package/Tests/Types/MessageQueue/MessagingTelemetryFixtures.ts +3287 -0
  654. package/Tests/Types/MessageQueue/MessagingTelemetryResolver.test.ts +2966 -0
  655. package/Tests/Types/Monitor/MessageQueueAlertTemplates.test.ts +5401 -0
  656. package/Tests/Types/Monitor/MetricEngineFold.ts +154 -0
  657. package/Tests/Types/Monitor/MonitorSecretAccess.test.ts +347 -0
  658. package/Tests/Types/NotificationSetting/IncomingCallMissedNotificationEvent.test.ts +77 -0
  659. package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +5 -5
  660. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +5 -3
  661. package/Tests/Types/Team/ComplianceRule.test.ts +588 -37
  662. package/Tests/Types/Team/TeamComplianceStatus.test.ts +64 -11
  663. package/Tests/Types/Workflow/BaseModelComponents.test.ts +56 -50
  664. package/Tests/Types/Workflow/ComponentDocumentation.test.ts +1396 -0
  665. package/Tests/Types/Workflow/Components/BaseModelWriteSteps.test.ts +158 -0
  666. package/Tests/Types/Workflow/Components/JSON.test.ts +6 -2
  667. package/Tests/Types/Workflow/ConditionEvaluation.test.ts +793 -0
  668. package/Tests/Types/Workflow/DocumentationText.test.ts +169 -0
  669. package/Tests/Types/Workflow/IncomingEmailTrigger.test.ts +446 -0
  670. package/Tests/Types/Workflow/IncomingEmailTriggerDocumentation.test.ts +174 -0
  671. package/Tests/Types/Workflow/StepSamples.test.ts +846 -0
  672. package/Tests/Types/Workflow/StepTrace.test.ts +128 -0
  673. package/Tests/Types/Workflow/StepTraceValueSample.test.ts +205 -0
  674. package/Tests/Types/Workflow/SystemColumns.test.ts +114 -0
  675. package/Tests/Types/Workflow/Templates.test.ts +345 -0
  676. package/Tests/Types/Workflow/WebhookTrigger.test.ts +221 -0
  677. package/Tests/Types/Workflow/WorkflowEnabled.test.ts +107 -0
  678. package/Tests/Types/Workspace/NotificationRuleValidationHalves.test.ts +217 -0
  679. package/Tests/Types/XML.test.ts +51 -0
  680. package/Tests/UI/Components/ActionButton/RowActionsTrigger.test.tsx +748 -0
  681. package/Tests/UI/Components/BasicFormModalSteps.test.tsx +113 -0
  682. package/Tests/UI/Components/BulkUpdateFormConfirmDetails.test.tsx +148 -0
  683. package/Tests/UI/Components/Button.test.tsx +52 -13
  684. package/Tests/UI/Components/Card.test.tsx +211 -2
  685. package/Tests/UI/Components/CodeEditor/CodeEditor.test.tsx +2362 -0
  686. package/Tests/UI/Components/CodeEditor/CodeEditorCommands.test.ts +810 -0
  687. package/Tests/UI/Components/CodeEditor/CodeEditorHighlight.test.ts +338 -0
  688. package/Tests/UI/Components/CodeEditor/CodeEditorLanguages.test.ts +222 -0
  689. package/Tests/UI/Components/CodeEditor/CodeEditorStyles.test.ts +807 -0
  690. package/Tests/UI/Components/CodeEditor/CodeEditorToolbarActions.test.tsx +121 -0
  691. package/Tests/UI/Components/CodeEditor/NoMonaco.test.ts +245 -0
  692. package/Tests/UI/Components/CodeEditor/YamlEditor.test.tsx +729 -0
  693. package/Tests/UI/Components/CollapsibleSection.test.tsx +152 -0
  694. package/Tests/UI/Components/ComponentsModal.test.tsx +555 -930
  695. package/Tests/UI/Components/ComponentsModalUsability.test.tsx +279 -401
  696. package/Tests/UI/Components/ConfirmModal.test.tsx +195 -0
  697. package/Tests/UI/Components/CopyTextButton.test.tsx +76 -0
  698. package/Tests/UI/Components/DeleteConfirmation/DeleteConfirmation.test.tsx +524 -0
  699. package/Tests/UI/Components/Detail/DropdownColors.test.tsx +11 -9
  700. package/Tests/UI/Components/Detail/EntityFields.test.tsx +10 -4
  701. package/Tests/UI/Components/DictionaryRenderTextValueInput.test.tsx +94 -0
  702. package/Tests/UI/Components/Dropdown/DropdownValueBadge.test.tsx +79 -10
  703. package/Tests/UI/Components/EditionLabelLapseCopy.ts +51 -14
  704. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +131 -23
  705. package/Tests/UI/Components/ErrorMessageAction.test.tsx +142 -0
  706. package/Tests/UI/Components/FacetSidebarInScope.test.tsx +459 -0
  707. package/Tests/UI/Components/FacetValuesInScope.test.ts +270 -0
  708. package/Tests/UI/Components/Forms/BasicFormSubmitAllSteps.test.tsx +293 -0
  709. package/Tests/UI/Components/Forms/FormFieldCheckboxTranslation.test.tsx +14 -12
  710. package/Tests/UI/Components/Forms/FormFieldCodeEditors.test.tsx +294 -0
  711. package/Tests/UI/Components/Forms/FormFieldCustomElementLabel.test.tsx +156 -0
  712. package/Tests/UI/Components/Forms/FormFieldDictionaryError.test.tsx +198 -0
  713. package/Tests/UI/Components/Forms/FormFieldLongText.test.tsx +200 -0
  714. package/Tests/UI/Components/Forms/FormFieldMarkdown.test.tsx +126 -0
  715. package/Tests/UI/Components/Forms/FormFieldToggleRow.test.tsx +388 -0
  716. package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +22 -75
  717. package/Tests/UI/Components/Forms/LongFormStepsGuard.test.ts +586 -0
  718. package/Tests/UI/Components/Forms/ModelFormFormOnlyFields.test.tsx +254 -0
  719. package/Tests/UI/Components/Forms/ModelFormOnBeforeCreateMiscData.test.tsx +254 -0
  720. package/Tests/UI/Components/Forms/OverloadedFormStepsGuard.test.ts +505 -0
  721. package/Tests/UI/Components/Forms/ValidationRequiredWhen.test.ts +122 -0
  722. package/Tests/UI/Components/Icon.test.tsx +75 -0
  723. package/Tests/UI/Components/Input.test.tsx +31 -0
  724. package/Tests/UI/Components/LockedFilterChipScope.test.tsx +501 -0
  725. package/Tests/UI/Components/MarkdownConverters.test.ts +253 -1
  726. package/Tests/UI/Components/MarkdownEditor.test.tsx +2785 -2
  727. package/Tests/UI/Components/MarkdownEditorHistory.test.ts +243 -0
  728. package/Tests/UI/Components/MarkdownListEditing.test.ts +1118 -0
  729. package/Tests/UI/Components/MarkdownPaste.test.ts +1180 -0
  730. package/Tests/UI/Components/MarkdownViewerCopy.test.tsx +466 -0
  731. package/Tests/UI/Components/MarkdownVisualEditing.test.ts +1089 -0
  732. package/Tests/UI/Components/Modal.test.tsx +495 -1
  733. package/Tests/UI/Components/ModalSecondaryButton.test.tsx +122 -0
  734. package/Tests/UI/Components/ModelCardPermissionGating.test.tsx +13 -9
  735. package/Tests/UI/Components/ModelDelete.test.tsx +7 -0
  736. package/Tests/UI/Components/ModelDeleteNames.test.tsx +784 -0
  737. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +9 -2
  738. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteConfirmation.test.tsx +4 -1
  739. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteNames.test.tsx +573 -0
  740. package/Tests/UI/Components/ModelTable/BaseModelTableEmptyStateAction.test.tsx +644 -0
  741. package/Tests/UI/Components/ModelTable/BaseModelTableRowActions.test.tsx +6 -3
  742. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +20 -14
  743. package/Tests/UI/Components/NavBar.test.tsx +45 -0
  744. package/Tests/UI/Components/Pill.test.tsx +369 -50
  745. package/Tests/UI/Components/PillColors.test.ts +524 -0
  746. package/Tests/UI/Components/ResetObjectID.test.tsx +282 -0
  747. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  748. package/Tests/UI/Components/SideMenu.test.tsx +461 -0
  749. package/Tests/UI/Components/SideMenuSection.test.tsx +200 -0
  750. package/Tests/UI/Components/SideMenuSectionState.test.tsx +362 -0
  751. package/Tests/UI/Components/SteppedEditFormSave.test.tsx +499 -0
  752. package/Tests/UI/Components/Table/EmptyTableMessage.test.ts +439 -0
  753. package/Tests/UI/Components/Table/TableEmptyState.test.tsx +352 -0
  754. package/Tests/UI/Components/TableRowActions.test.tsx +110 -0
  755. package/Tests/UI/Components/TableRowMobileTitles.test.tsx +78 -0
  756. package/Tests/UI/Components/TextArea.test.tsx +19 -0
  757. package/Tests/UI/Components/TextAreaAutoGrow.test.tsx +387 -0
  758. package/Tests/UI/Components/Toggle.test.tsx +846 -6
  759. package/Tests/UI/Components/ToggleUsageGuard.test.ts +274 -0
  760. package/Tests/UI/Components/Workflow/ArgumentInputTypes.test.ts +710 -0
  761. package/Tests/UI/Components/Workflow/ArgumentsForm.test.tsx +934 -0
  762. package/Tests/UI/Components/Workflow/ArgumentsFormAdvancedSettings.test.tsx +207 -0
  763. package/Tests/UI/Components/Workflow/BreakableCode.test.tsx +153 -0
  764. package/Tests/UI/Components/Workflow/ColumnEditor/AddColumnPicker.test.tsx +685 -0
  765. package/Tests/UI/Components/Workflow/ColumnEditor/AddColumnPickerDarkMode.test.ts +252 -0
  766. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnControl.test.ts +207 -5
  767. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnPickerOptions.test.ts +570 -0
  768. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnUse.test.ts +248 -0
  769. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnValueInputLongText.test.tsx +90 -0
  770. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnValueInputValuePicker.test.tsx +282 -0
  771. package/Tests/UI/Components/Workflow/Component.test.tsx +465 -0
  772. package/Tests/UI/Components/Workflow/ComponentPicker/ComponentPickerDarkMode.test.ts +239 -0
  773. package/Tests/UI/Components/Workflow/ComponentPicker/ComponentPickerRealCatalog.test.tsx +399 -0
  774. package/Tests/UI/Components/Workflow/ComponentPicker/ComponentSearch.test.ts +660 -0
  775. package/Tests/UI/Components/Workflow/ComponentPicker/PickerCatalog.test.ts +352 -0
  776. package/Tests/UI/Components/Workflow/ComponentPicker/PickerFixtures.ts +240 -0
  777. package/Tests/UI/Components/Workflow/ComponentPortViewer.test.tsx +91 -0
  778. package/Tests/UI/Components/Workflow/ComponentReturnValueViewer.test.tsx +248 -0
  779. package/Tests/UI/Components/Workflow/ComponentSettingsDeleteConfirmation.test.tsx +245 -0
  780. package/Tests/UI/Components/Workflow/ComponentSettingsModal.test.tsx +1033 -0
  781. package/Tests/UI/Components/Workflow/ComponentSettingsModalDarkMode.test.ts +276 -0
  782. package/Tests/UI/Components/Workflow/ComponentSettingsModalDocumentation.test.tsx +478 -0
  783. package/Tests/UI/Components/Workflow/ComponentSettingsModalIncomingEmail.test.tsx +606 -0
  784. package/Tests/UI/Components/Workflow/ComponentSettingsModalLayout.test.tsx +478 -0
  785. package/Tests/UI/Components/Workflow/ComponentSettingsModalStepSamples.test.tsx +343 -0
  786. package/Tests/UI/Components/Workflow/ComponentSettingsModalValidity.test.tsx +223 -0
  787. package/Tests/UI/Components/Workflow/ComponentSettingsRunStepConfirmation.test.tsx +286 -0
  788. package/Tests/UI/Components/Workflow/Condition/ConditionCanvasCard.test.tsx +208 -0
  789. package/Tests/UI/Components/Workflow/Condition/ConditionEditor.test.tsx +906 -0
  790. package/Tests/UI/Components/Workflow/Condition/ConditionGraphLint.test.ts +204 -0
  791. package/Tests/UI/Components/Workflow/Condition/ConditionModel.test.ts +986 -0
  792. package/Tests/UI/Components/Workflow/CronScheduleFieldVariable.test.tsx +115 -0
  793. package/Tests/UI/Components/Workflow/DocumentationViewer.test.tsx +592 -0
  794. package/Tests/UI/Components/Workflow/GraphLintSummary.test.ts +467 -0
  795. package/Tests/UI/Components/Workflow/IncomingEmailTriggerPanel.test.tsx +865 -0
  796. package/Tests/UI/Components/Workflow/IncomingEmailTriggerPanelI18n.test.ts +164 -0
  797. package/Tests/UI/Components/Workflow/ModelColumnEditor.render.test.tsx +47 -48
  798. package/Tests/UI/Components/Workflow/ModelColumnEditorFieldLists.render.test.tsx +660 -0
  799. package/Tests/UI/Components/Workflow/ModelFieldPicker.test.tsx +230 -0
  800. package/Tests/UI/Components/Workflow/NodePlacement.test.ts +379 -1
  801. package/Tests/UI/Components/Workflow/StepTracePresentation.test.ts +705 -0
  802. package/Tests/UI/Components/Workflow/StepTraceViewer.test.tsx +1039 -35
  803. package/Tests/UI/Components/Workflow/StepTraceViewerDarkMode.test.ts +275 -0
  804. package/Tests/UI/Components/Workflow/UseRunWatch.test.tsx +131 -0
  805. package/Tests/UI/Components/Workflow/UseWorkflowEnabled.test.tsx +612 -0
  806. package/Tests/UI/Components/Workflow/ValuePicker/ArgumentControl.test.ts +80 -0
  807. package/Tests/UI/Components/Workflow/ValuePicker/InsertValueButton.test.tsx +114 -0
  808. package/Tests/UI/Components/Workflow/ValuePicker/NoPickThisValueLinks.test.ts +111 -0
  809. package/Tests/UI/Components/Workflow/ValuePicker/ReferenceDescription.test.ts +257 -0
  810. package/Tests/UI/Components/Workflow/ValuePicker/StepGraph.test.ts +271 -0
  811. package/Tests/UI/Components/Workflow/ValuePicker/StepSampleSource.test.ts +763 -0
  812. package/Tests/UI/Components/Workflow/ValuePicker/StepSampleSourceIncomingEmail.test.ts +234 -0
  813. package/Tests/UI/Components/Workflow/ValuePicker/StepValueSource.test.ts +366 -0
  814. package/Tests/UI/Components/Workflow/ValuePicker/TemplateText.test.ts +256 -0
  815. package/Tests/UI/Components/Workflow/ValuePicker/TemplateTextDom.test.ts +264 -0
  816. package/Tests/UI/Components/Workflow/ValuePicker/TemplateTextEditor.test.tsx +740 -0
  817. package/Tests/UI/Components/Workflow/ValuePicker/TemplateTextHistory.test.ts +139 -0
  818. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerContext.test.tsx +473 -0
  819. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerContextRefresh.test.tsx +444 -0
  820. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerDarkMode.test.ts +231 -0
  821. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerMenu.test.tsx +612 -0
  822. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerMenuSamples.test.tsx +784 -0
  823. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerPopupPosition.test.ts +113 -0
  824. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerTestUtils.tsx +171 -0
  825. package/Tests/UI/Components/Workflow/ValuePicker/ValueSingleField.test.tsx +350 -0
  826. package/Tests/UI/Components/Workflow/ValuePicker/ValueSuggestion.test.ts +377 -0
  827. package/Tests/UI/Components/Workflow/ValuePicker/ValueSuggestionSamples.test.ts +357 -0
  828. package/Tests/UI/Components/Workflow/ValuePicker/ValueTextField.test.tsx +430 -0
  829. package/Tests/UI/Components/Workflow/ValuePicker/VariableValueSource.test.ts +101 -0
  830. package/Tests/UI/Components/Workflow/WebhookTriggerPanel.test.tsx +833 -0
  831. package/Tests/UI/Components/Workflow/WebhookTriggerPanelI18n.test.ts +193 -0
  832. package/Tests/UI/Components/Workflow/Workflow.test.tsx +716 -86
  833. package/Tests/UI/Components/Workflow/WorkflowEnabledDarkMode.test.ts +178 -0
  834. package/Tests/UI/Components/Workflow/WorkflowEnabledI18n.test.tsx +319 -0
  835. package/Tests/UI/Components/Workflow/WorkflowEnabledSwitch.test.tsx +144 -0
  836. package/Tests/UI/Components/Workflow/WorkflowIncomingEmailSecretKey.test.ts +393 -0
  837. package/Tests/UI/Components/Workflow/WorkflowLogModal.test.tsx +598 -1
  838. package/Tests/UI/Components/Workflow/WorkflowRunExport.test.ts +750 -0
  839. package/Tests/UI/Components/Workflow/WorkflowRunExportActions.test.tsx +556 -0
  840. package/Tests/UI/Components/Workflow/WorkflowRunExportI18n.test.ts +200 -0
  841. package/Tests/UI/Components/Workflow/WorkflowStatusLabel.test.tsx +75 -0
  842. package/Tests/UI/Components/Workflow/WorkflowTurnOnModal.test.tsx +256 -0
  843. package/Tests/UI/Components/Workflow/WorkflowTurnedOffNotice.test.tsx +99 -0
  844. package/Tests/UI/Components/Workflow/WorkflowWebhookSecretKey.test.ts +422 -0
  845. package/Tests/UI/Components/fixtures/MarkdownPasteFixtures.ts +460 -0
  846. package/Tests/UI/DeleteConfirmationNamesGuard.test.ts +643 -0
  847. package/Tests/UI/DialogActionRules.test.ts +716 -0
  848. package/Tests/UI/DialogPrimaryActionGuard.test.ts +528 -0
  849. package/Tests/UI/EsbuildConfig.test.ts +115 -39
  850. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +4 -4
  851. package/Tests/UI/Monitor/MonitorLogSummaryRender.test.tsx +377 -0
  852. package/Tests/UI/Styles/PillDarkTheme.test.tsx +177 -0
  853. package/Tests/UI/Styles/ToggleTheme.test.ts +685 -0
  854. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +98 -3
  855. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +20 -2
  856. package/Tests/UI/Utils/McpOAuthPendingAuthorization.test.ts +825 -0
  857. package/Tests/UI/Utils/McpOAuthPendingAuthorizationHttps.test.ts +88 -0
  858. package/Tests/UI/Utils/ModelDisplayName.test.ts +450 -0
  859. package/Tests/UI/Utils/TranslateTemplate.test.ts +149 -0
  860. package/Tests/Utils/AiRemediation/KubectlWriteScopeParityCases.ts +1 -1
  861. package/Tests/Utils/DeveloperDocs/AiAssistantExamples.test.ts +228 -0
  862. package/Tests/Utils/DeveloperDocs/ApiExamples.test.ts +252 -0
  863. package/Tests/Utils/DeveloperDocs/Hcl.test.ts +358 -0
  864. package/Tests/Utils/DeveloperDocs/HclTestValue.ts +56 -0
  865. package/Tests/Utils/DeveloperDocs/TerraformConfig.test.ts +590 -0
  866. package/Tests/Utils/DeveloperDocs/TerraformMonitorSteps.test.ts +608 -0
  867. package/Tests/Utils/DeveloperDocs/TerraformProviderSchemaContract.test.ts +250 -0
  868. package/Tests/Utils/DeveloperDocs/TerraformSchema.test.ts +284 -0
  869. package/Tests/Utils/Email/EmailAddressList.test.ts +149 -0
  870. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  871. package/Tests/Utils/Markdown/DashboardMarkdownRenderer.ts +81 -0
  872. package/Tests/Utils/Markdown/UntrustedMarkdown.test.ts +1339 -0
  873. package/Tests/Utils/Monitor/IncomingEmailMonitorAddress.test.ts +131 -0
  874. package/Tests/Utils/Monitor/MonitorLogSummaryUtil.test.ts +862 -0
  875. package/Tests/Utils/Monitor/MonitorOverviewArchived.test.ts +266 -0
  876. package/Tests/Utils/Monitor/MonitorPauseState.test.ts +143 -0
  877. package/Tests/Utils/Rum/SessionIdentity.test.ts +146 -0
  878. package/Tests/Utils/StatusPage/ArchivedMonitorResources.test.ts +99 -0
  879. package/Types/AI/AIAgentRunLimits.ts +146 -0
  880. package/Types/AI/AIRunType.ts +7 -6
  881. package/Types/AI/AIWorkloadLimits.ts +82 -0
  882. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +2 -2
  883. package/Types/AnalyticsDatabase/RetentionTtl.ts +57 -0
  884. package/Types/BaseDatabase/DatabaseCommonInteractionProps.ts +21 -0
  885. package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +24 -0
  886. package/Types/BaseDatabase/EnableWorkflowOn.ts +8 -0
  887. package/Types/Call/CallProvider.ts +7 -0
  888. package/Types/Code/CodeType.ts +2 -0
  889. package/Types/Code/JsonSyntax.ts +923 -0
  890. package/Types/CustomField/CustomFieldCreateSettings.ts +549 -0
  891. package/Types/CustomField/CustomFieldMappingCatalog.ts +77 -0
  892. package/Types/CustomField/CustomFieldValueValidator.ts +10 -7
  893. package/Types/Database/TableMetadata.ts +10 -0
  894. package/Types/DatabaseServer/DatabaseEndpoint.ts +43 -0
  895. package/Types/Email/EmailTemplateType.ts +2 -0
  896. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +1 -1
  897. package/Types/Exception/ExceptionMessages.ts +1 -0
  898. package/Types/Icon/IconProp.ts +2 -0
  899. package/Types/Incident/IncidentFormIpAllowlist.ts +206 -0
  900. package/Types/Incident/IncidentFormPublic.ts +1145 -0
  901. package/Types/IncomingCall/MissedIncomingCall.ts +72 -0
  902. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +15 -3
  903. package/Types/Mcp/McpOAuthClientAuthMethod.ts +17 -0
  904. package/Types/Mcp/McpOAuthScope.ts +180 -0
  905. package/Types/Mcp/McpOAuthTicket.ts +21 -0
  906. package/Types/Mcp/McpOAuthTokenType.ts +18 -0
  907. package/Types/MessageQueue/MessageQueueIdentity.ts +256 -0
  908. package/Types/MessageQueue/MessageQueueManualIdentity.ts +325 -0
  909. package/Types/MessageQueue/MessageQueueMetricCatalog.ts +1357 -0
  910. package/Types/MessageQueue/MessagingSystem.ts +518 -0
  911. package/Types/MessageQueue/MessagingTelemetryResolver.ts +2311 -0
  912. package/Types/Monitor/MessageQueueAlertTemplates.ts +2128 -0
  913. package/Types/Monitor/MonitorSecretAccess.ts +185 -0
  914. package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +13 -2
  915. package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +1 -1
  916. package/Types/NotificationSetting/NotificationSettingEventType.ts +3 -0
  917. package/Types/OnCallDutyPolicy/OnCallDutyPolicyArchive.ts +19 -0
  918. package/Types/Permission.ts +354 -0
  919. package/Types/ResourceAiAgent/ResourceAiAccess.ts +17 -6
  920. package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
  921. package/Types/Rules/RuleRun.ts +4 -0
  922. package/Types/StatusPage/StatusPageArchive.ts +20 -0
  923. package/Types/Team/ComplianceNotificationChannel.ts +4 -3
  924. package/Types/Team/ComplianceRule.ts +71 -18
  925. package/Types/Team/ComplianceRuleType.ts +2 -2
  926. package/Types/Team/TeamComplianceStatus.ts +6 -2
  927. package/Types/Telemetry/EntityType.ts +16 -0
  928. package/Types/Telemetry/LockedFilterDetail.ts +22 -0
  929. package/Types/Workflow/Component.ts +61 -2
  930. package/Types/Workflow/ComponentID.ts +1 -0
  931. package/Types/Workflow/Components/AI.ts +2 -4
  932. package/Types/Workflow/Components/API.ts +46 -26
  933. package/Types/Workflow/Components/BaseModel.ts +28 -37
  934. package/Types/Workflow/Components/Condition.ts +82 -30
  935. package/Types/Workflow/Components/ConditionComparison.ts +348 -0
  936. package/Types/Workflow/Components/ConditionEvaluation.ts +438 -0
  937. package/Types/Workflow/Components/Email.ts +1 -1
  938. package/Types/Workflow/Components/IncomingEmail.ts +140 -0
  939. package/Types/Workflow/Components/JSON.ts +11 -3
  940. package/Types/Workflow/Components/JavaScript.ts +0 -2
  941. package/Types/Workflow/Components/Manual.ts +2 -3
  942. package/Types/Workflow/Components/Schedule.ts +1 -2
  943. package/Types/Workflow/Components/Slack.ts +12 -4
  944. package/Types/Workflow/Components/Sleep.ts +4 -4
  945. package/Types/Workflow/Components/Webhook.ts +5 -7
  946. package/Types/Workflow/Components.ts +4 -2
  947. package/Types/Workflow/DatabaseOperation.ts +67 -0
  948. package/Types/Workflow/Documentation/AIDocumentation.ts +94 -0
  949. package/Types/Workflow/Documentation/APIDocumentation.ts +94 -0
  950. package/Types/Workflow/Documentation/ComponentDocumentation.ts +92 -0
  951. package/Types/Workflow/Documentation/DatabaseDocumentation.ts +666 -0
  952. package/Types/Workflow/Documentation/DocumentationContext.ts +245 -0
  953. package/Types/Workflow/Documentation/DocumentationLinks.ts +117 -0
  954. package/Types/Workflow/Documentation/DocumentationText.ts +141 -0
  955. package/Types/Workflow/Documentation/Index.ts +114 -0
  956. package/Types/Workflow/Documentation/MessagingDocumentation.ts +316 -0
  957. package/Types/Workflow/Documentation/ModelExamples.ts +333 -0
  958. package/Types/Workflow/Documentation/TriggerDocumentation.ts +217 -0
  959. package/Types/Workflow/Documentation/UtilityDocumentation.ts +338 -0
  960. package/Types/Workflow/IncomingEmailTrigger.ts +384 -0
  961. package/Types/Workflow/StepSamples.ts +965 -0
  962. package/Types/Workflow/StepTrace.ts +311 -6
  963. package/Types/Workflow/SystemColumns.ts +84 -0
  964. package/Types/Workflow/Templates.ts +279 -2
  965. package/Types/Workflow/WebhookTrigger.ts +87 -0
  966. package/Types/Workflow/WorkflowArchive.ts +45 -0
  967. package/Types/Workflow/WorkflowEnabled.ts +51 -0
  968. package/Types/Workflow/WorkflowStatus.ts +36 -0
  969. package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +32 -2
  970. package/Types/XML.ts +26 -0
  971. package/UI/Components/ActionButton/RowActions.tsx +8 -5
  972. package/UI/Components/ActionCard/ActionCard.tsx +22 -2
  973. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +1 -0
  974. package/UI/Components/BulkUpdate/BulkOwnerActions.tsx +1 -0
  975. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +6 -0
  976. package/UI/Components/Button/Button.tsx +19 -11
  977. package/UI/Components/Card/Card.tsx +64 -19
  978. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +1 -4
  979. package/UI/Components/CodeEditor/CodeEditor.css +379 -0
  980. package/UI/Components/CodeEditor/CodeEditor.tsx +1197 -294
  981. package/UI/Components/CodeEditor/CodeEditorCommands.ts +774 -0
  982. package/UI/Components/CodeEditor/CodeEditorHighlight.ts +106 -0
  983. package/UI/Components/CodeEditor/CodeEditorLanguages.ts +164 -0
  984. package/UI/Components/CodeEditor/YamlEditor.tsx +28 -326
  985. package/UI/Components/CollapsibleSection/CollapsibleSection.tsx +19 -3
  986. package/UI/Components/CopyTextButton/CopyTextButton.tsx +5 -1
  987. package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +6 -25
  988. package/UI/Components/DeleteConfirmation/DeleteConfirmationMessage.tsx +175 -0
  989. package/UI/Components/DeleteConfirmation/DeleteItemNames.tsx +71 -0
  990. package/UI/Components/DeleteConfirmation/NamedSentence.tsx +55 -0
  991. package/UI/Components/DeleteConfirmation/TypeToConfirmDelete.tsx +90 -0
  992. package/UI/Components/Dictionary/Dictionary.tsx +31 -1
  993. package/UI/Components/Dropdown/DropdownValueBadge.tsx +21 -13
  994. package/UI/Components/EditionLabel/EditionLabel.tsx +20 -14
  995. package/UI/Components/Error/PageError.tsx +1 -1
  996. package/UI/Components/ErrorMessage/ErrorMessage.tsx +11 -1
  997. package/UI/Components/EventItem/EventItem.tsx +1 -11
  998. package/UI/Components/FormModal/BasicFormModal.tsx +23 -0
  999. package/UI/Components/Forms/BasicForm.tsx +188 -78
  1000. package/UI/Components/Forms/BasicModelForm.tsx +2 -0
  1001. package/UI/Components/Forms/Fields/FormField.tsx +78 -5
  1002. package/UI/Components/Forms/ModelForm.tsx +8 -0
  1003. package/UI/Components/Forms/Steps/Step.tsx +29 -6
  1004. package/UI/Components/Forms/Steps/Steps.tsx +10 -0
  1005. package/UI/Components/Forms/Types/Field.ts +49 -1
  1006. package/UI/Components/Forms/Validation.ts +18 -4
  1007. package/UI/Components/Icon/Icon.tsx +25 -2
  1008. package/UI/Components/Input/Input.tsx +11 -4
  1009. package/UI/Components/Label/Label.tsx +0 -2
  1010. package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +1 -2
  1011. package/UI/Components/LogsViewer/LogsViewer.tsx +4 -0
  1012. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +21 -3
  1013. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  1014. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +877 -79
  1015. package/UI/Components/Markdown.tsx/MarkdownEditorHistory.ts +284 -0
  1016. package/UI/Components/Markdown.tsx/MarkdownListEditing.ts +1362 -0
  1017. package/UI/Components/Markdown.tsx/MarkdownPaste.ts +1326 -0
  1018. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +114 -10
  1019. package/UI/Components/Markdown.tsx/MarkdownVisualEditing.ts +1032 -0
  1020. package/UI/Components/Modal/ConfirmModal.tsx +39 -8
  1021. package/UI/Components/Modal/Modal.tsx +136 -10
  1022. package/UI/Components/Modal/ModalFooter.tsx +28 -10
  1023. package/UI/Components/ModelDelete/ModelDelete.tsx +168 -6
  1024. package/UI/Components/ModelFormModal/ModelFormModal.tsx +47 -9
  1025. package/UI/Components/ModelTable/BaseModelTable.tsx +140 -95
  1026. package/UI/Components/ModelTable/TableView.tsx +14 -2
  1027. package/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.tsx +1 -2
  1028. package/UI/Components/Navbar/NavBar.tsx +3 -2
  1029. package/UI/Components/Pill/Pill.tsx +53 -43
  1030. package/UI/Components/Pill/PillColors.ts +464 -0
  1031. package/UI/Components/ResetObjectID/ResetObjectID.tsx +35 -9
  1032. package/UI/Components/RuleRun/RunRuleNowModal.tsx +6 -0
  1033. package/UI/Components/SideMenu/SideMenu.tsx +136 -12
  1034. package/UI/Components/SideMenu/SideMenuSection.tsx +43 -4
  1035. package/UI/Components/SideMenu/SideMenuSectionState.ts +200 -0
  1036. package/UI/Components/Table/EmptyTableMessage.ts +81 -0
  1037. package/UI/Components/Table/Table.tsx +50 -21
  1038. package/UI/Components/Table/TableRow.tsx +9 -1
  1039. package/UI/Components/TelemetryViewer/FacetVisibility.ts +97 -2
  1040. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +13 -0
  1041. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +214 -7
  1042. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +21 -3
  1043. package/UI/Components/TextArea/TextArea.tsx +183 -5
  1044. package/UI/Components/Toggle/Toggle.tsx +256 -43
  1045. package/UI/Components/Workflow/ArgumentsForm.tsx +496 -359
  1046. package/UI/Components/Workflow/BreakableCode.tsx +88 -0
  1047. package/UI/Components/Workflow/ColumnEditor/AddColumnPicker.tsx +577 -0
  1048. package/UI/Components/Workflow/ColumnEditor/ColumnConditionRow.tsx +20 -5
  1049. package/UI/Components/Workflow/ColumnEditor/ColumnControl.ts +63 -4
  1050. package/UI/Components/Workflow/ColumnEditor/ColumnFieldRow.tsx +21 -4
  1051. package/UI/Components/Workflow/ColumnEditor/ColumnPickerOptions.ts +387 -0
  1052. package/UI/Components/Workflow/ColumnEditor/ColumnUse.ts +126 -0
  1053. package/UI/Components/Workflow/ColumnEditor/ColumnValueInput.tsx +151 -84
  1054. package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +13 -9
  1055. package/UI/Components/Workflow/ColumnEditor/ModelRecordForm.tsx +36 -27
  1056. package/UI/Components/Workflow/Component.tsx +129 -12
  1057. package/UI/Components/Workflow/ComponentPicker/ComponentSearch.ts +1259 -0
  1058. package/UI/Components/Workflow/ComponentPicker/PickerCatalog.ts +419 -0
  1059. package/UI/Components/Workflow/ComponentPicker/PickerItems.tsx +300 -0
  1060. package/UI/Components/Workflow/ComponentPortViewer.tsx +24 -60
  1061. package/UI/Components/Workflow/ComponentPrimaryPanel.tsx +171 -0
  1062. package/UI/Components/Workflow/ComponentReturnValueViewer.tsx +67 -88
  1063. package/UI/Components/Workflow/ComponentSettingsModal.tsx +345 -105
  1064. package/UI/Components/Workflow/ComponentSettingsSection.tsx +103 -0
  1065. package/UI/Components/Workflow/ComponentsModal.tsx +958 -601
  1066. package/UI/Components/Workflow/Condition/ConditionEditor.tsx +484 -0
  1067. package/UI/Components/Workflow/Condition/ConditionModel.ts +785 -0
  1068. package/UI/Components/Workflow/CronScheduleField.tsx +53 -37
  1069. package/UI/Components/Workflow/DocumentationViewer.tsx +399 -118
  1070. package/UI/Components/Workflow/DownloadWorkflowRun.ts +137 -0
  1071. package/UI/Components/Workflow/GraphLint.ts +9 -1
  1072. package/UI/Components/Workflow/GraphLintSummary.ts +142 -2
  1073. package/UI/Components/Workflow/IncomingEmailTriggerPanel.tsx +502 -0
  1074. package/UI/Components/Workflow/ManualTriggerPanel.tsx +41 -0
  1075. package/UI/Components/Workflow/ModelColumnEditor.tsx +7 -10
  1076. package/UI/Components/Workflow/ModelFieldPicker.tsx +76 -14
  1077. package/UI/Components/Workflow/ModelSchema.ts +19 -24
  1078. package/UI/Components/Workflow/NodePlacement.ts +235 -1
  1079. package/UI/Components/Workflow/RunModal.tsx +1 -1
  1080. package/UI/Components/Workflow/StepTracePresentation.ts +537 -0
  1081. package/UI/Components/Workflow/StepTraceViewer.tsx +644 -83
  1082. package/UI/Components/Workflow/UseRunWatch.ts +17 -0
  1083. package/UI/Components/Workflow/UseWorkflowEnabled.ts +275 -0
  1084. package/UI/Components/Workflow/Utils.ts +119 -103
  1085. package/UI/Components/Workflow/ValuePicker/ArgumentControl.ts +146 -0
  1086. package/UI/Components/Workflow/ValuePicker/DefaultValueSources.ts +148 -0
  1087. package/UI/Components/Workflow/ValuePicker/InsertValueButton.tsx +116 -0
  1088. package/UI/Components/Workflow/ValuePicker/ReferenceChip.tsx +162 -0
  1089. package/UI/Components/Workflow/ValuePicker/ReferenceDescription.ts +303 -0
  1090. package/UI/Components/Workflow/ValuePicker/StepGraph.ts +240 -0
  1091. package/UI/Components/Workflow/ValuePicker/StepSampleSource.ts +537 -0
  1092. package/UI/Components/Workflow/ValuePicker/StepValueSource.ts +291 -0
  1093. package/UI/Components/Workflow/ValuePicker/TemplateText.ts +303 -0
  1094. package/UI/Components/Workflow/ValuePicker/TemplateTextDom.ts +563 -0
  1095. package/UI/Components/Workflow/ValuePicker/TemplateTextEditor.tsx +1233 -0
  1096. package/UI/Components/Workflow/ValuePicker/TemplateTextHistory.ts +138 -0
  1097. package/UI/Components/Workflow/ValuePicker/ValuePickerContext.tsx +529 -0
  1098. package/UI/Components/Workflow/ValuePicker/ValuePickerMenu.tsx +1003 -0
  1099. package/UI/Components/Workflow/ValuePicker/ValuePickerPopup.tsx +310 -0
  1100. package/UI/Components/Workflow/ValuePicker/ValueSingleField.tsx +274 -0
  1101. package/UI/Components/Workflow/ValuePicker/ValueSuggestion.ts +694 -0
  1102. package/UI/Components/Workflow/ValuePicker/ValueTextField.tsx +334 -0
  1103. package/UI/Components/Workflow/ValuePicker/VariableValueSource.ts +132 -0
  1104. package/UI/Components/Workflow/WebhookTriggerPanel.tsx +522 -0
  1105. package/UI/Components/Workflow/Workflow.tsx +381 -36
  1106. package/UI/Components/Workflow/WorkflowEnabledCopy.ts +55 -0
  1107. package/UI/Components/Workflow/WorkflowEnabledSwitch.tsx +44 -0
  1108. package/UI/Components/Workflow/WorkflowIncomingEmailSecretKey.ts +156 -0
  1109. package/UI/Components/Workflow/WorkflowLogModal.tsx +98 -17
  1110. package/UI/Components/Workflow/WorkflowRunExport.ts +435 -0
  1111. package/UI/Components/Workflow/WorkflowRunExportActions.tsx +242 -0
  1112. package/UI/Components/Workflow/WorkflowStatus.tsx +25 -26
  1113. package/UI/Components/Workflow/WorkflowTurnOnModal.tsx +119 -0
  1114. package/UI/Components/Workflow/WorkflowTurnedOffNotice.tsx +91 -0
  1115. package/UI/Components/Workflow/WorkflowWebhookSecretKey.ts +184 -0
  1116. package/UI/Styles/Theme.css +82 -3
  1117. package/UI/Utils/McpOAuthPendingAuthorization.ts +132 -0
  1118. package/UI/Utils/ModelDisplayName.ts +294 -0
  1119. package/UI/Utils/TranslateTemplate.ts +123 -0
  1120. package/UI/esbuild-config.js +2 -32
  1121. package/Utils/DeveloperDocs/AiAssistantExamples.ts +383 -0
  1122. package/Utils/DeveloperDocs/ApiExamples.ts +355 -0
  1123. package/Utils/DeveloperDocs/ExampleValues.ts +111 -0
  1124. package/Utils/DeveloperDocs/Hcl.ts +697 -0
  1125. package/Utils/DeveloperDocs/TerraformConfig.ts +805 -0
  1126. package/Utils/DeveloperDocs/TerraformMonitorSteps.ts +583 -0
  1127. package/Utils/DeveloperDocs/TerraformSchema.ts +565 -0
  1128. package/Utils/DeveloperDocs/TerraformValues.ts +375 -0
  1129. package/Utils/Email/EmailAddressList.ts +165 -0
  1130. package/Utils/LabelRuleImportExport.ts +2 -0
  1131. package/Utils/Markdown/UntrustedMarkdown.ts +1513 -0
  1132. package/Utils/ModelImportExport.ts +17 -0
  1133. package/Utils/Monitor/IncomingEmailMonitorAddress.ts +73 -4
  1134. package/Utils/Monitor/IncomingEmailMonitorRequestUtil.ts +41 -0
  1135. package/Utils/Monitor/MonitorLogSummaryUtil.ts +212 -0
  1136. package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +27 -1
  1137. package/Utils/Monitor/MonitorPauseState.ts +90 -0
  1138. package/Utils/Rum/SessionIdentity.ts +88 -0
  1139. package/Utils/StatusPage/ArchivedMonitorResources.ts +38 -0
  1140. package/Utils/Telemetry/EntityKey.ts +48 -0
  1141. package/build/dist/Models/AnalyticsModels/AuditLog.js +56 -0
  1142. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  1143. package/build/dist/Models/AnalyticsModels/Log.js +26 -2
  1144. package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
  1145. package/build/dist/Models/AnalyticsModels/Metric.js +28 -2
  1146. package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
  1147. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js +21 -2
  1148. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js.map +1 -1
  1149. package/build/dist/Models/AnalyticsModels/SloHistory.js +6 -4
  1150. package/build/dist/Models/AnalyticsModels/SloHistory.js.map +1 -1
  1151. package/build/dist/Models/DatabaseModels/AIConversation.js +125 -1
  1152. package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
  1153. package/build/dist/Models/DatabaseModels/AutoRemediationRule.js +1 -1
  1154. package/build/dist/Models/DatabaseModels/AutoRemediationRule.js.map +1 -1
  1155. package/build/dist/Models/DatabaseModels/CephCluster.js +12 -0
  1156. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  1157. package/build/dist/Models/DatabaseModels/CloudResource.js +12 -0
  1158. package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
  1159. package/build/dist/Models/DatabaseModels/CodeRepository.js +1 -1
  1160. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  1161. package/build/dist/Models/DatabaseModels/Dashboard.js +151 -1
  1162. package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
  1163. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +8 -0
  1164. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  1165. package/build/dist/Models/DatabaseModels/DatabaseServer.js +12 -0
  1166. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  1167. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +1 -0
  1168. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -1
  1169. package/build/dist/Models/DatabaseModels/DockerHost.js +12 -0
  1170. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  1171. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +12 -0
  1172. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  1173. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +2 -0
  1174. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
  1175. package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js +1 -0
  1176. package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js.map +1 -1
  1177. package/build/dist/Models/DatabaseModels/GlobalOidc.js +0 -4
  1178. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  1179. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +0 -4
  1180. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
  1181. package/build/dist/Models/DatabaseModels/GlobalSso.js +0 -4
  1182. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  1183. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +0 -4
  1184. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
  1185. package/build/dist/Models/DatabaseModels/Host.js +12 -0
  1186. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  1187. package/build/dist/Models/DatabaseModels/IncidentForm.js +605 -0
  1188. package/build/dist/Models/DatabaseModels/IncidentForm.js.map +1 -0
  1189. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js +299 -0
  1190. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js.map +1 -0
  1191. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +60 -0
  1192. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  1193. package/build/dist/Models/DatabaseModels/IncomingCallLog.js +15 -1
  1194. package/build/dist/Models/DatabaseModels/IncomingCallLog.js.map +1 -1
  1195. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  1196. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  1197. package/build/dist/Models/DatabaseModels/IoTFleet.js +12 -0
  1198. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
  1199. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +12 -0
  1200. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  1201. package/build/dist/Models/DatabaseModels/LlmModelPrice.js +1 -0
  1202. package/build/dist/Models/DatabaseModels/LlmModelPrice.js.map +1 -1
  1203. package/build/dist/Models/DatabaseModels/McpOAuthClient.js +215 -0
  1204. package/build/dist/Models/DatabaseModels/McpOAuthClient.js.map +1 -0
  1205. package/build/dist/Models/DatabaseModels/McpOAuthGrant.js +494 -0
  1206. package/build/dist/Models/DatabaseModels/McpOAuthGrant.js.map +1 -0
  1207. package/build/dist/Models/DatabaseModels/McpOAuthToken.js +256 -0
  1208. package/build/dist/Models/DatabaseModels/McpOAuthToken.js.map +1 -0
  1209. package/build/dist/Models/DatabaseModels/MessageQueue.js +1106 -0
  1210. package/build/dist/Models/DatabaseModels/MessageQueue.js.map +1 -0
  1211. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js +562 -0
  1212. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js.map +1 -0
  1213. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js +643 -0
  1214. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js.map +1 -0
  1215. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js +506 -0
  1216. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js.map +1 -0
  1217. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js +505 -0
  1218. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js.map +1 -0
  1219. package/build/dist/Models/DatabaseModels/Monitor.js +160 -1
  1220. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  1221. package/build/dist/Models/DatabaseModels/MonitorSecret.js +89 -1
  1222. package/build/dist/Models/DatabaseModels/MonitorSecret.js.map +1 -1
  1223. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js +1 -0
  1224. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js.map +1 -1
  1225. package/build/dist/Models/DatabaseModels/OnCallDutyPolicy.js +158 -1
  1226. package/build/dist/Models/DatabaseModels/OnCallDutyPolicy.js.map +1 -1
  1227. package/build/dist/Models/DatabaseModels/PodmanHost.js +12 -0
  1228. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  1229. package/build/dist/Models/DatabaseModels/Project.js +103 -102
  1230. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  1231. package/build/dist/Models/DatabaseModels/ProjectOidc.js +0 -4
  1232. package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
  1233. package/build/dist/Models/DatabaseModels/ProjectSso.js +0 -4
  1234. package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
  1235. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +12 -0
  1236. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  1237. package/build/dist/Models/DatabaseModels/RumApplication.js +12 -0
  1238. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  1239. package/build/dist/Models/DatabaseModels/ServerlessFunction.js +12 -0
  1240. package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
  1241. package/build/dist/Models/DatabaseModels/Service.js +12 -0
  1242. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  1243. package/build/dist/Models/DatabaseModels/StatusPage.js +158 -1
  1244. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  1245. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +0 -4
  1246. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  1247. package/build/dist/Models/DatabaseModels/StatusPageSso.js +0 -4
  1248. package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
  1249. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +49 -3
  1250. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  1251. package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js +1 -0
  1252. package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js.map +1 -1
  1253. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +12 -0
  1254. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  1255. package/build/dist/Models/DatabaseModels/Workflow.js +230 -8
  1256. package/build/dist/Models/DatabaseModels/Workflow.js.map +1 -1
  1257. package/build/dist/Server/API/AIAgentDataAPI.js +1 -1
  1258. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  1259. package/build/dist/Server/API/AIChatAPI.js +9 -103
  1260. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  1261. package/build/dist/Server/API/AIInvestigationAPI.js +3 -3
  1262. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  1263. package/build/dist/Server/API/AIInvestigationConversationAPI.js +162 -0
  1264. package/build/dist/Server/API/AIInvestigationConversationAPI.js.map +1 -0
  1265. package/build/dist/Server/API/AutoRemediationAPI.js +9 -31
  1266. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  1267. package/build/dist/Server/API/CommonAPI.js +15 -0
  1268. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  1269. package/build/dist/Server/API/DashboardAPI.js +7 -3
  1270. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  1271. package/build/dist/Server/API/IncidentFormAPI.js +245 -0
  1272. package/build/dist/Server/API/IncidentFormAPI.js.map +1 -0
  1273. package/build/dist/Server/API/ProjectOIDC.js +16 -24
  1274. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  1275. package/build/dist/Server/API/ProjectSSO.js +16 -24
  1276. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  1277. package/build/dist/Server/API/StatusPageAPI.js +96 -88
  1278. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  1279. package/build/dist/Server/Enterprise/EnterpriseEdition.js +79 -25
  1280. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -1
  1281. package/build/dist/Server/Enterprise/EnterpriseFeature.js +24 -3
  1282. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -1
  1283. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +1 -1
  1284. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -1
  1285. package/build/dist/Server/EnvironmentConfig.js +24 -1
  1286. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  1287. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js +63 -0
  1288. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js.map +1 -0
  1289. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js +41 -0
  1290. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js.map +1 -0
  1291. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js +40 -0
  1292. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js.map +1 -0
  1293. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js +183 -0
  1294. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js.map +1 -0
  1295. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796800000000-FoldAiSwitchesIntoEnableAi.js +79 -0
  1296. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796800000000-FoldAiSwitchesIntoEnableAi.js.map +1 -0
  1297. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796900000000-AddMcpOAuthTables.js +50 -0
  1298. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796900000000-AddMcpOAuthTables.js.map +1 -0
  1299. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797000000000-AddWorkflowIncomingEmailSecretKey.js +25 -0
  1300. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797000000000-AddWorkflowIncomingEmailSecretKey.js.map +1 -0
  1301. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797100000000-AddMonitorSecretAccess.js +32 -0
  1302. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797100000000-AddMonitorSecretAccess.js.map +1 -0
  1303. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797200000000-AddArchiveToMoreResources.js +76 -0
  1304. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797200000000-AddArchiveToMoreResources.js.map +1 -0
  1305. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +18 -0
  1306. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  1307. package/build/dist/Server/Middleware/IncidentFormRateLimit.js +559 -0
  1308. package/build/dist/Server/Middleware/IncidentFormRateLimit.js.map +1 -0
  1309. package/build/dist/Server/Middleware/McpDelegationAuthorization.js +138 -0
  1310. package/build/dist/Server/Middleware/McpDelegationAuthorization.js.map +1 -0
  1311. package/build/dist/Server/Middleware/McpOAuthRateLimit.js +191 -0
  1312. package/build/dist/Server/Middleware/McpOAuthRateLimit.js.map +1 -0
  1313. package/build/dist/Server/Middleware/ProjectAuthorization.js +20 -1
  1314. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  1315. package/build/dist/Server/Middleware/UserAuthorization.js +22 -30
  1316. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  1317. package/build/dist/Server/Services/AIService.js +11 -14
  1318. package/build/dist/Server/Services/AIService.js.map +1 -1
  1319. package/build/dist/Server/Services/AnalyticsDatabaseService.js +15 -5
  1320. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  1321. package/build/dist/Server/Services/ApiKeyService.js +11 -8
  1322. package/build/dist/Server/Services/ApiKeyService.js.map +1 -1
  1323. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +19 -27
  1324. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  1325. package/build/dist/Server/Services/AutoRemediationRuleService.js +1 -1
  1326. package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
  1327. package/build/dist/Server/Services/DashboardService.js +7 -2
  1328. package/build/dist/Server/Services/DashboardService.js.map +1 -1
  1329. package/build/dist/Server/Services/DatabaseServerService.js +161 -1
  1330. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
  1331. package/build/dist/Server/Services/DatabaseService.js +28 -17
  1332. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  1333. package/build/dist/Server/Services/InboundEmail/InboundEmailProvider.js +17 -0
  1334. package/build/dist/Server/Services/InboundEmail/InboundEmailProvider.js.map +1 -1
  1335. package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js +45 -5
  1336. package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js.map +1 -1
  1337. package/build/dist/Server/Services/IncidentCustomFieldService.js +83 -0
  1338. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  1339. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
  1340. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  1341. package/build/dist/Server/Services/IncidentEpisodeService.js +10 -1
  1342. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  1343. package/build/dist/Server/Services/IncidentFormService.js +1202 -0
  1344. package/build/dist/Server/Services/IncidentFormService.js.map +1 -0
  1345. package/build/dist/Server/Services/IncidentFormSubmissionService.js +91 -0
  1346. package/build/dist/Server/Services/IncidentFormSubmissionService.js.map +1 -0
  1347. package/build/dist/Server/Services/IncidentGroupingEngineService.js +20 -8
  1348. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  1349. package/build/dist/Server/Services/IncidentService.js +106 -4
  1350. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  1351. package/build/dist/Server/Services/IncidentTemplateService.js +18 -0
  1352. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  1353. package/build/dist/Server/Services/IncomingCallMissedCallNotificationService.js +227 -0
  1354. package/build/dist/Server/Services/IncomingCallMissedCallNotificationService.js.map +1 -0
  1355. package/build/dist/Server/Services/IncomingCallPolicyService.js +97 -0
  1356. package/build/dist/Server/Services/IncomingCallPolicyService.js.map +1 -1
  1357. package/build/dist/Server/Services/Index.js +22 -0
  1358. package/build/dist/Server/Services/Index.js.map +1 -1
  1359. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +5 -36
  1360. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -1
  1361. package/build/dist/Server/Services/KubernetesClusterService.js +3 -3
  1362. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  1363. package/build/dist/Server/Services/LogAggregationService.js +31 -5
  1364. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  1365. package/build/dist/Server/Services/McpOAuthClientService.js +134 -0
  1366. package/build/dist/Server/Services/McpOAuthClientService.js.map +1 -0
  1367. package/build/dist/Server/Services/McpOAuthGrantService.js +256 -0
  1368. package/build/dist/Server/Services/McpOAuthGrantService.js.map +1 -0
  1369. package/build/dist/Server/Services/McpOAuthTokenService.js +175 -0
  1370. package/build/dist/Server/Services/McpOAuthTokenService.js.map +1 -0
  1371. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js +262 -0
  1372. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js.map +1 -0
  1373. package/build/dist/Server/Services/MessageQueueLabelRuleService.js +13 -0
  1374. package/build/dist/Server/Services/MessageQueueLabelRuleService.js.map +1 -0
  1375. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js +334 -0
  1376. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js.map +1 -0
  1377. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js +13 -0
  1378. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js.map +1 -0
  1379. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js +62 -0
  1380. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js.map +1 -0
  1381. package/build/dist/Server/Services/MessageQueueOwnerUserService.js +62 -0
  1382. package/build/dist/Server/Services/MessageQueueOwnerUserService.js.map +1 -0
  1383. package/build/dist/Server/Services/MessageQueueService.js +1140 -0
  1384. package/build/dist/Server/Services/MessageQueueService.js.map +1 -0
  1385. package/build/dist/Server/Services/MetricAggregationService.js +4 -4
  1386. package/build/dist/Server/Services/MonitorGroupService.js +20 -5
  1387. package/build/dist/Server/Services/MonitorGroupService.js.map +1 -1
  1388. package/build/dist/Server/Services/MonitorProbeService.js +1 -0
  1389. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  1390. package/build/dist/Server/Services/MonitorSecretService.js +346 -0
  1391. package/build/dist/Server/Services/MonitorSecretService.js.map +1 -1
  1392. package/build/dist/Server/Services/MonitorService.js +15 -1
  1393. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  1394. package/build/dist/Server/Services/OnCallDutyPolicyService.js +29 -2
  1395. package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
  1396. package/build/dist/Server/Services/OpenTelemetryIngestService.js +25 -4
  1397. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  1398. package/build/dist/Server/Services/ProjectService.js +25 -68
  1399. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  1400. package/build/dist/Server/Services/ResourceAiAccessService.js +0 -9
  1401. package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -1
  1402. package/build/dist/Server/Services/RunnerJobService.js +2 -2
  1403. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  1404. package/build/dist/Server/Services/RunnerService.js +2 -2
  1405. package/build/dist/Server/Services/RunnerService.js.map +1 -1
  1406. package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -4
  1407. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  1408. package/build/dist/Server/Services/StatusPageService.js +55 -44
  1409. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  1410. package/build/dist/Server/Services/StatusPageSubscriberService.js +17 -0
  1411. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  1412. package/build/dist/Server/Services/TeamComplianceSettingService.js +120 -31
  1413. package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
  1414. package/build/dist/Server/Services/TeamMemberService.js +306 -72
  1415. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  1416. package/build/dist/Server/Services/UserNotificationRuleService.js +8 -1
  1417. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  1418. package/build/dist/Server/Services/UserNotificationSettingService.js +18 -0
  1419. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  1420. package/build/dist/Server/Services/WorkflowService.js +27 -0
  1421. package/build/dist/Server/Services/WorkflowService.js.map +1 -1
  1422. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +12 -3
  1423. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
  1424. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +3 -0
  1425. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  1426. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +6 -3
  1427. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  1428. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +109 -37
  1429. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  1430. package/build/dist/Server/Types/Database/Permissions/Index.js +5 -0
  1431. package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
  1432. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +16 -0
  1433. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  1434. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +3 -3
  1435. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +9 -6
  1436. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  1437. package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js +2 -0
  1438. package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js.map +1 -1
  1439. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js +28 -106
  1440. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js.map +1 -1
  1441. package/build/dist/Server/Types/Workflow/Components/IncomingEmail.js +166 -0
  1442. package/build/dist/Server/Types/Workflow/Components/IncomingEmail.js.map +1 -0
  1443. package/build/dist/Server/Types/Workflow/Components/Index.js +16 -6
  1444. package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
  1445. package/build/dist/Server/Types/Workflow/Components/Schedule.js +20 -4
  1446. package/build/dist/Server/Types/Workflow/Components/Schedule.js.map +1 -1
  1447. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js +128 -0
  1448. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js.map +1 -0
  1449. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +192 -50
  1450. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  1451. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js +133 -0
  1452. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js.map +1 -0
  1453. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +53 -13
  1454. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  1455. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  1456. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js +206 -0
  1457. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js.map +1 -0
  1458. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +53 -26
  1459. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
  1460. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +4 -2
  1461. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
  1462. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +2 -30
  1463. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  1464. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js +1 -1
  1465. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +42 -56
  1466. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  1467. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js +17 -28
  1468. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js.map +1 -1
  1469. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +7 -2
  1470. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  1471. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +47 -64
  1472. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  1473. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +38 -14
  1474. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -1
  1475. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +2 -0
  1476. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -1
  1477. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +40 -10
  1478. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  1479. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +46 -59
  1480. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  1481. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +4 -4
  1482. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
  1483. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js +1 -1
  1484. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js.map +1 -1
  1485. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +27 -31
  1486. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  1487. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js +6 -5
  1488. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -1
  1489. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js +2 -2
  1490. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +5 -5
  1491. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js +4 -3
  1492. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js.map +1 -1
  1493. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +4 -4
  1494. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
  1495. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +1 -1
  1496. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -1
  1497. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +63 -59
  1498. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  1499. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js +412 -0
  1500. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js.map +1 -0
  1501. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js +495 -0
  1502. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js.map +1 -0
  1503. package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +1 -1
  1504. package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js.map +1 -1
  1505. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +9 -1
  1506. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
  1507. package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js +13 -8
  1508. package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js.map +1 -1
  1509. package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js +18 -3
  1510. package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js.map +1 -1
  1511. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +45 -14
  1512. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -1
  1513. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +10 -3
  1514. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -1
  1515. package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js +31 -7
  1516. package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js.map +1 -1
  1517. package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js +22 -7
  1518. package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js.map +1 -1
  1519. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +3 -1
  1520. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
  1521. package/build/dist/Server/Utils/EditionEnforcement.js +20 -158
  1522. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -1
  1523. package/build/dist/Server/Utils/Express.js.map +1 -1
  1524. package/build/dist/Server/Utils/IncomingCall/MissedCallNotification.js +204 -0
  1525. package/build/dist/Server/Utils/IncomingCall/MissedCallNotification.js.map +1 -0
  1526. package/build/dist/Server/Utils/LLM/LLMService.js +193 -54
  1527. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  1528. package/build/dist/Server/Utils/Mcp/McpDelegationToken.js +92 -0
  1529. package/build/dist/Server/Utils/Mcp/McpDelegationToken.js.map +1 -0
  1530. package/build/dist/Server/Utils/Mcp/McpOAuthConfig.js +159 -0
  1531. package/build/dist/Server/Utils/Mcp/McpOAuthConfig.js.map +1 -0
  1532. package/build/dist/Server/Utils/Mcp/McpOAuthGrantAccess.js +204 -0
  1533. package/build/dist/Server/Utils/Mcp/McpOAuthGrantAccess.js.map +1 -0
  1534. package/build/dist/Server/Utils/Mcp/McpOAuthSecret.js +118 -0
  1535. package/build/dist/Server/Utils/Mcp/McpOAuthSecret.js.map +1 -0
  1536. package/build/dist/Server/Utils/Mcp/McpOAuthSignedToken.js +126 -0
  1537. package/build/dist/Server/Utils/Mcp/McpOAuthSignedToken.js.map +1 -0
  1538. package/build/dist/Server/Utils/Mcp/McpOAuthSso.js +159 -0
  1539. package/build/dist/Server/Utils/Mcp/McpOAuthSso.js.map +1 -0
  1540. package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js +25 -0
  1541. package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js.map +1 -1
  1542. package/build/dist/Server/Utils/Monitor/MonitorResource.js +16 -18
  1543. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  1544. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +3 -11
  1545. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  1546. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js +160 -0
  1547. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js.map +1 -0
  1548. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  1549. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  1550. package/build/dist/Server/Utils/SameOriginRequest.js +151 -0
  1551. package/build/dist/Server/Utils/SameOriginRequest.js.map +1 -0
  1552. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +3 -3
  1553. package/build/dist/Server/Utils/Slo/SloMetricUtil.js +3 -3
  1554. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  1555. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  1556. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +11 -4
  1557. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -1
  1558. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -1
  1559. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  1560. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +1022 -0
  1561. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -0
  1562. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +4 -1
  1563. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  1564. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +133 -16
  1565. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
  1566. package/build/dist/Server/Utils/VendorAssets.js +3 -3
  1567. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +2 -0
  1568. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  1569. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +2 -0
  1570. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  1571. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +5 -1
  1572. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  1573. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +5 -1
  1574. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  1575. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +10 -1
  1576. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  1577. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +4 -0
  1578. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -1
  1579. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +2 -0
  1580. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
  1581. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +2 -0
  1582. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -1
  1583. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +4 -0
  1584. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
  1585. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js +2 -0
  1586. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -1
  1587. package/build/dist/Types/AI/AIAgentRunLimits.js +91 -0
  1588. package/build/dist/Types/AI/AIAgentRunLimits.js.map +1 -0
  1589. package/build/dist/Types/AI/AIRunType.js +7 -6
  1590. package/build/dist/Types/AI/AIRunType.js.map +1 -1
  1591. package/build/dist/Types/AI/AIWorkloadLimits.js +59 -0
  1592. package/build/dist/Types/AI/AIWorkloadLimits.js.map +1 -0
  1593. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +2 -2
  1594. package/build/dist/Types/AnalyticsDatabase/RetentionTtl.js +55 -0
  1595. package/build/dist/Types/AnalyticsDatabase/RetentionTtl.js.map +1 -0
  1596. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +17 -0
  1597. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
  1598. package/build/dist/Types/Code/CodeType.js +2 -0
  1599. package/build/dist/Types/Code/CodeType.js.map +1 -1
  1600. package/build/dist/Types/Code/JsonSyntax.js +604 -0
  1601. package/build/dist/Types/Code/JsonSyntax.js.map +1 -0
  1602. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js +310 -0
  1603. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js.map +1 -0
  1604. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +38 -0
  1605. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -1
  1606. package/build/dist/Types/CustomField/CustomFieldValueValidator.js +10 -7
  1607. package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -1
  1608. package/build/dist/Types/Database/TableMetadata.js +3 -0
  1609. package/build/dist/Types/Database/TableMetadata.js.map +1 -1
  1610. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +36 -0
  1611. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -1
  1612. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  1613. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  1614. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +1 -1
  1615. package/build/dist/Types/Exception/ExceptionMessages.js +1 -0
  1616. package/build/dist/Types/Exception/ExceptionMessages.js.map +1 -1
  1617. package/build/dist/Types/Icon/IconProp.js +2 -0
  1618. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  1619. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js +119 -0
  1620. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js.map +1 -0
  1621. package/build/dist/Types/Incident/IncidentFormPublic.js +678 -0
  1622. package/build/dist/Types/Incident/IncidentFormPublic.js.map +1 -0
  1623. package/build/dist/Types/IncomingCall/MissedIncomingCall.js +61 -0
  1624. package/build/dist/Types/IncomingCall/MissedIncomingCall.js.map +1 -0
  1625. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +10 -3
  1626. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
  1627. package/build/dist/Types/Mcp/McpOAuthClientAuthMethod.js +18 -0
  1628. package/build/dist/Types/Mcp/McpOAuthClientAuthMethod.js.map +1 -0
  1629. package/build/dist/Types/Mcp/McpOAuthScope.js +140 -0
  1630. package/build/dist/Types/Mcp/McpOAuthScope.js.map +1 -0
  1631. package/build/dist/Types/Mcp/McpOAuthTicket.js +20 -0
  1632. package/build/dist/Types/Mcp/McpOAuthTicket.js.map +1 -0
  1633. package/build/dist/Types/Mcp/McpOAuthTokenType.js +17 -0
  1634. package/build/dist/Types/Mcp/McpOAuthTokenType.js.map +1 -0
  1635. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js +184 -0
  1636. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js.map +1 -0
  1637. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js +190 -0
  1638. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js.map +1 -0
  1639. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js +1057 -0
  1640. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js.map +1 -0
  1641. package/build/dist/Types/MessageQueue/MessagingSystem.js +394 -0
  1642. package/build/dist/Types/MessageQueue/MessagingSystem.js.map +1 -0
  1643. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js +1768 -0
  1644. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js.map +1 -0
  1645. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js +1207 -0
  1646. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js.map +1 -0
  1647. package/build/dist/Types/Monitor/MonitorSecretAccess.js +111 -0
  1648. package/build/dist/Types/Monitor/MonitorSecretAccess.js.map +1 -0
  1649. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +11 -2
  1650. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -1
  1651. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +1 -1
  1652. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +2 -0
  1653. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  1654. package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyArchive.js +16 -0
  1655. package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyArchive.js.map +1 -0
  1656. package/build/dist/Types/Permission.js +314 -0
  1657. package/build/dist/Types/Permission.js.map +1 -1
  1658. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +10 -4
  1659. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -1
  1660. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +12 -0
  1661. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  1662. package/build/dist/Types/Rules/RuleRun.js +4 -0
  1663. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  1664. package/build/dist/Types/StatusPage/StatusPageArchive.js +16 -0
  1665. package/build/dist/Types/StatusPage/StatusPageArchive.js.map +1 -0
  1666. package/build/dist/Types/Team/ComplianceNotificationChannel.js +4 -3
  1667. package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -1
  1668. package/build/dist/Types/Team/ComplianceRule.js +48 -14
  1669. package/build/dist/Types/Team/ComplianceRule.js.map +1 -1
  1670. package/build/dist/Types/Team/ComplianceRuleType.js +2 -2
  1671. package/build/dist/Types/Telemetry/EntityType.js +16 -0
  1672. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  1673. package/build/dist/Types/Workflow/Component.js +19 -0
  1674. package/build/dist/Types/Workflow/Component.js.map +1 -1
  1675. package/build/dist/Types/Workflow/ComponentID.js +1 -0
  1676. package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
  1677. package/build/dist/Types/Workflow/Components/AI.js +2 -4
  1678. package/build/dist/Types/Workflow/Components/AI.js.map +1 -1
  1679. package/build/dist/Types/Workflow/Components/API.js +26 -26
  1680. package/build/dist/Types/Workflow/Components/API.js.map +1 -1
  1681. package/build/dist/Types/Workflow/Components/BaseModel.js +22 -28
  1682. package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
  1683. package/build/dist/Types/Workflow/Components/Condition.js +70 -29
  1684. package/build/dist/Types/Workflow/Components/Condition.js.map +1 -1
  1685. package/build/dist/Types/Workflow/Components/ConditionComparison.js +256 -0
  1686. package/build/dist/Types/Workflow/Components/ConditionComparison.js.map +1 -0
  1687. package/build/dist/Types/Workflow/Components/ConditionEvaluation.js +279 -0
  1688. package/build/dist/Types/Workflow/Components/ConditionEvaluation.js.map +1 -0
  1689. package/build/dist/Types/Workflow/Components/Email.js +1 -1
  1690. package/build/dist/Types/Workflow/Components/Email.js.map +1 -1
  1691. package/build/dist/Types/Workflow/Components/IncomingEmail.js +129 -0
  1692. package/build/dist/Types/Workflow/Components/IncomingEmail.js.map +1 -0
  1693. package/build/dist/Types/Workflow/Components/JSON.js +10 -3
  1694. package/build/dist/Types/Workflow/Components/JSON.js.map +1 -1
  1695. package/build/dist/Types/Workflow/Components/JavaScript.js +0 -2
  1696. package/build/dist/Types/Workflow/Components/JavaScript.js.map +1 -1
  1697. package/build/dist/Types/Workflow/Components/Manual.js +2 -2
  1698. package/build/dist/Types/Workflow/Components/Manual.js.map +1 -1
  1699. package/build/dist/Types/Workflow/Components/Schedule.js +1 -1
  1700. package/build/dist/Types/Workflow/Components/Schedule.js.map +1 -1
  1701. package/build/dist/Types/Workflow/Components/Slack.js +11 -3
  1702. package/build/dist/Types/Workflow/Components/Slack.js.map +1 -1
  1703. package/build/dist/Types/Workflow/Components/Sleep.js +4 -4
  1704. package/build/dist/Types/Workflow/Components/Sleep.js.map +1 -1
  1705. package/build/dist/Types/Workflow/Components/Webhook.js +4 -6
  1706. package/build/dist/Types/Workflow/Components/Webhook.js.map +1 -1
  1707. package/build/dist/Types/Workflow/Components.js +4 -2
  1708. package/build/dist/Types/Workflow/Components.js.map +1 -1
  1709. package/build/dist/Types/Workflow/DatabaseOperation.js +50 -0
  1710. package/build/dist/Types/Workflow/DatabaseOperation.js.map +1 -0
  1711. package/build/dist/Types/Workflow/Documentation/AIDocumentation.js +78 -0
  1712. package/build/dist/Types/Workflow/Documentation/AIDocumentation.js.map +1 -0
  1713. package/build/dist/Types/Workflow/Documentation/APIDocumentation.js +69 -0
  1714. package/build/dist/Types/Workflow/Documentation/APIDocumentation.js.map +1 -0
  1715. package/build/dist/Types/Workflow/Documentation/ComponentDocumentation.js +44 -0
  1716. package/build/dist/Types/Workflow/Documentation/ComponentDocumentation.js.map +1 -0
  1717. package/build/dist/Types/Workflow/Documentation/DatabaseDocumentation.js +488 -0
  1718. package/build/dist/Types/Workflow/Documentation/DatabaseDocumentation.js.map +1 -0
  1719. package/build/dist/Types/Workflow/Documentation/DocumentationContext.js +139 -0
  1720. package/build/dist/Types/Workflow/Documentation/DocumentationContext.js.map +1 -0
  1721. package/build/dist/Types/Workflow/Documentation/DocumentationLinks.js +62 -0
  1722. package/build/dist/Types/Workflow/Documentation/DocumentationLinks.js.map +1 -0
  1723. package/build/dist/Types/Workflow/Documentation/DocumentationText.js +104 -0
  1724. package/build/dist/Types/Workflow/Documentation/DocumentationText.js.map +1 -0
  1725. package/build/dist/Types/Workflow/Documentation/Index.js +58 -0
  1726. package/build/dist/Types/Workflow/Documentation/Index.js.map +1 -0
  1727. package/build/dist/Types/Workflow/Documentation/MessagingDocumentation.js +247 -0
  1728. package/build/dist/Types/Workflow/Documentation/MessagingDocumentation.js.map +1 -0
  1729. package/build/dist/Types/Workflow/Documentation/ModelExamples.js +210 -0
  1730. package/build/dist/Types/Workflow/Documentation/ModelExamples.js.map +1 -0
  1731. package/build/dist/Types/Workflow/Documentation/TriggerDocumentation.js +184 -0
  1732. package/build/dist/Types/Workflow/Documentation/TriggerDocumentation.js.map +1 -0
  1733. package/build/dist/Types/Workflow/Documentation/UtilityDocumentation.js +290 -0
  1734. package/build/dist/Types/Workflow/Documentation/UtilityDocumentation.js.map +1 -0
  1735. package/build/dist/Types/Workflow/IncomingEmailTrigger.js +275 -0
  1736. package/build/dist/Types/Workflow/IncomingEmailTrigger.js.map +1 -0
  1737. package/build/dist/Types/Workflow/StepSamples.js +601 -0
  1738. package/build/dist/Types/Workflow/StepSamples.js.map +1 -0
  1739. package/build/dist/Types/Workflow/StepTrace.js +135 -4
  1740. package/build/dist/Types/Workflow/StepTrace.js.map +1 -1
  1741. package/build/dist/Types/Workflow/SystemColumns.js +65 -0
  1742. package/build/dist/Types/Workflow/SystemColumns.js.map +1 -0
  1743. package/build/dist/Types/Workflow/Templates.js +178 -2
  1744. package/build/dist/Types/Workflow/Templates.js.map +1 -1
  1745. package/build/dist/Types/Workflow/WebhookTrigger.js +55 -0
  1746. package/build/dist/Types/Workflow/WebhookTrigger.js.map +1 -0
  1747. package/build/dist/Types/Workflow/WorkflowArchive.js +29 -0
  1748. package/build/dist/Types/Workflow/WorkflowArchive.js.map +1 -0
  1749. package/build/dist/Types/Workflow/WorkflowEnabled.js +39 -0
  1750. package/build/dist/Types/Workflow/WorkflowEnabled.js.map +1 -0
  1751. package/build/dist/Types/Workflow/WorkflowStatus.js +24 -0
  1752. package/build/dist/Types/Workflow/WorkflowStatus.js.map +1 -1
  1753. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +23 -3
  1754. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
  1755. package/build/dist/Types/XML.js +23 -0
  1756. package/build/dist/Types/XML.js.map +1 -1
  1757. package/build/dist/UI/Components/ActionButton/RowActions.js +8 -5
  1758. package/build/dist/UI/Components/ActionButton/RowActions.js.map +1 -1
  1759. package/build/dist/UI/Components/ActionCard/ActionCard.js +20 -2
  1760. package/build/dist/UI/Components/ActionCard/ActionCard.js.map +1 -1
  1761. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +1 -1
  1762. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  1763. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js +1 -1
  1764. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js.map +1 -1
  1765. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +2 -0
  1766. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  1767. package/build/dist/UI/Components/Button/Button.js +19 -11
  1768. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  1769. package/build/dist/UI/Components/Card/Card.js +23 -3
  1770. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  1771. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +1 -3
  1772. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  1773. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +676 -264
  1774. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  1775. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js +464 -0
  1776. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js.map +1 -0
  1777. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js +69 -0
  1778. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js.map +1 -0
  1779. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js +108 -0
  1780. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js.map +1 -0
  1781. package/build/dist/UI/Components/CodeEditor/YamlEditor.js +14 -186
  1782. package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -1
  1783. package/build/dist/UI/Components/CollapsibleSection/CollapsibleSection.js +7 -3
  1784. package/build/dist/UI/Components/CollapsibleSection/CollapsibleSection.js.map +1 -1
  1785. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
  1786. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
  1787. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +5 -14
  1788. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -1
  1789. package/build/dist/UI/Components/DeleteConfirmation/DeleteConfirmationMessage.js +97 -0
  1790. package/build/dist/UI/Components/DeleteConfirmation/DeleteConfirmationMessage.js.map +1 -0
  1791. package/build/dist/UI/Components/DeleteConfirmation/DeleteItemNames.js +34 -0
  1792. package/build/dist/UI/Components/DeleteConfirmation/DeleteItemNames.js.map +1 -0
  1793. package/build/dist/UI/Components/DeleteConfirmation/NamedSentence.js +11 -0
  1794. package/build/dist/UI/Components/DeleteConfirmation/NamedSentence.js.map +1 -0
  1795. package/build/dist/UI/Components/DeleteConfirmation/TypeToConfirmDelete.js +44 -0
  1796. package/build/dist/UI/Components/DeleteConfirmation/TypeToConfirmDelete.js.map +1 -0
  1797. package/build/dist/UI/Components/Dictionary/Dictionary.js +17 -1
  1798. package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
  1799. package/build/dist/UI/Components/Dropdown/DropdownValueBadge.js +12 -10
  1800. package/build/dist/UI/Components/Dropdown/DropdownValueBadge.js.map +1 -1
  1801. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +15 -14
  1802. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  1803. package/build/dist/UI/Components/Error/PageError.js +1 -1
  1804. package/build/dist/UI/Components/Error/PageError.js.map +1 -1
  1805. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +1 -1
  1806. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  1807. package/build/dist/UI/Components/EventItem/EventItem.js +1 -4
  1808. package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
  1809. package/build/dist/UI/Components/FormModal/BasicFormModal.js +17 -3
  1810. package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
  1811. package/build/dist/UI/Components/Forms/BasicForm.js +115 -54
  1812. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  1813. package/build/dist/UI/Components/Forms/BasicModelForm.js +1 -1
  1814. package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
  1815. package/build/dist/UI/Components/Forms/Fields/FormField.js +47 -11
  1816. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  1817. package/build/dist/UI/Components/Forms/ModelForm.js +5 -1
  1818. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  1819. package/build/dist/UI/Components/Forms/Steps/Step.js +16 -5
  1820. package/build/dist/UI/Components/Forms/Steps/Step.js.map +1 -1
  1821. package/build/dist/UI/Components/Forms/Steps/Steps.js +3 -1
  1822. package/build/dist/UI/Components/Forms/Steps/Steps.js.map +1 -1
  1823. package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
  1824. package/build/dist/UI/Components/Forms/Validation.js +13 -4
  1825. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  1826. package/build/dist/UI/Components/Icon/Icon.js +15 -2
  1827. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  1828. package/build/dist/UI/Components/Input/Input.js +11 -3
  1829. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  1830. package/build/dist/UI/Components/Label/Label.js +0 -2
  1831. package/build/dist/UI/Components/Label/Label.js.map +1 -1
  1832. package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +1 -1
  1833. package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -1
  1834. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +2 -1
  1835. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  1836. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +14 -4
  1837. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  1838. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  1839. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  1840. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +710 -65
  1841. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  1842. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js +238 -0
  1843. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js.map +1 -0
  1844. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js +1028 -0
  1845. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js.map +1 -0
  1846. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js +1088 -0
  1847. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js.map +1 -0
  1848. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +78 -10
  1849. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  1850. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js +887 -0
  1851. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js.map +1 -0
  1852. package/build/dist/UI/Components/Modal/ConfirmModal.js +22 -3
  1853. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  1854. package/build/dist/UI/Components/Modal/Modal.js +76 -9
  1855. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  1856. package/build/dist/UI/Components/Modal/ModalFooter.js +22 -6
  1857. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  1858. package/build/dist/UI/Components/ModelDelete/ModelDelete.js +84 -7
  1859. package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
  1860. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +38 -13
  1861. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  1862. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +95 -72
  1863. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  1864. package/build/dist/UI/Components/ModelTable/TableView.js +13 -1
  1865. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  1866. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js +1 -1
  1867. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js.map +1 -1
  1868. package/build/dist/UI/Components/Navbar/NavBar.js +3 -2
  1869. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  1870. package/build/dist/UI/Components/Pill/Pill.js +25 -22
  1871. package/build/dist/UI/Components/Pill/Pill.js.map +1 -1
  1872. package/build/dist/UI/Components/Pill/PillColors.js +297 -0
  1873. package/build/dist/UI/Components/Pill/PillColors.js.map +1 -0
  1874. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +7 -5
  1875. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
  1876. package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js +7 -1
  1877. package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js.map +1 -1
  1878. package/build/dist/UI/Components/SideMenu/SideMenu.js +81 -9
  1879. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  1880. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +21 -4
  1881. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  1882. package/build/dist/UI/Components/SideMenu/SideMenuSectionState.js +150 -0
  1883. package/build/dist/UI/Components/SideMenu/SideMenuSectionState.js.map +1 -0
  1884. package/build/dist/UI/Components/Table/EmptyTableMessage.js +51 -0
  1885. package/build/dist/UI/Components/Table/EmptyTableMessage.js.map +1 -0
  1886. package/build/dist/UI/Components/Table/Table.js +30 -11
  1887. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  1888. package/build/dist/UI/Components/Table/TableRow.js +9 -2
  1889. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  1890. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +63 -1
  1891. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -1
  1892. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +4 -2
  1893. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  1894. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +91 -10
  1895. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
  1896. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -4
  1897. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  1898. package/build/dist/UI/Components/TextArea/TextArea.js +129 -5
  1899. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  1900. package/build/dist/UI/Components/Toggle/Toggle.js +115 -22
  1901. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  1902. package/build/dist/UI/Components/Workflow/ArgumentsForm.js +272 -257
  1903. package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
  1904. package/build/dist/UI/Components/Workflow/BreakableCode.js +33 -0
  1905. package/build/dist/UI/Components/Workflow/BreakableCode.js.map +1 -0
  1906. package/build/dist/UI/Components/Workflow/ColumnEditor/AddColumnPicker.js +293 -0
  1907. package/build/dist/UI/Components/Workflow/ColumnEditor/AddColumnPicker.js.map +1 -0
  1908. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnConditionRow.js +17 -2
  1909. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnConditionRow.js.map +1 -1
  1910. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnControl.js +42 -4
  1911. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnControl.js.map +1 -1
  1912. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnFieldRow.js +9 -4
  1913. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnFieldRow.js.map +1 -1
  1914. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnPickerOptions.js +252 -0
  1915. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnPickerOptions.js.map +1 -0
  1916. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnUse.js +88 -0
  1917. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnUse.js.map +1 -0
  1918. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnValueInput.js +79 -44
  1919. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnValueInput.js.map +1 -1
  1920. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +13 -8
  1921. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
  1922. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelRecordForm.js +19 -21
  1923. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelRecordForm.js.map +1 -1
  1924. package/build/dist/UI/Components/Workflow/Component.js +74 -8
  1925. package/build/dist/UI/Components/Workflow/Component.js.map +1 -1
  1926. package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js +864 -0
  1927. package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js.map +1 -0
  1928. package/build/dist/UI/Components/Workflow/ComponentPicker/PickerCatalog.js +254 -0
  1929. package/build/dist/UI/Components/Workflow/ComponentPicker/PickerCatalog.js.map +1 -0
  1930. package/build/dist/UI/Components/Workflow/ComponentPicker/PickerItems.js +105 -0
  1931. package/build/dist/UI/Components/Workflow/ComponentPicker/PickerItems.js.map +1 -0
  1932. package/build/dist/UI/Components/Workflow/ComponentPortViewer.js +15 -45
  1933. package/build/dist/UI/Components/Workflow/ComponentPortViewer.js.map +1 -1
  1934. package/build/dist/UI/Components/Workflow/ComponentPrimaryPanel.js +88 -0
  1935. package/build/dist/UI/Components/Workflow/ComponentPrimaryPanel.js.map +1 -0
  1936. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js +24 -57
  1937. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js.map +1 -1
  1938. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +196 -55
  1939. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
  1940. package/build/dist/UI/Components/Workflow/ComponentSettingsSection.js +34 -0
  1941. package/build/dist/UI/Components/Workflow/ComponentSettingsSection.js.map +1 -0
  1942. package/build/dist/UI/Components/Workflow/ComponentsModal.js +523 -329
  1943. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  1944. package/build/dist/UI/Components/Workflow/Condition/ConditionEditor.js +199 -0
  1945. package/build/dist/UI/Components/Workflow/Condition/ConditionEditor.js.map +1 -0
  1946. package/build/dist/UI/Components/Workflow/Condition/ConditionModel.js +458 -0
  1947. package/build/dist/UI/Components/Workflow/Condition/ConditionModel.js.map +1 -0
  1948. package/build/dist/UI/Components/Workflow/CronScheduleField.js +25 -19
  1949. package/build/dist/UI/Components/Workflow/CronScheduleField.js.map +1 -1
  1950. package/build/dist/UI/Components/Workflow/DocumentationViewer.js +107 -61
  1951. package/build/dist/UI/Components/Workflow/DocumentationViewer.js.map +1 -1
  1952. package/build/dist/UI/Components/Workflow/DownloadWorkflowRun.js +78 -0
  1953. package/build/dist/UI/Components/Workflow/DownloadWorkflowRun.js.map +1 -0
  1954. package/build/dist/UI/Components/Workflow/GraphLint.js +7 -2
  1955. package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -1
  1956. package/build/dist/UI/Components/Workflow/GraphLintSummary.js +59 -1
  1957. package/build/dist/UI/Components/Workflow/GraphLintSummary.js.map +1 -1
  1958. package/build/dist/UI/Components/Workflow/IncomingEmailTriggerPanel.js +215 -0
  1959. package/build/dist/UI/Components/Workflow/IncomingEmailTriggerPanel.js.map +1 -0
  1960. package/build/dist/UI/Components/Workflow/ManualTriggerPanel.js +27 -0
  1961. package/build/dist/UI/Components/Workflow/ManualTriggerPanel.js.map +1 -0
  1962. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +5 -1
  1963. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -1
  1964. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js +45 -4
  1965. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js.map +1 -1
  1966. package/build/dist/UI/Components/Workflow/ModelSchema.js +7 -8
  1967. package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -1
  1968. package/build/dist/UI/Components/Workflow/NodePlacement.js +123 -1
  1969. package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -1
  1970. package/build/dist/UI/Components/Workflow/RunModal.js +1 -1
  1971. package/build/dist/UI/Components/Workflow/StepTracePresentation.js +318 -0
  1972. package/build/dist/UI/Components/Workflow/StepTracePresentation.js.map +1 -0
  1973. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +282 -42
  1974. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
  1975. package/build/dist/UI/Components/Workflow/UseRunWatch.js +4 -0
  1976. package/build/dist/UI/Components/Workflow/UseRunWatch.js.map +1 -1
  1977. package/build/dist/UI/Components/Workflow/UseWorkflowEnabled.js +171 -0
  1978. package/build/dist/UI/Components/Workflow/UseWorkflowEnabled.js.map +1 -0
  1979. package/build/dist/UI/Components/Workflow/Utils.js +95 -88
  1980. package/build/dist/UI/Components/Workflow/Utils.js.map +1 -1
  1981. package/build/dist/UI/Components/Workflow/ValuePicker/ArgumentControl.js +113 -0
  1982. package/build/dist/UI/Components/Workflow/ValuePicker/ArgumentControl.js.map +1 -0
  1983. package/build/dist/UI/Components/Workflow/ValuePicker/DefaultValueSources.js +95 -0
  1984. package/build/dist/UI/Components/Workflow/ValuePicker/DefaultValueSources.js.map +1 -0
  1985. package/build/dist/UI/Components/Workflow/ValuePicker/InsertValueButton.js +46 -0
  1986. package/build/dist/UI/Components/Workflow/ValuePicker/InsertValueButton.js.map +1 -0
  1987. package/build/dist/UI/Components/Workflow/ValuePicker/ReferenceChip.js +88 -0
  1988. package/build/dist/UI/Components/Workflow/ValuePicker/ReferenceChip.js.map +1 -0
  1989. package/build/dist/UI/Components/Workflow/ValuePicker/ReferenceDescription.js +187 -0
  1990. package/build/dist/UI/Components/Workflow/ValuePicker/ReferenceDescription.js.map +1 -0
  1991. package/build/dist/UI/Components/Workflow/ValuePicker/StepGraph.js +147 -0
  1992. package/build/dist/UI/Components/Workflow/ValuePicker/StepGraph.js.map +1 -0
  1993. package/build/dist/UI/Components/Workflow/ValuePicker/StepSampleSource.js +345 -0
  1994. package/build/dist/UI/Components/Workflow/ValuePicker/StepSampleSource.js.map +1 -0
  1995. package/build/dist/UI/Components/Workflow/ValuePicker/StepValueSource.js +181 -0
  1996. package/build/dist/UI/Components/Workflow/ValuePicker/StepValueSource.js.map +1 -0
  1997. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateText.js +172 -0
  1998. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateText.js.map +1 -0
  1999. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateTextDom.js +342 -0
  2000. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateTextDom.js.map +1 -0
  2001. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateTextEditor.js +701 -0
  2002. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateTextEditor.js.map +1 -0
  2003. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateTextHistory.js +104 -0
  2004. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateTextHistory.js.map +1 -0
  2005. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerContext.js +319 -0
  2006. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerContext.js.map +1 -0
  2007. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerMenu.js +502 -0
  2008. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerMenu.js.map +1 -0
  2009. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerPopup.js +176 -0
  2010. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerPopup.js.map +1 -0
  2011. package/build/dist/UI/Components/Workflow/ValuePicker/ValueSingleField.js +111 -0
  2012. package/build/dist/UI/Components/Workflow/ValuePicker/ValueSingleField.js.map +1 -0
  2013. package/build/dist/UI/Components/Workflow/ValuePicker/ValueSuggestion.js +356 -0
  2014. package/build/dist/UI/Components/Workflow/ValuePicker/ValueSuggestion.js.map +1 -0
  2015. package/build/dist/UI/Components/Workflow/ValuePicker/ValueTextField.js +168 -0
  2016. package/build/dist/UI/Components/Workflow/ValuePicker/ValueTextField.js.map +1 -0
  2017. package/build/dist/UI/Components/Workflow/ValuePicker/VariableValueSource.js +80 -0
  2018. package/build/dist/UI/Components/Workflow/ValuePicker/VariableValueSource.js.map +1 -0
  2019. package/build/dist/UI/Components/Workflow/WebhookTriggerPanel.js +225 -0
  2020. package/build/dist/UI/Components/Workflow/WebhookTriggerPanel.js.map +1 -0
  2021. package/build/dist/UI/Components/Workflow/Workflow.js +256 -39
  2022. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  2023. package/build/dist/UI/Components/Workflow/WorkflowEnabledCopy.js +33 -0
  2024. package/build/dist/UI/Components/Workflow/WorkflowEnabledCopy.js.map +1 -0
  2025. package/build/dist/UI/Components/Workflow/WorkflowEnabledSwitch.js +18 -0
  2026. package/build/dist/UI/Components/Workflow/WorkflowEnabledSwitch.js.map +1 -0
  2027. package/build/dist/UI/Components/Workflow/WorkflowIncomingEmailSecretKey.js +97 -0
  2028. package/build/dist/UI/Components/Workflow/WorkflowIncomingEmailSecretKey.js.map +1 -0
  2029. package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +41 -7
  2030. package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -1
  2031. package/build/dist/UI/Components/Workflow/WorkflowRunExport.js +258 -0
  2032. package/build/dist/UI/Components/Workflow/WorkflowRunExport.js.map +1 -0
  2033. package/build/dist/UI/Components/Workflow/WorkflowRunExportActions.js +124 -0
  2034. package/build/dist/UI/Components/Workflow/WorkflowRunExportActions.js.map +1 -0
  2035. package/build/dist/UI/Components/Workflow/WorkflowStatus.js +16 -23
  2036. package/build/dist/UI/Components/Workflow/WorkflowStatus.js.map +1 -1
  2037. package/build/dist/UI/Components/Workflow/WorkflowTurnOnModal.js +60 -0
  2038. package/build/dist/UI/Components/Workflow/WorkflowTurnOnModal.js.map +1 -0
  2039. package/build/dist/UI/Components/Workflow/WorkflowTurnedOffNotice.js +34 -0
  2040. package/build/dist/UI/Components/Workflow/WorkflowTurnedOffNotice.js.map +1 -0
  2041. package/build/dist/UI/Components/Workflow/WorkflowWebhookSecretKey.js +112 -0
  2042. package/build/dist/UI/Components/Workflow/WorkflowWebhookSecretKey.js.map +1 -0
  2043. package/build/dist/UI/Utils/McpOAuthPendingAuthorization.js +111 -0
  2044. package/build/dist/UI/Utils/McpOAuthPendingAuthorization.js.map +1 -0
  2045. package/build/dist/UI/Utils/ModelDisplayName.js +197 -0
  2046. package/build/dist/UI/Utils/ModelDisplayName.js.map +1 -0
  2047. package/build/dist/UI/Utils/TranslateTemplate.js +63 -0
  2048. package/build/dist/UI/Utils/TranslateTemplate.js.map +1 -0
  2049. package/build/dist/Utils/DeveloperDocs/AiAssistantExamples.js +278 -0
  2050. package/build/dist/Utils/DeveloperDocs/AiAssistantExamples.js.map +1 -0
  2051. package/build/dist/Utils/DeveloperDocs/ApiExamples.js +225 -0
  2052. package/build/dist/Utils/DeveloperDocs/ApiExamples.js.map +1 -0
  2053. package/build/dist/Utils/DeveloperDocs/ExampleValues.js +90 -0
  2054. package/build/dist/Utils/DeveloperDocs/ExampleValues.js.map +1 -0
  2055. package/build/dist/Utils/DeveloperDocs/Hcl.js +449 -0
  2056. package/build/dist/Utils/DeveloperDocs/Hcl.js.map +1 -0
  2057. package/build/dist/Utils/DeveloperDocs/TerraformConfig.js +503 -0
  2058. package/build/dist/Utils/DeveloperDocs/TerraformConfig.js.map +1 -0
  2059. package/build/dist/Utils/DeveloperDocs/TerraformMonitorSteps.js +332 -0
  2060. package/build/dist/Utils/DeveloperDocs/TerraformMonitorSteps.js.map +1 -0
  2061. package/build/dist/Utils/DeveloperDocs/TerraformSchema.js +420 -0
  2062. package/build/dist/Utils/DeveloperDocs/TerraformSchema.js.map +1 -0
  2063. package/build/dist/Utils/DeveloperDocs/TerraformValues.js +280 -0
  2064. package/build/dist/Utils/DeveloperDocs/TerraformValues.js.map +1 -0
  2065. package/build/dist/Utils/Email/EmailAddressList.js +132 -0
  2066. package/build/dist/Utils/Email/EmailAddressList.js.map +1 -0
  2067. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  2068. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  2069. package/build/dist/Utils/Markdown/UntrustedMarkdown.js +988 -0
  2070. package/build/dist/Utils/Markdown/UntrustedMarkdown.js.map +1 -0
  2071. package/build/dist/Utils/ModelImportExport.js +15 -0
  2072. package/build/dist/Utils/ModelImportExport.js.map +1 -1
  2073. package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js +54 -3
  2074. package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js.map +1 -1
  2075. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js +34 -0
  2076. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js.map +1 -0
  2077. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js +148 -0
  2078. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js.map +1 -0
  2079. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +19 -1
  2080. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -1
  2081. package/build/dist/Utils/Monitor/MonitorPauseState.js +66 -0
  2082. package/build/dist/Utils/Monitor/MonitorPauseState.js.map +1 -0
  2083. package/build/dist/Utils/Rum/SessionIdentity.js +73 -0
  2084. package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
  2085. package/build/dist/Utils/StatusPage/ArchivedMonitorResources.js +31 -0
  2086. package/build/dist/Utils/StatusPage/ArchivedMonitorResources.js.map +1 -0
  2087. package/build/dist/Utils/Telemetry/EntityKey.js +36 -0
  2088. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  2089. package/package.json +1 -3
  2090. package/test-setup.sh +15 -1
  2091. package/Server/Utils/CommunityEditionSsoReport.ts +0 -361
  2092. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +0 -616
  2093. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +0 -217
  2094. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +0 -271
  2095. package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +0 -215
  2096. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +0 -784
  2097. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +0 -518
  2098. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +0 -419
  2099. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +0 -769
  2100. package/Tests/UI/Components/CodeEditor.test.tsx +0 -638
  2101. package/Tests/UI/Components/MonacoLoader.test.ts +0 -67
  2102. package/Tests/UI/Components/MonacoRuntime.test.ts +0 -121
  2103. package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +0 -329
  2104. package/Tests/UI/Components/YamlEditor.test.tsx +0 -847
  2105. package/UI/Components/CodeEditor/MonacoLoader.ts +0 -36
  2106. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -319
  2107. package/UI/Components/Telemetry/TelemetryRetentionConfigSummary.tsx +0 -223
  2108. package/UI/Components/Workflow/ColumnEditor/AddColumnDropdown.tsx +0 -177
  2109. package/UI/Components/Workflow/ComponentValuePickerModal.tsx +0 -325
  2110. package/UI/Components/Workflow/VariableModal.tsx +0 -59
  2111. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +0 -223
  2112. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +0 -1
  2113. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +0 -34
  2114. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +0 -1
  2115. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +0 -171
  2116. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +0 -1
  2117. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js +0 -119
  2118. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js.map +0 -1
  2119. package/build/dist/UI/Components/Workflow/ColumnEditor/AddColumnDropdown.js +0 -86
  2120. package/build/dist/UI/Components/Workflow/ColumnEditor/AddColumnDropdown.js.map +0 -1
  2121. package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js +0 -144
  2122. package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js.map +0 -1
  2123. package/build/dist/UI/Components/Workflow/VariableModal.js +0 -31
  2124. package/build/dist/UI/Components/Workflow/VariableModal.js.map +0 -1
@@ -5,6 +5,7 @@ import TeamComplianceSettingService, {
5
5
  OPTIONS_DIFFER_MESSAGE,
6
6
  SEVERITIES_DELETED_ENABLE_MESSAGE,
7
7
  SEVERITIES_DELETED_OPTION,
8
+ StoredChannelColumns,
8
9
  TeamComplianceSettingService as TeamComplianceSettingServiceClass,
9
10
  } from "../../../Server/Services/TeamComplianceSettingService";
10
11
  import EnterpriseEdition from "../../../Server/Enterprise/EnterpriseEdition";
@@ -42,24 +43,35 @@ import { FindOperator } from "typeorm";
42
43
  /*
43
44
  * TeamComplianceSettingService guards what a team compliance rule may say.
44
45
  *
45
- * A rule is a type (ComplianceRuleType), optionally a channel ("Call") and a
46
- * severity scope ("Critical"). One team may hold several rules of one type -
47
- * "Call for Critical incidents" and "Push for Critical incidents" are both
46
+ * A rule is a type (ComplianceRuleType), optionally channels ("Call", or
47
+ * "Call and Push" - a member needs a rule on each) and a severity scope
48
+ * ("Critical"). One team may hold several rules of one type - "Call for
49
+ * Critical incidents" and "Push for Critical incidents" are both
48
50
  * HasIncidentOnCallRules - so there is no unique index any more; the service
49
- * refuses EXACT duplicates instead (same type, channel and severity set).
51
+ * refuses EXACT duplicates instead (same type, channel set and severity set).
52
+ *
53
+ * The channels are stored twice: as the list in notificationChannels, and -
54
+ * for API clients and builds from before the list - as the list's first
55
+ * channel in notificationChannel. A payload may send either; the hooks write
56
+ * both, and a stored row is read by getStoredChannels, which trusts the list
57
+ * only while the single column still agrees with it.
50
58
  *
51
59
  * These tests pin, against an in-memory team of stored rules and project
52
60
  * severities:
53
61
  *
54
- * - create refuses unknown rule types and channels, and anything without a
55
- * project or team, before reading anything;
62
+ * - create refuses unknown rule types and channels (in a list or on their
63
+ * own), and anything without a project or team, before reading anything;
64
+ * - a channel list is stored canonical - catalog order, each channel once -
65
+ * with its first channel beside it, and a single-channel payload from an
66
+ * older client is stored as a one-item list;
56
67
  * - options a rule type does not use are cleared, per kind, so nothing is
57
68
  * stored that looks like part of a rule without being checked;
58
69
  * - selected severities must exist in the rule's own project, of the rule's
59
70
  * own kind - checked in one count, as root, and never for a stray option;
60
71
  * - duplicates are judged on content (order, repeats and id case do not
61
- * matter), legacy "no channel, every severity" rows included, while a
62
- * different channel, severity set, rule type or team is a different rule;
72
+ * matter, for channels as for severities), legacy "no channel, every
73
+ * severity" rows and rows an older build wrote included, while a different
74
+ * channel set, severity set, rule type or team is a different rule;
63
75
  * - an update that only switches a rule off reads nothing at all; one that
64
76
  * switches it on reads only whether a severity delete left it with
65
77
  * nothing to check, and refuses that;
@@ -69,8 +81,9 @@ import { FindOperator } from "typeorm";
69
81
  * siblings excluding the row itself, reads only inside the caller's
70
82
  * project, and a rule type change clears the options the new type does not
71
83
  * use, including ones already stored on the row;
72
- * - the static scope helpers the ee server can reuse (getIds, getScope,
73
- * isSameScope).
84
+ * - the static helpers the ee server can reuse (getIds, getScope,
85
+ * isSameScope, getStoredChannels) and the channel ones behind the hooks
86
+ * (resolveSentChannels, normaliseChannelFields).
74
87
  *
75
88
  * The protected hooks are called directly, as the other service tests do; a
76
89
  * last block drives updateOneById - the path the API takes - to show that what
@@ -113,6 +126,9 @@ const UNKNOWN_CHANNEL_MESSAGE: (value: string) => string = (
113
126
  return `"${value}" is not a notification channel a compliance rule can require.`;
114
127
  };
115
128
 
129
+ const NOT_A_CHANNEL_LIST_MESSAGE: string =
130
+ "The notification channels of a compliance rule must be a list of channels.";
131
+
116
132
  const UNKNOWN_RULE_TYPE_MESSAGE: (value: string) => string = (
117
133
  value: string,
118
134
  ): string => {
@@ -314,6 +330,14 @@ interface StoredRuleInput {
314
330
  ruleType: string;
315
331
  teamId?: ObjectID | undefined;
316
332
  projectId?: ObjectID | undefined;
333
+ /*
334
+ * The channel columns as the row holds them. A row a current build wrote
335
+ * has the list, and its first channel in notificationChannel - give only
336
+ * `notificationChannels` for that. A row an older build wrote (or one from
337
+ * before the list) has notificationChannel alone and the list NULL - give
338
+ * only `notificationChannel`. Give both to store a pair that disagrees.
339
+ */
340
+ notificationChannels?: Array<string> | null | undefined;
317
341
  notificationChannel?: string | null | undefined;
318
342
  incidentSeverityIds?: Array<string> | undefined;
319
343
  alertSeverityIds?: Array<string> | undefined;
@@ -341,8 +365,14 @@ const storedRule: (input: StoredRuleInput) => TeamComplianceSetting = (
341
365
  }
342
366
 
343
367
  (setting as unknown as Record<string, unknown>)["ruleType"] = input.ruleType;
368
+ (setting as unknown as Record<string, unknown>)["notificationChannels"] =
369
+ input.notificationChannels === undefined
370
+ ? null
371
+ : input.notificationChannels;
344
372
  (setting as unknown as Record<string, unknown>)["notificationChannel"] =
345
- input.notificationChannel === undefined ? null : input.notificationChannel;
373
+ input.notificationChannel !== undefined
374
+ ? input.notificationChannel
375
+ : input.notificationChannels?.[0] || null;
346
376
  setting.enabled = input.enabled === undefined ? true : input.enabled;
347
377
 
348
378
  if (input.options !== undefined) {
@@ -378,6 +408,8 @@ const store: (...rows: Array<StoredRuleInput>) => void = (
378
408
 
379
409
  interface NewRuleInput {
380
410
  ruleType?: unknown;
411
+ notificationChannels?: unknown;
412
+ // The single channel of a client from before the list.
381
413
  notificationChannel?: unknown;
382
414
  incidentSeverities?: unknown;
383
415
  alertSeverities?: unknown;
@@ -405,6 +437,7 @@ const newRule: (input: NewRuleInput) => TeamComplianceSetting = (
405
437
 
406
438
  for (const key of [
407
439
  "ruleType",
440
+ "notificationChannels",
408
441
  "notificationChannel",
409
442
  "incidentSeverities",
410
443
  "alertSeverities",
@@ -613,6 +646,28 @@ const modelValue: (setting: TeamComplianceSetting, key: string) => unknown = (
613
646
  return (setting as unknown as Record<string, unknown>)[key];
614
647
  };
615
648
 
649
+ // The two channel columns a create or an update is about to write.
650
+ interface ChannelPair {
651
+ notificationChannels: unknown;
652
+ notificationChannel: unknown;
653
+ }
654
+
655
+ const channelsOf: (
656
+ data: TeamComplianceSetting | Record<string, unknown>,
657
+ ) => ChannelPair = (
658
+ data: TeamComplianceSetting | Record<string, unknown>,
659
+ ): ChannelPair => {
660
+ const values: Record<string, unknown> = data as unknown as Record<
661
+ string,
662
+ unknown
663
+ >;
664
+
665
+ return {
666
+ notificationChannels: values["notificationChannels"],
667
+ notificationChannel: values["notificationChannel"],
668
+ };
669
+ };
670
+
616
671
  /*
617
672
  * A severity list as the hooks leave it for the relation save: models of the
618
673
  * list's own kind, each carrying nothing but its id. Returns those ids.
@@ -706,47 +761,69 @@ describe("TeamComplianceSettingService onBeforeCreate - what may be created", ()
706
761
  });
707
762
 
708
763
  test.each(ALL_CHANNELS)(
709
- "accepts the %s channel on every on-call rule type and keeps it",
764
+ "accepts the %s channel on every on-call rule type and keeps it, with the channel beside the list",
710
765
  async (channel: ComplianceNotificationChannel) => {
711
766
  for (const ruleType of ON_CALL_RULE_TYPES) {
712
767
  const result: OnCreate<TeamComplianceSetting> = await create({
713
768
  ruleType: ruleType,
714
- notificationChannel: channel,
769
+ notificationChannels: [channel],
715
770
  });
716
771
 
717
- expect({
772
+ expect({ ruleType, ...channelsOf(result.createBy.data) }).toEqual({
718
773
  ruleType,
719
- channel: result.createBy.data.notificationChannel,
720
- }).toEqual({ ruleType, channel });
774
+ notificationChannels: [channel],
775
+ notificationChannel: channel,
776
+ });
721
777
  }
722
778
  },
723
779
  );
724
780
 
725
781
  test.each([
726
- ["undefined", undefined],
782
+ ["an empty list", []],
727
783
  ["null", null],
728
784
  ])(
729
- "a %s channel is 'any channel', and is valid",
730
- async (_label: string, channel: unknown) => {
785
+ "channels sent as %s are 'any channel': valid, and written as an empty list with no channel beside it",
786
+ async (_label: string, channels: unknown) => {
731
787
  const result: OnCreate<TeamComplianceSetting> = await create({
732
788
  ruleType: ComplianceRuleType.HasAlertOnCallRules,
733
- notificationChannel: channel,
789
+ notificationChannels: channels,
734
790
  });
735
791
 
736
- expect(modelValue(result.createBy.data, "notificationChannel")).toBe(
737
- channel,
738
- );
792
+ expect(channelsOf(result.createBy.data)).toEqual({
793
+ notificationChannels: [],
794
+ notificationChannel: null,
795
+ });
739
796
  },
740
797
  );
741
798
 
799
+ test("channels not sent are 'any channel' too, and stay unsent", async () => {
800
+ const result: OnCreate<TeamComplianceSetting> = await create({
801
+ ruleType: ComplianceRuleType.HasAlertOnCallRules,
802
+ notificationChannels: undefined,
803
+ });
804
+
805
+ expect(channelsOf(result.createBy.data)).toEqual({
806
+ notificationChannels: undefined,
807
+ notificationChannel: undefined,
808
+ });
809
+ });
810
+
742
811
  test.each([
743
812
  ["a channel that does not exist", "Pager"],
744
813
  ["a channel in the wrong case", "call"],
745
814
  ["an empty string", ""],
746
815
  ["a method rule type", "HasNotificationCallMethod"],
816
+ ["a label rather than a value", "Push notification"],
747
817
  ])(
748
- "refuses %s as the channel, before reading anything",
818
+ "refuses %s as a channel, before reading anything - in a list, and on its own",
749
819
  async (_label: string, channel: string) => {
820
+ await expect(
821
+ create({
822
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
823
+ notificationChannels: [ComplianceNotificationChannel.Call, channel],
824
+ }),
825
+ ).rejects.toThrow(new BadDataException(UNKNOWN_CHANNEL_MESSAGE(channel)));
826
+
750
827
  await expect(
751
828
  create({
752
829
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
@@ -758,7 +835,32 @@ describe("TeamComplianceSettingService onBeforeCreate - what may be created", ()
758
835
  },
759
836
  );
760
837
 
838
+ test.each([
839
+ ["one channel as a bare string", ComplianceNotificationChannel.Call],
840
+ ["an object", { channel: ComplianceNotificationChannel.Call }],
841
+ ["a number", 3],
842
+ ])(
843
+ "refuses channels sent as %s rather than a list, before reading anything",
844
+ async (_label: string, channels: unknown) => {
845
+ await expect(
846
+ create({
847
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
848
+ notificationChannels: channels,
849
+ }),
850
+ ).rejects.toThrow(new BadDataException(NOT_A_CHANNEL_LIST_MESSAGE));
851
+
852
+ expectNoReads();
853
+ },
854
+ );
855
+
761
856
  test("refuses a channel that is not a channel even on a method rule - garbage is refused, not quietly dropped", async () => {
857
+ await expect(
858
+ create({
859
+ ruleType: ComplianceRuleType.HasNotificationEmailMethod,
860
+ notificationChannels: ["Pager"],
861
+ }),
862
+ ).rejects.toThrow(UNKNOWN_CHANNEL_MESSAGE("Pager"));
863
+
762
864
  await expect(
763
865
  create({
764
866
  ruleType: ComplianceRuleType.HasNotificationEmailMethod,
@@ -845,32 +947,52 @@ describe("TeamComplianceSettingService onBeforeCreate - options a rule type does
845
947
  async (ruleType: ComplianceRuleType) => {
846
948
  const result: OnCreate<TeamComplianceSetting> = await create({
847
949
  ruleType: ruleType,
848
- notificationChannel: ComplianceNotificationChannel.Call,
950
+ notificationChannels: [
951
+ ComplianceNotificationChannel.Call,
952
+ ComplianceNotificationChannel.Push,
953
+ ],
849
954
  incidentSeverities: [CRITICAL_INCIDENT],
850
955
  alertSeverities: [CRITICAL_ALERT],
851
956
  });
852
957
 
853
- expect(
854
- modelValue(result.createBy.data, "notificationChannel"),
855
- ).toBeNull();
958
+ expect(channelsOf(result.createBy.data)).toEqual({
959
+ notificationChannels: [],
960
+ notificationChannel: null,
961
+ });
856
962
  expect(result.createBy.data.incidentSeverities).toEqual([]);
857
963
  expect(result.createBy.data.alertSeverities).toEqual([]);
858
964
  },
859
965
  );
860
966
 
967
+ test.each(METHOD_RULE_TYPES)(
968
+ "%s keeps no channel sent the old way either",
969
+ async (ruleType: ComplianceRuleType) => {
970
+ const result: OnCreate<TeamComplianceSetting> = await create({
971
+ ruleType: ruleType,
972
+ notificationChannel: ComplianceNotificationChannel.Call,
973
+ });
974
+
975
+ expect(channelsOf(result.createBy.data)).toEqual({
976
+ notificationChannels: [],
977
+ notificationChannel: null,
978
+ });
979
+ },
980
+ );
981
+
861
982
  test.each(INCIDENT_RULE_TYPES)(
862
983
  "%s keeps its channel and incident severities, and drops alert severities",
863
984
  async (ruleType: ComplianceRuleType) => {
864
985
  const result: OnCreate<TeamComplianceSetting> = await create({
865
986
  ruleType: ruleType,
866
- notificationChannel: ComplianceNotificationChannel.Push,
987
+ notificationChannels: [ComplianceNotificationChannel.Push],
867
988
  incidentSeverities: [CRITICAL_INCIDENT],
868
989
  alertSeverities: [CRITICAL_ALERT],
869
990
  });
870
991
 
871
- expect(result.createBy.data.notificationChannel).toBe(
872
- ComplianceNotificationChannel.Push,
873
- );
992
+ expect(channelsOf(result.createBy.data)).toEqual({
993
+ notificationChannels: [ComplianceNotificationChannel.Push],
994
+ notificationChannel: ComplianceNotificationChannel.Push,
995
+ });
874
996
  expect(
875
997
  writtenIds(
876
998
  modelValue(result.createBy.data, "incidentSeverities"),
@@ -886,14 +1008,15 @@ describe("TeamComplianceSettingService onBeforeCreate - options a rule type does
886
1008
  async (ruleType: ComplianceRuleType) => {
887
1009
  const result: OnCreate<TeamComplianceSetting> = await create({
888
1010
  ruleType: ruleType,
889
- notificationChannel: ComplianceNotificationChannel.SMS,
1011
+ notificationChannels: [ComplianceNotificationChannel.SMS],
890
1012
  incidentSeverities: [CRITICAL_INCIDENT],
891
1013
  alertSeverities: [CRITICAL_ALERT],
892
1014
  });
893
1015
 
894
- expect(result.createBy.data.notificationChannel).toBe(
895
- ComplianceNotificationChannel.SMS,
896
- );
1016
+ expect(channelsOf(result.createBy.data)).toEqual({
1017
+ notificationChannels: [ComplianceNotificationChannel.SMS],
1018
+ notificationChannel: ComplianceNotificationChannel.SMS,
1019
+ });
897
1020
  expect(
898
1021
  writtenIds(
899
1022
  modelValue(result.createBy.data, "alertSeverities"),
@@ -933,6 +1056,7 @@ describe("TeamComplianceSettingService onBeforeCreate - options a rule type does
933
1056
  ruleType: ComplianceRuleType.HasNotificationEmailMethod,
934
1057
  });
935
1058
 
1059
+ expect(result.createBy.data.notificationChannels).toBeUndefined();
936
1060
  expect(result.createBy.data.notificationChannel).toBeUndefined();
937
1061
  expect(result.createBy.data.incidentSeverities).toBeUndefined();
938
1062
  expect(result.createBy.data.alertSeverities).toBeUndefined();
@@ -1099,7 +1223,7 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1099
1223
  test("the duplicate lookup reads the team's rules of that type in the project, as root", async () => {
1100
1224
  await create({
1101
1225
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1102
- notificationChannel: ComplianceNotificationChannel.Call,
1226
+ notificationChannels: [ComplianceNotificationChannel.Call],
1103
1227
  });
1104
1228
 
1105
1229
  expect(settingsFindBy).toHaveBeenCalledTimes(1);
@@ -1113,6 +1237,7 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1113
1237
  expect(findBy["select"]).toEqual({
1114
1238
  _id: true,
1115
1239
  ruleType: true,
1240
+ notificationChannels: true,
1116
1241
  notificationChannel: true,
1117
1242
  // A rule a severity delete emptied is no duplicate: see below.
1118
1243
  options: true,
@@ -1137,12 +1262,12 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1137
1262
  {
1138
1263
  id: SIBLING_SETTING_ID,
1139
1264
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1140
- notificationChannel: ComplianceNotificationChannel.Call,
1265
+ notificationChannels: [ComplianceNotificationChannel.Call],
1141
1266
  incidentSeverityIds: [CRITICAL_INCIDENT],
1142
1267
  },
1143
1268
  {
1144
1269
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1145
- notificationChannel: ComplianceNotificationChannel.Call,
1270
+ notificationChannels: [ComplianceNotificationChannel.Call],
1146
1271
  incidentSeverities: [CRITICAL_INCIDENT],
1147
1272
  },
1148
1273
  ],
@@ -1151,12 +1276,12 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1151
1276
  {
1152
1277
  id: SIBLING_SETTING_ID,
1153
1278
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1154
- notificationChannel: ComplianceNotificationChannel.Call,
1279
+ notificationChannels: [ComplianceNotificationChannel.Call],
1155
1280
  incidentSeverityIds: [MAJOR_INCIDENT, CRITICAL_INCIDENT],
1156
1281
  },
1157
1282
  {
1158
1283
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1159
- notificationChannel: ComplianceNotificationChannel.Call,
1284
+ notificationChannels: [ComplianceNotificationChannel.Call],
1160
1285
  incidentSeverities: [
1161
1286
  { _id: CRITICAL_INCIDENT },
1162
1287
  { _id: MAJOR_INCIDENT },
@@ -1169,12 +1294,12 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1169
1294
  {
1170
1295
  id: SIBLING_SETTING_ID,
1171
1296
  ruleType: ComplianceRuleType.HasAlertOnCallRules,
1172
- notificationChannel: ComplianceNotificationChannel.Push,
1297
+ notificationChannels: [ComplianceNotificationChannel.Push],
1173
1298
  alertSeverityIds: [CRITICAL_ALERT],
1174
1299
  },
1175
1300
  {
1176
1301
  ruleType: ComplianceRuleType.HasAlertOnCallRules,
1177
- notificationChannel: ComplianceNotificationChannel.Push,
1302
+ notificationChannels: [ComplianceNotificationChannel.Push],
1178
1303
  alertSeverities: [CRITICAL_ALERT.toUpperCase()],
1179
1304
  },
1180
1305
  ],
@@ -1196,7 +1321,7 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1196
1321
  },
1197
1322
  {
1198
1323
  ruleType: ComplianceRuleType.HasAlertOnCallRules,
1199
- notificationChannel: null,
1324
+ notificationChannels: [],
1200
1325
  alertSeverities: [],
1201
1326
  },
1202
1327
  ],
@@ -1218,7 +1343,7 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1218
1343
  },
1219
1344
  {
1220
1345
  ruleType: ComplianceRuleType.HasNotificationCallMethod,
1221
- notificationChannel: ComplianceNotificationChannel.Call,
1346
+ notificationChannels: [ComplianceNotificationChannel.Call],
1222
1347
  incidentSeverities: [CRITICAL_INCIDENT],
1223
1348
  alertSeverities: [CRITICAL_ALERT],
1224
1349
  },
@@ -1250,12 +1375,12 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1250
1375
  {
1251
1376
  id: SIBLING_SETTING_ID,
1252
1377
  ruleType: ComplianceRuleType.HasAlertEpisodeOnCallRules,
1253
- notificationChannel: ComplianceNotificationChannel.Webhook,
1378
+ notificationChannels: [ComplianceNotificationChannel.Webhook],
1254
1379
  alertSeverityIds: [MAJOR_ALERT, CRITICAL_ALERT],
1255
1380
  },
1256
1381
  {
1257
1382
  ruleType: ComplianceRuleType.HasAlertEpisodeOnCallRules,
1258
- notificationChannel: ComplianceNotificationChannel.Webhook,
1383
+ notificationChannels: [ComplianceNotificationChannel.Webhook],
1259
1384
  alertSeverities: [CRITICAL_ALERT, MAJOR_ALERT],
1260
1385
  },
1261
1386
  ],
@@ -1280,12 +1405,12 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1280
1405
  {
1281
1406
  id: SIBLING_SETTING_ID,
1282
1407
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1283
- notificationChannel: ComplianceNotificationChannel.Call,
1408
+ notificationChannels: [ComplianceNotificationChannel.Call],
1284
1409
  incidentSeverityIds: [CRITICAL_INCIDENT],
1285
1410
  },
1286
1411
  {
1287
1412
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1288
- notificationChannel: ComplianceNotificationChannel.Push,
1413
+ notificationChannels: [ComplianceNotificationChannel.Push],
1289
1414
  incidentSeverities: [CRITICAL_INCIDENT],
1290
1415
  },
1291
1416
  ],
@@ -1294,12 +1419,12 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1294
1419
  {
1295
1420
  id: SIBLING_SETTING_ID,
1296
1421
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1297
- notificationChannel: ComplianceNotificationChannel.Call,
1422
+ notificationChannels: [ComplianceNotificationChannel.Call],
1298
1423
  incidentSeverityIds: [CRITICAL_INCIDENT],
1299
1424
  },
1300
1425
  {
1301
1426
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1302
- notificationChannel: null,
1427
+ notificationChannels: [],
1303
1428
  incidentSeverities: [CRITICAL_INCIDENT],
1304
1429
  },
1305
1430
  ],
@@ -1311,7 +1436,7 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1311
1436
  },
1312
1437
  {
1313
1438
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1314
- notificationChannel: ComplianceNotificationChannel.Call,
1439
+ notificationChannels: [ComplianceNotificationChannel.Call],
1315
1440
  },
1316
1441
  ],
1317
1442
  [
@@ -1319,12 +1444,12 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1319
1444
  {
1320
1445
  id: SIBLING_SETTING_ID,
1321
1446
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1322
- notificationChannel: ComplianceNotificationChannel.Call,
1447
+ notificationChannels: [ComplianceNotificationChannel.Call],
1323
1448
  incidentSeverityIds: [CRITICAL_INCIDENT],
1324
1449
  },
1325
1450
  {
1326
1451
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1327
- notificationChannel: ComplianceNotificationChannel.Call,
1452
+ notificationChannels: [ComplianceNotificationChannel.Call],
1328
1453
  incidentSeverities: [CRITICAL_INCIDENT, MAJOR_INCIDENT],
1329
1454
  },
1330
1455
  ],
@@ -1333,12 +1458,12 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1333
1458
  {
1334
1459
  id: SIBLING_SETTING_ID,
1335
1460
  ruleType: ComplianceRuleType.HasAlertOnCallRules,
1336
- notificationChannel: ComplianceNotificationChannel.Push,
1461
+ notificationChannels: [ComplianceNotificationChannel.Push],
1337
1462
  alertSeverityIds: [CRITICAL_ALERT],
1338
1463
  },
1339
1464
  {
1340
1465
  ruleType: ComplianceRuleType.HasAlertOnCallRules,
1341
- notificationChannel: ComplianceNotificationChannel.Push,
1466
+ notificationChannels: [ComplianceNotificationChannel.Push],
1342
1467
  },
1343
1468
  ],
1344
1469
  [
@@ -1346,12 +1471,12 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1346
1471
  {
1347
1472
  id: SIBLING_SETTING_ID,
1348
1473
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1349
- notificationChannel: ComplianceNotificationChannel.Call,
1474
+ notificationChannels: [ComplianceNotificationChannel.Call],
1350
1475
  incidentSeverityIds: [CRITICAL_INCIDENT],
1351
1476
  },
1352
1477
  {
1353
1478
  ruleType: ComplianceRuleType.HasIncidentEpisodeOnCallRules,
1354
- notificationChannel: ComplianceNotificationChannel.Call,
1479
+ notificationChannels: [ComplianceNotificationChannel.Call],
1355
1480
  incidentSeverities: [CRITICAL_INCIDENT],
1356
1481
  },
1357
1482
  ],
@@ -1406,13 +1531,13 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1406
1531
  {
1407
1532
  id: "66666666-6666-4666-8666-00000000000a",
1408
1533
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1409
- notificationChannel: ComplianceNotificationChannel.Call,
1534
+ notificationChannels: [ComplianceNotificationChannel.Call],
1410
1535
  incidentSeverityIds: [CRITICAL_INCIDENT],
1411
1536
  },
1412
1537
  {
1413
1538
  id: "66666666-6666-4666-8666-00000000000b",
1414
1539
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1415
- notificationChannel: ComplianceNotificationChannel.Push,
1540
+ notificationChannels: [ComplianceNotificationChannel.Push],
1416
1541
  incidentSeverityIds: [CRITICAL_INCIDENT],
1417
1542
  },
1418
1543
  {
@@ -1424,7 +1549,7 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1424
1549
  await expect(
1425
1550
  create({
1426
1551
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1427
- notificationChannel: ComplianceNotificationChannel.SMS,
1552
+ notificationChannels: [ComplianceNotificationChannel.SMS],
1428
1553
  incidentSeverities: [CRITICAL_INCIDENT],
1429
1554
  }),
1430
1555
  ).resolves.toBeDefined();
@@ -1432,7 +1557,7 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1432
1557
  await expect(
1433
1558
  create({
1434
1559
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1435
- notificationChannel: ComplianceNotificationChannel.Push,
1560
+ notificationChannels: [ComplianceNotificationChannel.Push],
1436
1561
  incidentSeverities: [CRITICAL_INCIDENT],
1437
1562
  }),
1438
1563
  ).rejects.toThrow(DUPLICATE_COMPLIANCE_RULE_MESSAGE);
@@ -1448,7 +1573,7 @@ describe("TeamComplianceSettingService onBeforeCreate - exact duplicates are ref
1448
1573
  const INCIDENT_CALL_CRITICAL: StoredRuleInput = {
1449
1574
  id: SETTING_ID,
1450
1575
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1451
- notificationChannel: ComplianceNotificationChannel.Call,
1576
+ notificationChannels: [ComplianceNotificationChannel.Call],
1452
1577
  incidentSeverityIds: [CRITICAL_INCIDENT],
1453
1578
  };
1454
1579
 
@@ -1459,7 +1584,7 @@ const INCIDENT_CALL_CRITICAL: StoredRuleInput = {
1459
1584
  const EMPTIED_BY_DELETE: StoredRuleInput = {
1460
1585
  id: SETTING_ID,
1461
1586
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1462
- notificationChannel: ComplianceNotificationChannel.Call,
1587
+ notificationChannels: [ComplianceNotificationChannel.Call],
1463
1588
  enabled: false,
1464
1589
  options: { [SEVERITIES_DELETED_OPTION]: true },
1465
1590
  };
@@ -1531,7 +1656,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - turning a rule on", () =
1531
1656
  store(INCIDENT_CALL_CRITICAL, {
1532
1657
  id: SIBLING_SETTING_ID,
1533
1658
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1534
- notificationChannel: ComplianceNotificationChannel.Call,
1659
+ notificationChannels: [ComplianceNotificationChannel.Call],
1535
1660
  enabled: false,
1536
1661
  });
1537
1662
 
@@ -1643,7 +1768,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - turning a rule on", () =
1643
1768
  store({
1644
1769
  id: SETTING_ID,
1645
1770
  ruleType: ComplianceRuleType.HasAlertEpisodeOnCallRules,
1646
- notificationChannel: ComplianceNotificationChannel.Push,
1771
+ notificationChannels: [ComplianceNotificationChannel.Push],
1647
1772
  enabled: false,
1648
1773
  options: { [SEVERITIES_DELETED_OPTION]: true },
1649
1774
  // A stray severity of the other kind is not a scope.
@@ -1662,7 +1787,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - re-scoping a rule a seve
1662
1787
 
1663
1788
  const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
1664
1789
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1665
- notificationChannel: ComplianceNotificationChannel.Call,
1790
+ notificationChannels: [ComplianceNotificationChannel.Call],
1666
1791
  incidentSeverities: [{ _id: MAJOR_INCIDENT }],
1667
1792
  alertSeverities: [],
1668
1793
  enabled: true,
@@ -1685,7 +1810,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - re-scoping a rule a seve
1685
1810
  ],
1686
1811
  [
1687
1812
  "a new channel",
1688
- { notificationChannel: ComplianceNotificationChannel.Push },
1813
+ { notificationChannels: [ComplianceNotificationChannel.Push] },
1689
1814
  ],
1690
1815
  [
1691
1816
  "a new rule type",
@@ -1752,7 +1877,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - re-scoping a rule a seve
1752
1877
  {
1753
1878
  ...INCIDENT_CALL_CRITICAL,
1754
1879
  id: SIBLING_SETTING_ID,
1755
- notificationChannel: ComplianceNotificationChannel.SMS,
1880
+ notificationChannels: [ComplianceNotificationChannel.SMS],
1756
1881
  options: { note: "the sibling's own" },
1757
1882
  },
1758
1883
  );
@@ -1791,14 +1916,14 @@ describe("TeamComplianceSettingService - a rule a severity delete emptied duplic
1791
1916
  {
1792
1917
  id: SETTING_ID,
1793
1918
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1794
- notificationChannel: ComplianceNotificationChannel.Call,
1919
+ notificationChannels: [ComplianceNotificationChannel.Call],
1795
1920
  },
1796
1921
  );
1797
1922
 
1798
1923
  await expect(
1799
1924
  update({
1800
1925
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1801
- notificationChannel: ComplianceNotificationChannel.Call,
1926
+ notificationChannels: [ComplianceNotificationChannel.Call],
1802
1927
  incidentSeverities: [],
1803
1928
  alertSeverities: [],
1804
1929
  enabled: false,
@@ -1812,7 +1937,7 @@ describe("TeamComplianceSettingService - a rule a severity delete emptied duplic
1812
1937
  await expect(
1813
1938
  create({
1814
1939
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1815
- notificationChannel: ComplianceNotificationChannel.Call,
1940
+ notificationChannels: [ComplianceNotificationChannel.Call],
1816
1941
  }),
1817
1942
  ).resolves.toBeDefined();
1818
1943
  });
@@ -1827,7 +1952,7 @@ describe("TeamComplianceSettingService - a rule a severity delete emptied duplic
1827
1952
  await expect(
1828
1953
  create({
1829
1954
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1830
- notificationChannel: ComplianceNotificationChannel.Call,
1955
+ notificationChannels: [ComplianceNotificationChannel.Call],
1831
1956
  }),
1832
1957
  ).rejects.toThrow(DUPLICATE_COMPLIANCE_RULE_MESSAGE);
1833
1958
  });
@@ -1842,7 +1967,7 @@ describe("TeamComplianceSettingService - a rule a severity delete emptied duplic
1842
1967
  await expect(
1843
1968
  create({
1844
1969
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1845
- notificationChannel: ComplianceNotificationChannel.Call,
1970
+ notificationChannels: [ComplianceNotificationChannel.Call],
1846
1971
  incidentSeverities: [MAJOR_INCIDENT],
1847
1972
  }),
1848
1973
  ).rejects.toThrow(DUPLICATE_COMPLIANCE_RULE_MESSAGE);
@@ -1867,7 +1992,9 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
1867
1992
  test("reads the rows being changed inside the caller's project, as root, with what their scope needs", async () => {
1868
1993
  store(INCIDENT_CALL_CRITICAL);
1869
1994
 
1870
- await update({ notificationChannel: ComplianceNotificationChannel.Push });
1995
+ await update({
1996
+ notificationChannels: [ComplianceNotificationChannel.Push],
1997
+ });
1871
1998
 
1872
1999
  const existingRead: JSONObject = findByCalls()[0]!;
1873
2000
  expect(existingRead["query"]).toEqual({
@@ -1879,6 +2006,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
1879
2006
  teamId: true,
1880
2007
  projectId: true,
1881
2008
  ruleType: true,
2009
+ notificationChannels: true,
1882
2010
  notificationChannel: true,
1883
2011
  options: true,
1884
2012
  incidentSeverities: { _id: true },
@@ -1893,7 +2021,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
1893
2021
  store(INCIDENT_CALL_CRITICAL);
1894
2022
 
1895
2023
  const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
1896
- notificationChannel: ComplianceNotificationChannel.Push,
2024
+ notificationChannels: [ComplianceNotificationChannel.Push],
1897
2025
  });
1898
2026
 
1899
2027
  await onBeforeUpdate(updateBy);
@@ -1911,13 +2039,13 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
1911
2039
  store({
1912
2040
  ...INCIDENT_CALL_CRITICAL,
1913
2041
  id: SIBLING_SETTING_ID,
1914
- notificationChannel: ComplianceNotificationChannel.Push,
2042
+ notificationChannels: [ComplianceNotificationChannel.Push],
1915
2043
  });
1916
2044
 
1917
2045
  await expect(
1918
2046
  onBeforeUpdate(
1919
2047
  updateByFor(
1920
- { notificationChannel: ComplianceNotificationChannel.Push },
2048
+ { notificationChannels: [ComplianceNotificationChannel.Push] },
1921
2049
  { query: { _id: OTHER_PROJECT_SETTING_ID } },
1922
2050
  ),
1923
2051
  ),
@@ -1936,7 +2064,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
1936
2064
 
1937
2065
  await onBeforeUpdate(
1938
2066
  updateByFor(
1939
- { notificationChannel: ComplianceNotificationChannel.Push },
2067
+ { notificationChannels: [ComplianceNotificationChannel.Push] },
1940
2068
  { props: { isRoot: true } },
1941
2069
  ),
1942
2070
  );
@@ -1952,7 +2080,9 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
1952
2080
  test("compares against the team's other rules, never against the row itself", async () => {
1953
2081
  store(INCIDENT_CALL_CRITICAL);
1954
2082
 
1955
- await update({ notificationChannel: ComplianceNotificationChannel.Push });
2083
+ await update({
2084
+ notificationChannels: [ComplianceNotificationChannel.Push],
2085
+ });
1956
2086
 
1957
2087
  const siblings: Array<JSONObject> = siblingReads();
1958
2088
  expect(siblings).toHaveLength(1);
@@ -1978,7 +2108,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
1978
2108
  await expect(
1979
2109
  update({
1980
2110
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
1981
- notificationChannel: ComplianceNotificationChannel.Call,
2111
+ notificationChannels: [ComplianceNotificationChannel.Call],
1982
2112
  incidentSeverities: [{ _id: CRITICAL_INCIDENT }],
1983
2113
  alertSeverities: [],
1984
2114
  enabled: true,
@@ -1990,11 +2120,11 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
1990
2120
  store(INCIDENT_CALL_CRITICAL, {
1991
2121
  ...INCIDENT_CALL_CRITICAL,
1992
2122
  id: SIBLING_SETTING_ID,
1993
- notificationChannel: ComplianceNotificationChannel.Push,
2123
+ notificationChannels: [ComplianceNotificationChannel.Push],
1994
2124
  });
1995
2125
 
1996
2126
  await expect(
1997
- update({ notificationChannel: ComplianceNotificationChannel.Push }),
2127
+ update({ notificationChannels: [ComplianceNotificationChannel.Push] }),
1998
2128
  ).rejects.toThrow(new BadDataException(DUPLICATE_COMPLIANCE_RULE_MESSAGE));
1999
2129
  });
2000
2130
 
@@ -2020,12 +2150,12 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
2020
2150
  store(INCIDENT_CALL_CRITICAL, {
2021
2151
  id: SIBLING_SETTING_ID,
2022
2152
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
2023
- notificationChannel: ComplianceNotificationChannel.SMS,
2153
+ notificationChannels: [ComplianceNotificationChannel.SMS],
2024
2154
  incidentSeverityIds: [CRITICAL_INCIDENT],
2025
2155
  });
2026
2156
 
2027
2157
  await expect(
2028
- update({ notificationChannel: ComplianceNotificationChannel.SMS }),
2158
+ update({ notificationChannels: [ComplianceNotificationChannel.SMS] }),
2029
2159
  ).rejects.toThrow(DUPLICATE_COMPLIANCE_RULE_MESSAGE);
2030
2160
  });
2031
2161
 
@@ -2036,7 +2166,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
2036
2166
  incidentSeverityIds: [CRITICAL_INCIDENT],
2037
2167
  });
2038
2168
 
2039
- await expect(update({ notificationChannel: null })).rejects.toThrow(
2169
+ await expect(update({ notificationChannels: [] })).rejects.toThrow(
2040
2170
  DUPLICATE_COMPLIANCE_RULE_MESSAGE,
2041
2171
  );
2042
2172
  });
@@ -2066,11 +2196,11 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
2066
2196
  store({
2067
2197
  id: SETTING_ID,
2068
2198
  ruleType: "RequireTwoFactorAuth",
2069
- notificationChannel: ComplianceNotificationChannel.Call,
2199
+ notificationChannels: [ComplianceNotificationChannel.Call],
2070
2200
  });
2071
2201
 
2072
2202
  await expect(
2073
- update({ notificationChannel: ComplianceNotificationChannel.Push }),
2203
+ update({ notificationChannels: [ComplianceNotificationChannel.Push] }),
2074
2204
  ).resolves.toBeDefined();
2075
2205
 
2076
2206
  expect(siblingReads()).toEqual([]);
@@ -2177,7 +2307,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
2177
2307
  await expect(
2178
2308
  onBeforeUpdate(
2179
2309
  updateByFor(
2180
- { notificationChannel: ComplianceNotificationChannel.Push },
2310
+ { notificationChannels: [ComplianceNotificationChannel.Push] },
2181
2311
  { props: { isRoot: true } },
2182
2312
  ),
2183
2313
  ),
@@ -2196,7 +2326,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - scope changes", () => {
2196
2326
 
2197
2327
  await onBeforeUpdate(
2198
2328
  updateByFor(
2199
- { notificationChannel: ComplianceNotificationChannel.Push },
2329
+ { notificationChannels: [ComplianceNotificationChannel.Push] },
2200
2330
  {
2201
2331
  query: {
2202
2332
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
@@ -2225,6 +2355,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - a rule type change", ()
2225
2355
 
2226
2356
  expect(dataOf(updateBy)).toEqual({
2227
2357
  ruleType: ComplianceRuleType.HasNotificationEmailMethod,
2358
+ notificationChannels: [],
2228
2359
  notificationChannel: null,
2229
2360
  incidentSeverities: [],
2230
2361
  alertSeverities: [],
@@ -2268,7 +2399,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - a rule type change", ()
2268
2399
  store(INCIDENT_CALL_CRITICAL, {
2269
2400
  id: SIBLING_SETTING_ID,
2270
2401
  ruleType: ComplianceRuleType.HasAlertOnCallRules,
2271
- notificationChannel: ComplianceNotificationChannel.Call,
2402
+ notificationChannels: [ComplianceNotificationChannel.Call],
2272
2403
  });
2273
2404
 
2274
2405
  await expect(
@@ -2350,13 +2481,14 @@ describe("TeamComplianceSettingService onBeforeUpdate - options the stored type
2350
2481
  });
2351
2482
 
2352
2483
  const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
2353
- notificationChannel: ComplianceNotificationChannel.Call,
2484
+ notificationChannels: [ComplianceNotificationChannel.Call],
2354
2485
  incidentSeverities: [CRITICAL_INCIDENT],
2355
2486
  });
2356
2487
 
2357
2488
  await onBeforeUpdate(updateBy);
2358
2489
 
2359
2490
  expect(dataOf(updateBy)).toEqual({
2491
+ notificationChannels: [],
2360
2492
  notificationChannel: null,
2361
2493
  incidentSeverities: [],
2362
2494
  });
@@ -2366,7 +2498,7 @@ describe("TeamComplianceSettingService onBeforeUpdate - options the stored type
2366
2498
  store(INCIDENT_CALL_CRITICAL);
2367
2499
 
2368
2500
  const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
2369
- notificationChannel: ComplianceNotificationChannel.Push,
2501
+ notificationChannels: [ComplianceNotificationChannel.Push],
2370
2502
  incidentSeverities: [{ _id: MAJOR_INCIDENT }],
2371
2503
  });
2372
2504
 
@@ -2375,10 +2507,12 @@ describe("TeamComplianceSettingService onBeforeUpdate - options the stored type
2375
2507
  expect(Object.keys(dataOf(updateBy)).sort()).toEqual([
2376
2508
  "incidentSeverities",
2377
2509
  "notificationChannel",
2510
+ "notificationChannels",
2378
2511
  ]);
2379
- expect(dataOf(updateBy)["notificationChannel"]).toBe(
2380
- ComplianceNotificationChannel.Push,
2381
- );
2512
+ expect(channelsOf(dataOf(updateBy))).toEqual({
2513
+ notificationChannels: [ComplianceNotificationChannel.Push],
2514
+ notificationChannel: ComplianceNotificationChannel.Push,
2515
+ });
2382
2516
  expect(
2383
2517
  writtenIds(dataOf(updateBy)["incidentSeverities"], IncidentSeverity),
2384
2518
  ).toEqual([MAJOR_INCIDENT]);
@@ -2403,7 +2537,7 @@ describe("TeamComplianceSettingService - the severities checked are the severiti
2403
2537
  test("create: repeats and case collapse to one lower-case id each, handed to the save as models", async () => {
2404
2538
  const result: OnCreate<TeamComplianceSetting> = await create({
2405
2539
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
2406
- notificationChannel: ComplianceNotificationChannel.Call,
2540
+ notificationChannels: [ComplianceNotificationChannel.Call],
2407
2541
  incidentSeverities: [
2408
2542
  CRITICAL_INCIDENT.toUpperCase(),
2409
2543
  { _id: CRITICAL_INCIDENT },
@@ -2459,7 +2593,7 @@ describe("TeamComplianceSettingService - the severities checked are the severiti
2459
2593
  store(INCIDENT_CALL_CRITICAL, {
2460
2594
  id: SIBLING_SETTING_ID,
2461
2595
  ruleType: ComplianceRuleType.HasAlertOnCallRules,
2462
- notificationChannel: ComplianceNotificationChannel.Push,
2596
+ notificationChannels: [ComplianceNotificationChannel.Push],
2463
2597
  alertSeverityIds: [CRITICAL_ALERT],
2464
2598
  });
2465
2599
 
@@ -2529,7 +2663,7 @@ describe("TeamComplianceSettingService - the severities checked are the severiti
2529
2663
  await expect(
2530
2664
  create({
2531
2665
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
2532
- notificationChannel: ComplianceNotificationChannel.Call,
2666
+ notificationChannels: [ComplianceNotificationChannel.Call],
2533
2667
  incidentSeverities: [{ _id: 1, id: CRITICAL_INCIDENT }],
2534
2668
  }),
2535
2669
  ).rejects.toThrow(DUPLICATE_COMPLIANCE_RULE_MESSAGE);
@@ -2885,7 +3019,7 @@ describe("TeamComplianceSettingService - the caller's permission is checked befo
2885
3019
  createByFor(
2886
3020
  newRule({
2887
3021
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
2888
- notificationChannel: ComplianceNotificationChannel.Call,
3022
+ notificationChannels: [ComplianceNotificationChannel.Call],
2889
3023
  incidentSeverities: [FOREIGN_INCIDENT],
2890
3024
  }),
2891
3025
  props,
@@ -2898,7 +3032,7 @@ describe("TeamComplianceSettingService - the caller's permission is checked befo
2898
3032
  createByFor(
2899
3033
  newRule({
2900
3034
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
2901
- notificationChannel: ComplianceNotificationChannel.Call,
3035
+ notificationChannels: [ComplianceNotificationChannel.Call],
2902
3036
  incidentSeverities: [CRITICAL_INCIDENT],
2903
3037
  }),
2904
3038
  props,
@@ -2916,12 +3050,12 @@ describe("TeamComplianceSettingService - the caller's permission is checked befo
2916
3050
  store(INCIDENT_CALL_CRITICAL, {
2917
3051
  ...INCIDENT_CALL_CRITICAL,
2918
3052
  id: SIBLING_SETTING_ID,
2919
- notificationChannel: ComplianceNotificationChannel.Push,
3053
+ notificationChannels: [ComplianceNotificationChannel.Push],
2920
3054
  });
2921
3055
 
2922
3056
  for (const data of [
2923
3057
  { incidentSeverities: [FOREIGN_INCIDENT] },
2924
- { notificationChannel: ComplianceNotificationChannel.Push },
3058
+ { notificationChannels: [ComplianceNotificationChannel.Push] },
2925
3059
  ]) {
2926
3060
  await expect(
2927
3061
  onBeforeUpdate(updateByFor({ ...data }, { props: props })),
@@ -2995,13 +3129,13 @@ describe("TeamComplianceSettingService - the caller's permission is checked befo
2995
3129
  for (const input of [
2996
3130
  {
2997
3131
  ruleType: ComplianceRuleType.HasNotificationCallMethod,
2998
- notificationChannel: ComplianceNotificationChannel.SMS,
3132
+ notificationChannels: [ComplianceNotificationChannel.SMS],
2999
3133
  incidentSeverities: [FOREIGN_INCIDENT],
3000
3134
  alertSeverities: [FOREIGN_ALERT],
3001
3135
  },
3002
3136
  {
3003
3137
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3004
- notificationChannel: ComplianceNotificationChannel.Call,
3138
+ notificationChannels: [ComplianceNotificationChannel.Call],
3005
3139
  incidentSeverities: [CRITICAL_INCIDENT, CRITICAL_INCIDENT],
3006
3140
  alertSeverities: [FOREIGN_ALERT],
3007
3141
  },
@@ -3030,7 +3164,7 @@ describe("TeamComplianceSettingService - the caller's permission is checked befo
3030
3164
  createByFor(
3031
3165
  newRule({
3032
3166
  ruleType: ComplianceRuleType.HasAlertOnCallRules,
3033
- notificationChannel: ComplianceNotificationChannel.Push,
3167
+ notificationChannels: [ComplianceNotificationChannel.Push],
3034
3168
  alertSeverities: [CRITICAL_ALERT],
3035
3169
  incidentSeverities: [CRITICAL_INCIDENT],
3036
3170
  }),
@@ -3058,7 +3192,7 @@ describe("TeamComplianceSettingService - the caller's permission is checked befo
3058
3192
  incidentSeverities: [{ _id: MAJOR_INCIDENT }, MAJOR_INCIDENT],
3059
3193
  alertSeverities: [FOREIGN_ALERT],
3060
3194
  },
3061
- { notificationChannel: null },
3195
+ { notificationChannels: [] },
3062
3196
  ]) {
3063
3197
  const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor(
3064
3198
  { ...data },
@@ -3105,7 +3239,7 @@ describe("TeamComplianceSettingService - the caller's permission is checked befo
3105
3239
  );
3106
3240
  await onBeforeUpdate(
3107
3241
  updateByFor(
3108
- { notificationChannel: ComplianceNotificationChannel.Push },
3242
+ { notificationChannels: [ComplianceNotificationChannel.Push] },
3109
3243
  { props: { isRoot: true } },
3110
3244
  ),
3111
3245
  );
@@ -3164,37 +3298,37 @@ describe("TeamComplianceSettingService - a severity delete pauses and marks the
3164
3298
  {
3165
3299
  id: RULE_CRITICAL_ONLY,
3166
3300
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3167
- notificationChannel: ComplianceNotificationChannel.Call,
3301
+ notificationChannels: [ComplianceNotificationChannel.Call],
3168
3302
  incidentSeverityIds: [CRITICAL_INCIDENT],
3169
3303
  },
3170
3304
  {
3171
3305
  id: RULE_EPISODE_CRITICAL_ONLY,
3172
3306
  ruleType: ComplianceRuleType.HasIncidentEpisodeOnCallRules,
3173
- notificationChannel: ComplianceNotificationChannel.SMS,
3307
+ notificationChannels: [ComplianceNotificationChannel.SMS],
3174
3308
  incidentSeverityIds: [CRITICAL_INCIDENT],
3175
3309
  },
3176
3310
  {
3177
3311
  id: RULE_CRITICAL_AND_MAJOR,
3178
3312
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3179
- notificationChannel: ComplianceNotificationChannel.Push,
3313
+ notificationChannels: [ComplianceNotificationChannel.Push],
3180
3314
  incidentSeverityIds: [CRITICAL_INCIDENT, MAJOR_INCIDENT],
3181
3315
  },
3182
3316
  {
3183
3317
  id: RULE_EVERY_SEVERITY,
3184
3318
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3185
- notificationChannel: ComplianceNotificationChannel.Email,
3319
+ notificationChannels: [ComplianceNotificationChannel.Email],
3186
3320
  },
3187
3321
  {
3188
3322
  id: RULE_PAUSED,
3189
3323
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3190
- notificationChannel: ComplianceNotificationChannel.Slack,
3324
+ notificationChannels: [ComplianceNotificationChannel.Slack],
3191
3325
  incidentSeverityIds: [CRITICAL_INCIDENT],
3192
3326
  enabled: false,
3193
3327
  },
3194
3328
  {
3195
3329
  id: RULE_ALERT,
3196
3330
  ruleType: ComplianceRuleType.HasAlertOnCallRules,
3197
- notificationChannel: ComplianceNotificationChannel.Call,
3331
+ notificationChannels: [ComplianceNotificationChannel.Call],
3198
3332
  alertSeverityIds: [CRITICAL_ALERT],
3199
3333
  },
3200
3334
  {
@@ -3213,7 +3347,7 @@ describe("TeamComplianceSettingService - a severity delete pauses and marks the
3213
3347
  {
3214
3348
  id: RULE_MAJOR_ONLY,
3215
3349
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3216
- notificationChannel: ComplianceNotificationChannel.WhatsApp,
3350
+ notificationChannels: [ComplianceNotificationChannel.WhatsApp],
3217
3351
  incidentSeverityIds: [MAJOR_INCIDENT],
3218
3352
  },
3219
3353
  );
@@ -3319,7 +3453,7 @@ describe("TeamComplianceSettingService - a severity delete pauses and marks the
3319
3453
  {
3320
3454
  id: RULE_CRITICAL_ONLY,
3321
3455
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3322
- notificationChannel: ComplianceNotificationChannel.Call,
3456
+ notificationChannels: [ComplianceNotificationChannel.Call],
3323
3457
  },
3324
3458
  {
3325
3459
  id: RULE_EPISODE_CRITICAL_ONLY,
@@ -3492,7 +3626,7 @@ describe("TeamComplianceSettingService - a severity delete pauses and marks the
3492
3626
  store({
3493
3627
  id: RULE_CRITICAL_AND_MAJOR,
3494
3628
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3495
- notificationChannel: ComplianceNotificationChannel.Push,
3629
+ notificationChannels: [ComplianceNotificationChannel.Push],
3496
3630
  incidentSeverityIds: [MAJOR_INCIDENT],
3497
3631
  });
3498
3632
 
@@ -3508,7 +3642,7 @@ describe("TeamComplianceSettingService - a severity delete pauses and marks the
3508
3642
  store({
3509
3643
  id: RULE_CRITICAL_AND_MAJOR,
3510
3644
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3511
- notificationChannel: ComplianceNotificationChannel.Push,
3645
+ notificationChannels: [ComplianceNotificationChannel.Push],
3512
3646
  });
3513
3647
 
3514
3648
  expect(
@@ -3699,13 +3833,13 @@ describe("TeamComplianceSettingService.getScope", () => {
3699
3833
  expect(
3700
3834
  TeamComplianceSettingServiceClass.getScope({
3701
3835
  ruleType: ruleType,
3702
- notificationChannel: ComplianceNotificationChannel.Call,
3836
+ notificationChannels: [ComplianceNotificationChannel.Call],
3703
3837
  incidentSeverities: [CRITICAL_INCIDENT],
3704
3838
  alertSeverities: [CRITICAL_ALERT],
3705
3839
  }),
3706
3840
  ).toEqual({
3707
3841
  ruleType: ruleType,
3708
- notificationChannel: null,
3842
+ notificationChannels: [],
3709
3843
  severityKind: null,
3710
3844
  severityIds: [],
3711
3845
  });
@@ -3718,13 +3852,13 @@ describe("TeamComplianceSettingService.getScope", () => {
3718
3852
  expect(
3719
3853
  TeamComplianceSettingServiceClass.getScope({
3720
3854
  ruleType: ruleType,
3721
- notificationChannel: ComplianceNotificationChannel.Call,
3855
+ notificationChannels: [ComplianceNotificationChannel.Call],
3722
3856
  incidentSeverities: [MAJOR_INCIDENT, CRITICAL_INCIDENT],
3723
3857
  alertSeverities: [CRITICAL_ALERT],
3724
3858
  }),
3725
3859
  ).toEqual({
3726
3860
  ruleType: ruleType,
3727
- notificationChannel: ComplianceNotificationChannel.Call,
3861
+ notificationChannels: [ComplianceNotificationChannel.Call],
3728
3862
  severityKind: ComplianceSeverityKind.Incident,
3729
3863
  severityIds: [CRITICAL_INCIDENT, MAJOR_INCIDENT].sort(),
3730
3864
  });
@@ -3737,36 +3871,72 @@ describe("TeamComplianceSettingService.getScope", () => {
3737
3871
  expect(
3738
3872
  TeamComplianceSettingServiceClass.getScope({
3739
3873
  ruleType: ruleType,
3740
- notificationChannel: null,
3874
+ notificationChannels: [],
3741
3875
  incidentSeverities: [CRITICAL_INCIDENT],
3742
3876
  alertSeverities: [MAJOR_ALERT],
3743
3877
  }),
3744
3878
  ).toEqual({
3745
3879
  ruleType: ruleType,
3746
- notificationChannel: null,
3880
+ notificationChannels: [],
3747
3881
  severityKind: ComplianceSeverityKind.Alert,
3748
3882
  severityIds: [MAJOR_ALERT],
3749
3883
  });
3750
3884
  },
3751
3885
  );
3752
3886
 
3753
- test.each([
3887
+ test.each<[string, unknown]>([
3754
3888
  ["undefined", undefined],
3755
3889
  ["null", null],
3756
- ["an unknown channel", "Pager"],
3757
- ["a channel in the wrong case", "call"],
3890
+ ["an empty list", []],
3891
+ ["one channel as a bare string, not a list", "Call"],
3892
+ ["a list of an unknown channel", ["Pager"]],
3893
+ ["a list of a channel in the wrong case", ["call"]],
3894
+ ["a list of a number", [3]],
3758
3895
  ["a number", 3],
3759
- ])("reads %s as 'any channel'", (_label: string, channel: unknown) => {
3896
+ ])("reads %s as 'any channel'", (_label: string, channels: unknown) => {
3760
3897
  expect(
3761
3898
  TeamComplianceSettingServiceClass.getScope({
3762
3899
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3763
- notificationChannel: channel,
3900
+ notificationChannels: channels,
3901
+ incidentSeverities: undefined,
3902
+ alertSeverities: undefined,
3903
+ }).notificationChannels,
3904
+ ).toEqual([]);
3905
+ });
3906
+
3907
+ test("an on-call rule's channels are read canonical: known ones only, each once, in catalog order", () => {
3908
+ expect(
3909
+ TeamComplianceSettingServiceClass.getScope({
3910
+ ruleType: ComplianceRuleType.HasAlertOnCallRules,
3911
+ notificationChannels: [
3912
+ ComplianceNotificationChannel.Webhook,
3913
+ "Pager",
3914
+ ComplianceNotificationChannel.Call,
3915
+ ComplianceNotificationChannel.Webhook,
3916
+ ],
3764
3917
  incidentSeverities: undefined,
3765
3918
  alertSeverities: undefined,
3766
- }).notificationChannel,
3767
- ).toBeNull();
3919
+ }).notificationChannels,
3920
+ ).toEqual([
3921
+ ComplianceNotificationChannel.Call,
3922
+ ComplianceNotificationChannel.Webhook,
3923
+ ]);
3768
3924
  });
3769
3925
 
3926
+ test.each(METHOD_RULE_TYPES)(
3927
+ "%s has no channels, however many are passed",
3928
+ (ruleType: ComplianceRuleType) => {
3929
+ expect(
3930
+ TeamComplianceSettingServiceClass.getScope({
3931
+ ruleType: ruleType,
3932
+ notificationChannels: ALL_CHANNELS,
3933
+ incidentSeverities: undefined,
3934
+ alertSeverities: undefined,
3935
+ }).notificationChannels,
3936
+ ).toEqual([]);
3937
+ },
3938
+ );
3939
+
3770
3940
  test.each(
3771
3941
  COMPLIANCE_RULE_DEFINITIONS.map(
3772
3942
  (definition: ComplianceRuleDefinition): [ComplianceRuleType] => {
@@ -3779,7 +3949,7 @@ describe("TeamComplianceSettingService.getScope", () => {
3779
3949
  const scope: ComplianceRuleScope =
3780
3950
  TeamComplianceSettingServiceClass.getScope({
3781
3951
  ruleType: ruleType,
3782
- notificationChannel: ComplianceNotificationChannel.Slack,
3952
+ notificationChannels: [ComplianceNotificationChannel.Slack],
3783
3953
  incidentSeverities: [CRITICAL_INCIDENT],
3784
3954
  alertSeverities: [CRITICAL_ALERT],
3785
3955
  });
@@ -3787,10 +3957,10 @@ describe("TeamComplianceSettingService.getScope", () => {
3787
3957
  expect(scope.severityKind).toBe(
3788
3958
  ComplianceRule.getSeverityKind(ruleType) || null,
3789
3959
  );
3790
- expect(scope.notificationChannel).toBe(
3960
+ expect(scope.notificationChannels).toEqual(
3791
3961
  ComplianceRule.supportsChannel(ruleType)
3792
- ? ComplianceNotificationChannel.Slack
3793
- : null,
3962
+ ? [ComplianceNotificationChannel.Slack]
3963
+ : [],
3794
3964
  );
3795
3965
  expect(scope.severityIds).toHaveLength(
3796
3966
  ComplianceRule.supportsSeverityScope(ruleType) ? 1 : 0,
@@ -3802,7 +3972,7 @@ describe("TeamComplianceSettingService.getScope", () => {
3802
3972
  describe("TeamComplianceSettingService.isSameScope", () => {
3803
3973
  const base: ComplianceRuleScope = TeamComplianceSettingServiceClass.getScope({
3804
3974
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3805
- notificationChannel: ComplianceNotificationChannel.Call,
3975
+ notificationChannels: [ComplianceNotificationChannel.Call],
3806
3976
  incidentSeverities: [CRITICAL_INCIDENT, MAJOR_INCIDENT],
3807
3977
  alertSeverities: undefined,
3808
3978
  });
@@ -3823,7 +3993,7 @@ describe("TeamComplianceSettingService.isSameScope", () => {
3823
3993
  const reordered: ComplianceRuleScope =
3824
3994
  TeamComplianceSettingServiceClass.getScope({
3825
3995
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3826
- notificationChannel: ComplianceNotificationChannel.Call,
3996
+ notificationChannels: [ComplianceNotificationChannel.Call],
3827
3997
  incidentSeverities: [
3828
3998
  MAJOR_INCIDENT.toUpperCase(),
3829
3999
  { _id: CRITICAL_INCIDENT },
@@ -3847,9 +4017,9 @@ describe("TeamComplianceSettingService.isSameScope", () => {
3847
4017
  ],
3848
4018
  [
3849
4019
  "the channel",
3850
- { notificationChannel: ComplianceNotificationChannel.Push },
4020
+ { notificationChannels: [ComplianceNotificationChannel.Push] },
3851
4021
  ],
3852
- ["'any channel' against one channel", { notificationChannel: null }],
4022
+ ["'any channel' against one channel", { notificationChannels: [] }],
3853
4023
  ["a narrower severity set", { severityIds: [CRITICAL_INCIDENT] }],
3854
4024
  ["every severity against some", { severityIds: [] }],
3855
4025
  [
@@ -3875,78 +4045,1573 @@ describe("TeamComplianceSettingService.isSameScope", () => {
3875
4045
 
3876
4046
  /*
3877
4047
  * ---------------------------------------------------------------------------
3878
- * Through updateOneById, the path BaseAPI takes.
4048
+ * Channels: a list, with its first channel beside it.
3879
4049
  * ---------------------------------------------------------------------------
4050
+ *
4051
+ * A rule insists on the channels in notificationChannels - a member needs a
4052
+ * rule on every one of them. notificationChannel, the column the list
4053
+ * replaced, is kept equal to the list's first channel for whatever only knows
4054
+ * that one column: an API client or a Dashboard bundle from before the list,
4055
+ * or a replica of an older build still serving during an upgrade. The hooks
4056
+ * write the pair from whichever field a payload sends, and a stored row is
4057
+ * read back by getStoredChannels.
3880
4058
  */
3881
4059
 
3882
- type InternalFindFunction = (
3883
- findBy: JSONObject,
3884
- ) => Promise<Array<TeamComplianceSetting>>;
4060
+ // Every subset of the nine channels, each in catalog order.
4061
+ const everyChannelSubset: () => Array<
4062
+ Array<ComplianceNotificationChannel>
4063
+ > = (): Array<Array<ComplianceNotificationChannel>> => {
4064
+ const subsets: Array<Array<ComplianceNotificationChannel>> = [];
4065
+
4066
+ for (let mask: number = 0; mask < 1 << ALL_CHANNELS.length; mask++) {
4067
+ subsets.push(
4068
+ ALL_CHANNELS.filter(
4069
+ (_channel: ComplianceNotificationChannel, index: number): boolean => {
4070
+ return (mask & (1 << index)) !== 0;
4071
+ },
4072
+ ),
4073
+ );
4074
+ }
3885
4075
 
3886
- interface ServiceInternals {
3887
- _findBy: InternalFindFunction;
3888
- }
4076
+ return subsets;
4077
+ };
3889
4078
 
3890
- describe("TeamComplianceSettingService updates reach the write normalised", () => {
3891
- let service: TeamComplianceSettingServiceClass;
3892
- let save: jest.Mock;
3893
- let repositoryUpdate: jest.Mock;
4079
+ // "Call and Push for Critical incidents", as a current build stores it.
4080
+ const CALL_AND_PUSH_FOR_CRITICAL: StoredRuleInput = {
4081
+ id: SIBLING_SETTING_ID,
4082
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
4083
+ notificationChannels: [
4084
+ ComplianceNotificationChannel.Call,
4085
+ ComplianceNotificationChannel.Push,
4086
+ ],
4087
+ incidentSeverityIds: [CRITICAL_INCIDENT],
4088
+ };
3894
4089
 
3895
- beforeEach(() => {
3896
- service = new TeamComplianceSettingServiceClass();
4090
+ describe("TeamComplianceSettingService.resolveSentChannels", () => {
4091
+ test("null is no channels - 'any channel'", () => {
4092
+ expect(TeamComplianceSettingServiceClass.resolveSentChannels(null)).toEqual(
4093
+ [],
4094
+ );
4095
+ });
3897
4096
 
3898
- store(INCIDENT_CALL_CRITICAL);
4097
+ test("an empty list is no channels", () => {
4098
+ expect(TeamComplianceSettingServiceClass.resolveSentChannels([])).toEqual(
4099
+ [],
4100
+ );
4101
+ });
3899
4102
 
3900
- // The hook's reads, from the in-memory team.
3901
- jest.spyOn(service, "findBy").mockImplementation(((findBy: {
3902
- query: JSONObject;
3903
- }) => {
3904
- return Promise.resolve(
3905
- storedSettings.filter((row: TeamComplianceSetting): boolean => {
3906
- return matchesQuery(row, findBy.query);
3907
- }),
3908
- );
3909
- }) as never);
4103
+ test("keeps each channel once, in catalog order, whatever order they were picked in", () => {
4104
+ expect(
4105
+ TeamComplianceSettingServiceClass.resolveSentChannels([
4106
+ ComplianceNotificationChannel.Push,
4107
+ ComplianceNotificationChannel.Call,
4108
+ ComplianceNotificationChannel.Push,
4109
+ ]),
4110
+ ).toEqual([
4111
+ ComplianceNotificationChannel.Call,
4112
+ ComplianceNotificationChannel.Push,
4113
+ ]);
4114
+ expect(
4115
+ TeamComplianceSettingServiceClass.resolveSentChannels(
4116
+ [...ALL_CHANNELS].reverse(),
4117
+ ),
4118
+ ).toEqual(ALL_CHANNELS);
4119
+ });
3910
4120
 
3911
- // _updateBy's own internal find of the row it is about to write.
3912
- jest
3913
- .spyOn(service as unknown as ServiceInternals, "_findBy")
3914
- .mockImplementation((): Promise<Array<TeamComplianceSetting>> => {
3915
- const row: TeamComplianceSetting = new TeamComplianceSetting();
3916
- row._id = SETTING_ID;
3917
- row.projectId = PROJECT_ID;
3918
- return Promise.resolve([row]);
3919
- });
4121
+ test("leaves the list it was sent alone", () => {
4122
+ const sent: Array<ComplianceNotificationChannel> = [
4123
+ ComplianceNotificationChannel.Webhook,
4124
+ ComplianceNotificationChannel.Call,
4125
+ ];
3920
4126
 
3921
- save = jest.fn((item: unknown) => {
3922
- return Promise.resolve(item);
3923
- });
3924
- repositoryUpdate = jest.fn(() => {
3925
- return Promise.resolve({ affected: 1 });
3926
- });
3927
- jest.spyOn(service, "getRepository").mockReturnValue({
3928
- save: save,
3929
- update: repositoryUpdate,
3930
- } as never);
4127
+ const resolved: Array<ComplianceNotificationChannel> =
4128
+ TeamComplianceSettingServiceClass.resolveSentChannels(sent);
3931
4129
 
3932
- // The permission layer needs a database and is not what this is about.
3933
- jest
3934
- .spyOn(ModelPermission, "checkUpdateQueryPermissions")
3935
- .mockImplementation(((_modelType: unknown, query: unknown) => {
3936
- return Promise.resolve(query);
3937
- }) as never);
3938
- jest
3939
- .spyOn(ModelPermission, "checkUpdatePermissionByModel")
3940
- .mockResolvedValue(undefined as never);
4130
+ expect(resolved).toEqual([
4131
+ ComplianceNotificationChannel.Call,
4132
+ ComplianceNotificationChannel.Webhook,
4133
+ ]);
4134
+ expect(sent).toEqual([
4135
+ ComplianceNotificationChannel.Webhook,
4136
+ ComplianceNotificationChannel.Call,
4137
+ ]);
3941
4138
  });
3942
4139
 
3943
- test("a toggle is a plain column update: no hook reads, no relation write", async () => {
3944
- await service.updateOneById({
3945
- id: new ObjectID(SETTING_ID),
3946
- data: { enabled: false },
3947
- props: { isRoot: true },
3948
- });
3949
-
4140
+ test.each<[string, unknown]>([
4141
+ ["undefined", undefined],
4142
+ ["one channel as a bare string", ComplianceNotificationChannel.Call],
4143
+ ["a comma-separated string", "Call,Push"],
4144
+ ["an object", { 0: ComplianceNotificationChannel.Call }],
4145
+ ["a number", 3],
4146
+ ["true", true],
4147
+ ])(
4148
+ "refuses %s, which is not a list, and says what it must be",
4149
+ (_label: string, value: unknown) => {
4150
+ expect(() => {
4151
+ TeamComplianceSettingServiceClass.resolveSentChannels(value);
4152
+ }).toThrow(new BadDataException(NOT_A_CHANNEL_LIST_MESSAGE));
4153
+ },
4154
+ );
4155
+
4156
+ /*
4157
+ * Refused, never dropped: a list that silently lost a channel checks less
4158
+ * than the admin asked for, and one that lost its only channel checks
4159
+ * every channel.
4160
+ */
4161
+ test.each<[string, unknown, string]>([
4162
+ ["an unknown channel", "Pager", UNKNOWN_CHANNEL_MESSAGE("Pager")],
4163
+ ["a channel in the wrong case", "push", UNKNOWN_CHANNEL_MESSAGE("push")],
4164
+ [
4165
+ "a label rather than a value",
4166
+ "Microsoft Teams",
4167
+ UNKNOWN_CHANNEL_MESSAGE("Microsoft Teams"),
4168
+ ],
4169
+ ["an empty string", "", UNKNOWN_CHANNEL_MESSAGE("")],
4170
+ ["null", null, UNKNOWN_CHANNEL_MESSAGE("null")],
4171
+ ["a number", 7, UNKNOWN_CHANNEL_MESSAGE("7")],
4172
+ ])(
4173
+ "refuses a list holding %s, by name",
4174
+ (_label: string, item: unknown, message: string) => {
4175
+ expect(() => {
4176
+ TeamComplianceSettingServiceClass.resolveSentChannels([
4177
+ ComplianceNotificationChannel.Call,
4178
+ item,
4179
+ ]);
4180
+ }).toThrow(new BadDataException(message));
4181
+ },
4182
+ );
4183
+
4184
+ test("refuses a list of nothing but garbage rather than read it as 'any channel'", () => {
4185
+ expect(() => {
4186
+ TeamComplianceSettingServiceClass.resolveSentChannels(["Pager"]);
4187
+ }).toThrow(UNKNOWN_CHANNEL_MESSAGE("Pager"));
4188
+ });
4189
+ });
4190
+
4191
+ describe("TeamComplianceSettingService.normaliseChannelFields", () => {
4192
+ const normalised: (
4193
+ data: Record<string, unknown>,
4194
+ ) => Record<string, unknown> = (
4195
+ data: Record<string, unknown>,
4196
+ ): Record<string, unknown> => {
4197
+ const copy: Record<string, unknown> = { ...data };
4198
+
4199
+ TeamComplianceSettingServiceClass.normaliseChannelFields(
4200
+ copy as JSONObject,
4201
+ );
4202
+
4203
+ return copy;
4204
+ };
4205
+
4206
+ test("a payload that sends neither channel field is left exactly as it was", () => {
4207
+ const written: Record<string, unknown> = normalised({
4208
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
4209
+ enabled: true,
4210
+ });
4211
+
4212
+ expect(written).toEqual({
4213
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
4214
+ enabled: true,
4215
+ });
4216
+ expect("notificationChannels" in written).toBe(false);
4217
+ expect("notificationChannel" in written).toBe(false);
4218
+ });
4219
+
4220
+ test.each<[string, Record<string, unknown>, ChannelPair]>([
4221
+ [
4222
+ "a list",
4223
+ {
4224
+ notificationChannels: [
4225
+ ComplianceNotificationChannel.Push,
4226
+ ComplianceNotificationChannel.Call,
4227
+ ],
4228
+ },
4229
+ {
4230
+ notificationChannels: [
4231
+ ComplianceNotificationChannel.Call,
4232
+ ComplianceNotificationChannel.Push,
4233
+ ],
4234
+ notificationChannel: ComplianceNotificationChannel.Call,
4235
+ },
4236
+ ],
4237
+ [
4238
+ "a list of one",
4239
+ { notificationChannels: [ComplianceNotificationChannel.Webhook] },
4240
+ {
4241
+ notificationChannels: [ComplianceNotificationChannel.Webhook],
4242
+ notificationChannel: ComplianceNotificationChannel.Webhook,
4243
+ },
4244
+ ],
4245
+ [
4246
+ "a list of every channel, backwards",
4247
+ { notificationChannels: [...ALL_CHANNELS].reverse() },
4248
+ {
4249
+ notificationChannels: ALL_CHANNELS,
4250
+ notificationChannel: ComplianceNotificationChannel.Call,
4251
+ },
4252
+ ],
4253
+ [
4254
+ "a list with a repeat",
4255
+ {
4256
+ notificationChannels: [
4257
+ ComplianceNotificationChannel.SMS,
4258
+ ComplianceNotificationChannel.SMS,
4259
+ ],
4260
+ },
4261
+ {
4262
+ notificationChannels: [ComplianceNotificationChannel.SMS],
4263
+ notificationChannel: ComplianceNotificationChannel.SMS,
4264
+ },
4265
+ ],
4266
+ [
4267
+ "an empty list",
4268
+ { notificationChannels: [] },
4269
+ { notificationChannels: [], notificationChannel: null },
4270
+ ],
4271
+ [
4272
+ "a null list",
4273
+ { notificationChannels: null },
4274
+ { notificationChannels: [], notificationChannel: null },
4275
+ ],
4276
+ [
4277
+ "one channel, the old way",
4278
+ { notificationChannel: ComplianceNotificationChannel.SMS },
4279
+ {
4280
+ notificationChannels: [ComplianceNotificationChannel.SMS],
4281
+ notificationChannel: ComplianceNotificationChannel.SMS,
4282
+ },
4283
+ ],
4284
+ [
4285
+ "no channel, the old way",
4286
+ { notificationChannel: null },
4287
+ { notificationChannels: [], notificationChannel: null },
4288
+ ],
4289
+ [
4290
+ "a list, and the stale single channel a client read it with",
4291
+ {
4292
+ notificationChannels: [ComplianceNotificationChannel.Push],
4293
+ notificationChannel: ComplianceNotificationChannel.Call,
4294
+ },
4295
+ {
4296
+ notificationChannels: [ComplianceNotificationChannel.Push],
4297
+ notificationChannel: ComplianceNotificationChannel.Push,
4298
+ },
4299
+ ],
4300
+ [
4301
+ "an empty list, and a stale single channel",
4302
+ {
4303
+ notificationChannels: [],
4304
+ notificationChannel: ComplianceNotificationChannel.Call,
4305
+ },
4306
+ { notificationChannels: [], notificationChannel: null },
4307
+ ],
4308
+ [
4309
+ "a list, and no single channel",
4310
+ {
4311
+ notificationChannels: [
4312
+ ComplianceNotificationChannel.Call,
4313
+ ComplianceNotificationChannel.Push,
4314
+ ],
4315
+ notificationChannel: null,
4316
+ },
4317
+ {
4318
+ notificationChannels: [
4319
+ ComplianceNotificationChannel.Call,
4320
+ ComplianceNotificationChannel.Push,
4321
+ ],
4322
+ notificationChannel: ComplianceNotificationChannel.Call,
4323
+ },
4324
+ ],
4325
+ [
4326
+ "a list, and the single channel that agrees with it - a rule sent back as it was read",
4327
+ {
4328
+ notificationChannels: [
4329
+ ComplianceNotificationChannel.Call,
4330
+ ComplianceNotificationChannel.Push,
4331
+ ],
4332
+ notificationChannel: ComplianceNotificationChannel.Call,
4333
+ },
4334
+ {
4335
+ notificationChannels: [
4336
+ ComplianceNotificationChannel.Call,
4337
+ ComplianceNotificationChannel.Push,
4338
+ ],
4339
+ notificationChannel: ComplianceNotificationChannel.Call,
4340
+ },
4341
+ ],
4342
+ ])(
4343
+ "%s is written as the list and its first channel",
4344
+ (_label: string, sent: Record<string, unknown>, written: ChannelPair) => {
4345
+ expect(channelsOf(normalised(sent))).toEqual(written);
4346
+ },
4347
+ );
4348
+
4349
+ test("a single channel that is garbage is refused, even beside a good list", () => {
4350
+ expect(() => {
4351
+ normalised({
4352
+ notificationChannels: [ComplianceNotificationChannel.Call],
4353
+ notificationChannel: "Pager",
4354
+ });
4355
+ }).toThrow(new BadDataException(UNKNOWN_CHANNEL_MESSAGE("Pager")));
4356
+ });
4357
+
4358
+ test("a refused list leaves the payload as it was sent", () => {
4359
+ const data: Record<string, unknown> = {
4360
+ notificationChannels: [ComplianceNotificationChannel.Call, "Pager"],
4361
+ };
4362
+
4363
+ expect(() => {
4364
+ TeamComplianceSettingServiceClass.normaliseChannelFields(
4365
+ data as JSONObject,
4366
+ );
4367
+ }).toThrow(UNKNOWN_CHANNEL_MESSAGE("Pager"));
4368
+
4369
+ expect(data).toEqual({
4370
+ notificationChannels: [ComplianceNotificationChannel.Call, "Pager"],
4371
+ });
4372
+ });
4373
+
4374
+ test("channels that are not a list are refused", () => {
4375
+ expect(() => {
4376
+ normalised({ notificationChannels: ComplianceNotificationChannel.Call });
4377
+ }).toThrow(new BadDataException(NOT_A_CHANNEL_LIST_MESSAGE));
4378
+ });
4379
+
4380
+ test("touches nothing but the two channel fields", () => {
4381
+ const severities: Array<string> = [CRITICAL_INCIDENT];
4382
+ const options: JSONObject = { note: "kept" };
4383
+
4384
+ const written: Record<string, unknown> = normalised({
4385
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
4386
+ incidentSeverities: severities,
4387
+ options: options,
4388
+ enabled: false,
4389
+ notificationChannels: [ComplianceNotificationChannel.Push],
4390
+ });
4391
+
4392
+ expect(Object.keys(written).sort()).toEqual(
4393
+ [
4394
+ "enabled",
4395
+ "incidentSeverities",
4396
+ "notificationChannel",
4397
+ "notificationChannels",
4398
+ "options",
4399
+ "ruleType",
4400
+ ].sort(),
4401
+ );
4402
+ expect(written["incidentSeverities"]).toBe(severities);
4403
+ expect(written["options"]).toBe(options);
4404
+ expect(written["enabled"]).toBe(false);
4405
+ });
4406
+
4407
+ test("writes a new list: the one the caller sent is not changed or shared", () => {
4408
+ const sent: Array<ComplianceNotificationChannel> = [
4409
+ ComplianceNotificationChannel.Push,
4410
+ ComplianceNotificationChannel.Call,
4411
+ ComplianceNotificationChannel.Push,
4412
+ ];
4413
+ const data: Record<string, unknown> = { notificationChannels: sent };
4414
+
4415
+ TeamComplianceSettingServiceClass.normaliseChannelFields(
4416
+ data as JSONObject,
4417
+ );
4418
+
4419
+ expect(sent).toEqual([
4420
+ ComplianceNotificationChannel.Push,
4421
+ ComplianceNotificationChannel.Call,
4422
+ ComplianceNotificationChannel.Push,
4423
+ ]);
4424
+ expect(data["notificationChannels"]).not.toBe(sent);
4425
+ });
4426
+
4427
+ test("works on the model a create hands over as well as on an update's JSON", () => {
4428
+ const setting: TeamComplianceSetting = new TeamComplianceSetting();
4429
+ setting.notificationChannels = [
4430
+ ComplianceNotificationChannel.Push,
4431
+ ComplianceNotificationChannel.Call,
4432
+ ];
4433
+
4434
+ TeamComplianceSettingServiceClass.normaliseChannelFields(setting);
4435
+
4436
+ expect(setting.notificationChannels).toEqual([
4437
+ ComplianceNotificationChannel.Call,
4438
+ ComplianceNotificationChannel.Push,
4439
+ ]);
4440
+ expect(setting.notificationChannel).toBe(
4441
+ ComplianceNotificationChannel.Call,
4442
+ );
4443
+ });
4444
+
4445
+ test("every set of channels, sent as a list in any order, is read back as itself", () => {
4446
+ for (const subset of everyChannelSubset()) {
4447
+ const data: Record<string, unknown> = {
4448
+ notificationChannels: [...subset].reverse(),
4449
+ };
4450
+
4451
+ TeamComplianceSettingServiceClass.normaliseChannelFields(
4452
+ data as JSONObject,
4453
+ );
4454
+
4455
+ expect(channelsOf(data)).toEqual({
4456
+ notificationChannels: subset,
4457
+ notificationChannel: subset[0] || null,
4458
+ });
4459
+ expect(TeamComplianceSettingServiceClass.getStoredChannels(data)).toEqual(
4460
+ subset,
4461
+ );
4462
+ }
4463
+ });
4464
+ });
4465
+
4466
+ describe("TeamComplianceSettingService.getStoredChannels", () => {
4467
+ /*
4468
+ * A current build writes the pair together; an older build writes only the
4469
+ * single column and leaves the list as it was. So the list is what the rule
4470
+ * says while the single column still agrees with its first channel, and the
4471
+ * single column is what the rule says once it does not - or when there is
4472
+ * no list at all.
4473
+ */
4474
+ test.each<
4475
+ [string, StoredChannelColumns, Array<ComplianceNotificationChannel>]
4476
+ >([
4477
+ [
4478
+ "a pair a current build wrote",
4479
+ {
4480
+ notificationChannels: [
4481
+ ComplianceNotificationChannel.Call,
4482
+ ComplianceNotificationChannel.Push,
4483
+ ],
4484
+ notificationChannel: ComplianceNotificationChannel.Call,
4485
+ },
4486
+ [ComplianceNotificationChannel.Call, ComplianceNotificationChannel.Push],
4487
+ ],
4488
+ [
4489
+ "one channel a current build wrote",
4490
+ {
4491
+ notificationChannels: [ComplianceNotificationChannel.SMS],
4492
+ notificationChannel: ComplianceNotificationChannel.SMS,
4493
+ },
4494
+ [ComplianceNotificationChannel.SMS],
4495
+ ],
4496
+ [
4497
+ "'any channel' a current build wrote",
4498
+ { notificationChannels: [], notificationChannel: null },
4499
+ [],
4500
+ ],
4501
+ [
4502
+ "every channel",
4503
+ {
4504
+ notificationChannels: ALL_CHANNELS,
4505
+ notificationChannel: ComplianceNotificationChannel.Call,
4506
+ },
4507
+ ALL_CHANNELS,
4508
+ ],
4509
+ [
4510
+ "a row from before the list, with a channel",
4511
+ {
4512
+ notificationChannels: null,
4513
+ notificationChannel: ComplianceNotificationChannel.Call,
4514
+ },
4515
+ [ComplianceNotificationChannel.Call],
4516
+ ],
4517
+ [
4518
+ "a row from before the list, with no channel",
4519
+ { notificationChannels: null, notificationChannel: null },
4520
+ [],
4521
+ ],
4522
+ [
4523
+ "a row an older build created, its list never written",
4524
+ {
4525
+ notificationChannels: undefined,
4526
+ notificationChannel: ComplianceNotificationChannel.Push,
4527
+ },
4528
+ [ComplianceNotificationChannel.Push],
4529
+ ],
4530
+ [
4531
+ "a list an older build re-pointed to another channel",
4532
+ {
4533
+ notificationChannels: [
4534
+ ComplianceNotificationChannel.Call,
4535
+ ComplianceNotificationChannel.Push,
4536
+ ],
4537
+ notificationChannel: ComplianceNotificationChannel.SMS,
4538
+ },
4539
+ [ComplianceNotificationChannel.SMS],
4540
+ ],
4541
+ [
4542
+ "a list an older build cleared to 'any channel'",
4543
+ {
4544
+ notificationChannels: [
4545
+ ComplianceNotificationChannel.Call,
4546
+ ComplianceNotificationChannel.Push,
4547
+ ],
4548
+ notificationChannel: null,
4549
+ },
4550
+ [],
4551
+ ],
4552
+ [
4553
+ "'any channel' an older build put a channel on",
4554
+ {
4555
+ notificationChannels: [],
4556
+ notificationChannel: ComplianceNotificationChannel.Call,
4557
+ },
4558
+ [ComplianceNotificationChannel.Call],
4559
+ ],
4560
+ [
4561
+ "a list whose rule an older build re-saved without touching its channel",
4562
+ {
4563
+ notificationChannels: [
4564
+ ComplianceNotificationChannel.Call,
4565
+ ComplianceNotificationChannel.Push,
4566
+ ],
4567
+ notificationChannel: ComplianceNotificationChannel.Call,
4568
+ },
4569
+ [ComplianceNotificationChannel.Call, ComplianceNotificationChannel.Push],
4570
+ ],
4571
+ [
4572
+ "a list a newer build wrote, led by a channel this one does not know",
4573
+ {
4574
+ notificationChannels: ["Pager", ComplianceNotificationChannel.Call],
4575
+ notificationChannel: "Pager",
4576
+ },
4577
+ [ComplianceNotificationChannel.Call],
4578
+ ],
4579
+ [
4580
+ "a list stored out of catalog order that agrees with its own first channel",
4581
+ {
4582
+ notificationChannels: [
4583
+ ComplianceNotificationChannel.Push,
4584
+ ComplianceNotificationChannel.Call,
4585
+ ],
4586
+ notificationChannel: ComplianceNotificationChannel.Push,
4587
+ },
4588
+ [ComplianceNotificationChannel.Call, ComplianceNotificationChannel.Push],
4589
+ ],
4590
+ [
4591
+ "a list holding a channel twice",
4592
+ {
4593
+ notificationChannels: [
4594
+ ComplianceNotificationChannel.Call,
4595
+ ComplianceNotificationChannel.Call,
4596
+ ComplianceNotificationChannel.Push,
4597
+ ],
4598
+ notificationChannel: ComplianceNotificationChannel.Call,
4599
+ },
4600
+ [ComplianceNotificationChannel.Call, ComplianceNotificationChannel.Push],
4601
+ ],
4602
+ [
4603
+ "no list, and a single channel this build does not know",
4604
+ { notificationChannels: null, notificationChannel: "Pager" },
4605
+ [],
4606
+ ],
4607
+ [
4608
+ "a list column holding a bare string",
4609
+ {
4610
+ notificationChannels: ComplianceNotificationChannel.Push,
4611
+ notificationChannel: ComplianceNotificationChannel.Push,
4612
+ },
4613
+ [ComplianceNotificationChannel.Push],
4614
+ ],
4615
+ ["neither column", {}, []],
4616
+ ])(
4617
+ "reads %s",
4618
+ (
4619
+ _label: string,
4620
+ row: StoredChannelColumns,
4621
+ channels: Array<ComplianceNotificationChannel>,
4622
+ ) => {
4623
+ expect(TeamComplianceSettingServiceClass.getStoredChannels(row)).toEqual(
4624
+ channels,
4625
+ );
4626
+ },
4627
+ );
4628
+
4629
+ test("an older build's single channel wins over every list it disagrees with", () => {
4630
+ const lists: Array<Array<ComplianceNotificationChannel>> = [
4631
+ [],
4632
+ [ComplianceNotificationChannel.Call, ComplianceNotificationChannel.Push],
4633
+ ALL_CHANNELS,
4634
+ ];
4635
+
4636
+ for (const channel of ALL_CHANNELS) {
4637
+ for (const list of lists) {
4638
+ if ((list[0] || null) === channel) {
4639
+ continue;
4640
+ }
4641
+
4642
+ expect({
4643
+ list,
4644
+ channel,
4645
+ read: TeamComplianceSettingServiceClass.getStoredChannels({
4646
+ notificationChannels: list,
4647
+ notificationChannel: channel,
4648
+ }),
4649
+ }).toEqual({ list, channel, read: [channel] });
4650
+ }
4651
+ }
4652
+ });
4653
+
4654
+ test("reads a row as findBy hands it over", () => {
4655
+ expect(
4656
+ TeamComplianceSettingServiceClass.getStoredChannels(
4657
+ storedRule({ ...CALL_AND_PUSH_FOR_CRITICAL }),
4658
+ ),
4659
+ ).toEqual([
4660
+ ComplianceNotificationChannel.Call,
4661
+ ComplianceNotificationChannel.Push,
4662
+ ]);
4663
+ expect(
4664
+ TeamComplianceSettingServiceClass.getStoredChannels(
4665
+ storedRule({
4666
+ id: SETTING_ID,
4667
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
4668
+ notificationChannel: ComplianceNotificationChannel.Push,
4669
+ }),
4670
+ ),
4671
+ ).toEqual([ComplianceNotificationChannel.Push]);
4672
+ });
4673
+
4674
+ test("changes nothing on the row it reads", () => {
4675
+ const row: StoredChannelColumns = {
4676
+ notificationChannels: [
4677
+ ComplianceNotificationChannel.Push,
4678
+ ComplianceNotificationChannel.Call,
4679
+ ],
4680
+ notificationChannel: ComplianceNotificationChannel.Push,
4681
+ };
4682
+
4683
+ TeamComplianceSettingServiceClass.getStoredChannels(row);
4684
+
4685
+ expect(row).toEqual({
4686
+ notificationChannels: [
4687
+ ComplianceNotificationChannel.Push,
4688
+ ComplianceNotificationChannel.Call,
4689
+ ],
4690
+ notificationChannel: ComplianceNotificationChannel.Push,
4691
+ });
4692
+ });
4693
+ });
4694
+
4695
+ describe("TeamComplianceSettingService.getScope / isSameScope - channel lists", () => {
4696
+ const scopeOf: (channels: unknown) => ComplianceRuleScope = (
4697
+ channels: unknown,
4698
+ ): ComplianceRuleScope => {
4699
+ return TeamComplianceSettingServiceClass.getScope({
4700
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
4701
+ notificationChannels: channels,
4702
+ incidentSeverities: [CRITICAL_INCIDENT],
4703
+ alertSeverities: undefined,
4704
+ });
4705
+ };
4706
+
4707
+ test("the same channels in another order, or with a repeat, are the same scope", () => {
4708
+ const callAndPush: ComplianceRuleScope = scopeOf([
4709
+ ComplianceNotificationChannel.Call,
4710
+ ComplianceNotificationChannel.Push,
4711
+ ]);
4712
+
4713
+ for (const channels of [
4714
+ [ComplianceNotificationChannel.Push, ComplianceNotificationChannel.Call],
4715
+ [
4716
+ ComplianceNotificationChannel.Push,
4717
+ ComplianceNotificationChannel.Call,
4718
+ ComplianceNotificationChannel.Push,
4719
+ ],
4720
+ ]) {
4721
+ expect(
4722
+ TeamComplianceSettingServiceClass.isSameScope(
4723
+ callAndPush,
4724
+ scopeOf(channels),
4725
+ ),
4726
+ ).toBe(true);
4727
+ }
4728
+ });
4729
+
4730
+ test.each<[string, Array<ComplianceNotificationChannel>]>([
4731
+ ["one of its channels", [ComplianceNotificationChannel.Call]],
4732
+ [
4733
+ "a channel more",
4734
+ [
4735
+ ComplianceNotificationChannel.Call,
4736
+ ComplianceNotificationChannel.SMS,
4737
+ ComplianceNotificationChannel.Push,
4738
+ ],
4739
+ ],
4740
+ [
4741
+ "another pair",
4742
+ [ComplianceNotificationChannel.Call, ComplianceNotificationChannel.SMS],
4743
+ ],
4744
+ ["any channel", []],
4745
+ ])(
4746
+ "'Call and Push' differs from %s",
4747
+ (_label: string, channels: Array<ComplianceNotificationChannel>) => {
4748
+ const callAndPush: ComplianceRuleScope = scopeOf([
4749
+ ComplianceNotificationChannel.Call,
4750
+ ComplianceNotificationChannel.Push,
4751
+ ]);
4752
+
4753
+ expect(
4754
+ TeamComplianceSettingServiceClass.isSameScope(
4755
+ callAndPush,
4756
+ scopeOf(channels),
4757
+ ),
4758
+ ).toBe(false);
4759
+ expect(
4760
+ TeamComplianceSettingServiceClass.isSameScope(
4761
+ scopeOf(channels),
4762
+ callAndPush,
4763
+ ),
4764
+ ).toBe(false);
4765
+ },
4766
+ );
4767
+
4768
+ test("two different sets of channels never compare the same", () => {
4769
+ const subsets: Array<Array<ComplianceNotificationChannel>> =
4770
+ everyChannelSubset().filter(
4771
+ (subset: Array<ComplianceNotificationChannel>): boolean => {
4772
+ return subset.length <= 2;
4773
+ },
4774
+ );
4775
+
4776
+ for (const a of subsets) {
4777
+ for (const b of subsets) {
4778
+ expect({
4779
+ a,
4780
+ b,
4781
+ same: TeamComplianceSettingServiceClass.isSameScope(
4782
+ scopeOf(a),
4783
+ scopeOf([...b].reverse()),
4784
+ ),
4785
+ }).toEqual({ a, b, same: a.join(",") === b.join(",") });
4786
+ }
4787
+ }
4788
+ });
4789
+ });
4790
+
4791
+ describe("TeamComplianceSettingService onBeforeCreate - a rule on several channels", () => {
4792
+ test("is stored as the canonical list - catalog order, each channel once - with its first channel beside it", async () => {
4793
+ const result: OnCreate<TeamComplianceSetting> = await create({
4794
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
4795
+ notificationChannels: [
4796
+ ComplianceNotificationChannel.Push,
4797
+ ComplianceNotificationChannel.SMS,
4798
+ ComplianceNotificationChannel.Call,
4799
+ ComplianceNotificationChannel.Push,
4800
+ ],
4801
+ incidentSeverities: [CRITICAL_INCIDENT],
4802
+ });
4803
+
4804
+ expect(channelsOf(result.createBy.data)).toEqual({
4805
+ notificationChannels: [
4806
+ ComplianceNotificationChannel.Call,
4807
+ ComplianceNotificationChannel.SMS,
4808
+ ComplianceNotificationChannel.Push,
4809
+ ],
4810
+ notificationChannel: ComplianceNotificationChannel.Call,
4811
+ });
4812
+ });
4813
+
4814
+ test.each(ON_CALL_RULE_TYPES)(
4815
+ "%s may insist on every channel there is",
4816
+ async (ruleType: ComplianceRuleType) => {
4817
+ const result: OnCreate<TeamComplianceSetting> = await create({
4818
+ ruleType: ruleType,
4819
+ notificationChannels: [...ALL_CHANNELS].reverse(),
4820
+ });
4821
+
4822
+ expect(channelsOf(result.createBy.data)).toEqual({
4823
+ notificationChannels: ALL_CHANNELS,
4824
+ notificationChannel: ComplianceNotificationChannel.Call,
4825
+ });
4826
+ },
4827
+ );
4828
+
4829
+ test("is refused as a duplicate of a rule on the same channels, picked in any order", async () => {
4830
+ store(CALL_AND_PUSH_FOR_CRITICAL);
4831
+
4832
+ for (const channels of [
4833
+ [ComplianceNotificationChannel.Call, ComplianceNotificationChannel.Push],
4834
+ [ComplianceNotificationChannel.Push, ComplianceNotificationChannel.Call],
4835
+ [
4836
+ ComplianceNotificationChannel.Push,
4837
+ ComplianceNotificationChannel.Call,
4838
+ ComplianceNotificationChannel.Push,
4839
+ ],
4840
+ ]) {
4841
+ await expect(
4842
+ create({
4843
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
4844
+ notificationChannels: channels,
4845
+ incidentSeverities: [CRITICAL_INCIDENT],
4846
+ }),
4847
+ ).rejects.toThrow(
4848
+ new BadDataException(DUPLICATE_COMPLIANCE_RULE_MESSAGE),
4849
+ );
4850
+ }
4851
+ });
4852
+
4853
+ test.each<[string, Array<ComplianceNotificationChannel>, Array<string>]>([
4854
+ [
4855
+ "one of its channels",
4856
+ [ComplianceNotificationChannel.Call],
4857
+ [CRITICAL_INCIDENT],
4858
+ ],
4859
+ [
4860
+ "the other of its channels",
4861
+ [ComplianceNotificationChannel.Push],
4862
+ [CRITICAL_INCIDENT],
4863
+ ],
4864
+ [
4865
+ "a channel more",
4866
+ [
4867
+ ComplianceNotificationChannel.Call,
4868
+ ComplianceNotificationChannel.SMS,
4869
+ ComplianceNotificationChannel.Push,
4870
+ ],
4871
+ [CRITICAL_INCIDENT],
4872
+ ],
4873
+ [
4874
+ "another pair",
4875
+ [ComplianceNotificationChannel.Call, ComplianceNotificationChannel.SMS],
4876
+ [CRITICAL_INCIDENT],
4877
+ ],
4878
+ ["any channel", [], [CRITICAL_INCIDENT]],
4879
+ [
4880
+ "the same channels for another severity",
4881
+ [ComplianceNotificationChannel.Call, ComplianceNotificationChannel.Push],
4882
+ [MAJOR_INCIDENT],
4883
+ ],
4884
+ [
4885
+ "the same channels for every severity",
4886
+ [ComplianceNotificationChannel.Push, ComplianceNotificationChannel.Call],
4887
+ [],
4888
+ ],
4889
+ ])(
4890
+ "is a different rule from 'Call and Push for Critical' when it asks for %s",
4891
+ async (
4892
+ _label: string,
4893
+ channels: Array<ComplianceNotificationChannel>,
4894
+ severities: Array<string>,
4895
+ ) => {
4896
+ store(CALL_AND_PUSH_FOR_CRITICAL);
4897
+
4898
+ await expect(
4899
+ create({
4900
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
4901
+ notificationChannels: channels,
4902
+ incidentSeverities: severities,
4903
+ }),
4904
+ ).resolves.toBeDefined();
4905
+ },
4906
+ );
4907
+
4908
+ test("the same channels on the episode rule type are another rule", async () => {
4909
+ store(CALL_AND_PUSH_FOR_CRITICAL);
4910
+
4911
+ await expect(
4912
+ create({
4913
+ ruleType: ComplianceRuleType.HasIncidentEpisodeOnCallRules,
4914
+ notificationChannels: [
4915
+ ComplianceNotificationChannel.Call,
4916
+ ComplianceNotificationChannel.Push,
4917
+ ],
4918
+ incidentSeverities: [CRITICAL_INCIDENT],
4919
+ }),
4920
+ ).resolves.toBeDefined();
4921
+ });
4922
+
4923
+ test.each<[string, DatabaseCommonInteractionProps]>([
4924
+ ["a team editor", EDITOR_PROPS],
4925
+ ["Edit Teams on its own", memberProps([Permission.EditProjectTeam])],
4926
+ ])(
4927
+ "what the hook leaves - the list and the channel it adds beside it - passes the create check DatabaseService repeats, for %s",
4928
+ async (_label: string, props: DatabaseCommonInteractionProps) => {
4929
+ const result: OnCreate<TeamComplianceSetting> = await onBeforeCreate(
4930
+ createByFor(
4931
+ newRule({
4932
+ ruleType: ComplianceRuleType.HasAlertOnCallRules,
4933
+ notificationChannels: [
4934
+ ComplianceNotificationChannel.Push,
4935
+ ComplianceNotificationChannel.SMS,
4936
+ ],
4937
+ alertSeverities: [CRITICAL_ALERT],
4938
+ }),
4939
+ props,
4940
+ ),
4941
+ );
4942
+
4943
+ expect(channelsOf(result.createBy.data)).toEqual({
4944
+ notificationChannels: [
4945
+ ComplianceNotificationChannel.SMS,
4946
+ ComplianceNotificationChannel.Push,
4947
+ ],
4948
+ notificationChannel: ComplianceNotificationChannel.SMS,
4949
+ });
4950
+ expect((): void => {
4951
+ ModelPermission.checkCreatePermissions(
4952
+ TeamComplianceSetting,
4953
+ result.createBy.data,
4954
+ props,
4955
+ );
4956
+ }).not.toThrow();
4957
+ },
4958
+ );
4959
+
4960
+ test("a caller with no say in the project is refused before a list is even looked at", async () => {
4961
+ await expect(
4962
+ onBeforeCreate(
4963
+ createByFor(
4964
+ newRule({
4965
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
4966
+ notificationChannels: [ComplianceNotificationChannel.Call, "Pager"],
4967
+ }),
4968
+ OUTSIDER_PROPS,
4969
+ ),
4970
+ ),
4971
+ ).rejects.toThrow(NotAuthorizedException);
4972
+
4973
+ expectNoReads();
4974
+ });
4975
+ });
4976
+
4977
+ describe("TeamComplianceSettingService onBeforeUpdate - channel lists", () => {
4978
+ test("a list is written canonical, with its first channel beside it", async () => {
4979
+ store(INCIDENT_CALL_CRITICAL);
4980
+
4981
+ const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
4982
+ notificationChannels: [
4983
+ ComplianceNotificationChannel.Push,
4984
+ ComplianceNotificationChannel.Call,
4985
+ ],
4986
+ });
4987
+
4988
+ await onBeforeUpdate(updateBy);
4989
+
4990
+ expect(dataOf(updateBy)).toEqual({
4991
+ notificationChannels: [
4992
+ ComplianceNotificationChannel.Call,
4993
+ ComplianceNotificationChannel.Push,
4994
+ ],
4995
+ notificationChannel: ComplianceNotificationChannel.Call,
4996
+ });
4997
+ });
4998
+
4999
+ test("an update that sends only the list is a scope change: it is checked for duplicates, as a set", async () => {
5000
+ store(INCIDENT_CALL_CRITICAL, CALL_AND_PUSH_FOR_CRITICAL);
5001
+
5002
+ await expect(
5003
+ update({
5004
+ notificationChannels: [
5005
+ ComplianceNotificationChannel.Push,
5006
+ ComplianceNotificationChannel.Call,
5007
+ ],
5008
+ }),
5009
+ ).rejects.toThrow(new BadDataException(DUPLICATE_COMPLIANCE_RULE_MESSAGE));
5010
+
5011
+ expect(siblingReads()).toHaveLength(1);
5012
+ });
5013
+
5014
+ test("an update that sends only the list is a scope change: the caller's permission is checked before anything is read", async () => {
5015
+ store(INCIDENT_CALL_CRITICAL);
5016
+
5017
+ await expect(
5018
+ onBeforeUpdate(
5019
+ updateByFor(
5020
+ { notificationChannels: [ComplianceNotificationChannel.Push] },
5021
+ { props: OUTSIDER_PROPS },
5022
+ ),
5023
+ ),
5024
+ ).rejects.toThrow(NotAuthorizedException);
5025
+
5026
+ expectNoReads();
5027
+ });
5028
+
5029
+ test("adding a channel to a rule makes a rule neither it nor its one-channel sibling is", async () => {
5030
+ store(INCIDENT_CALL_CRITICAL, {
5031
+ ...INCIDENT_CALL_CRITICAL,
5032
+ id: SIBLING_SETTING_ID,
5033
+ notificationChannels: [ComplianceNotificationChannel.Push],
5034
+ });
5035
+
5036
+ await expect(
5037
+ update({
5038
+ notificationChannels: [
5039
+ ComplianceNotificationChannel.Call,
5040
+ ComplianceNotificationChannel.Push,
5041
+ ],
5042
+ }),
5043
+ ).resolves.toBeDefined();
5044
+ });
5045
+
5046
+ test("a channel change keeps the stored severities when it is judged", async () => {
5047
+ store(INCIDENT_CALL_CRITICAL, {
5048
+ ...CALL_AND_PUSH_FOR_CRITICAL,
5049
+ incidentSeverityIds: [MAJOR_INCIDENT],
5050
+ });
5051
+
5052
+ // "Call and Push for Critical" - the sibling is for Major.
5053
+ await expect(
5054
+ update({
5055
+ notificationChannels: [
5056
+ ComplianceNotificationChannel.Push,
5057
+ ComplianceNotificationChannel.Call,
5058
+ ],
5059
+ }),
5060
+ ).resolves.toBeDefined();
5061
+
5062
+ // A severity change keeps the stored channels: "Call for Major" is new too.
5063
+ await expect(
5064
+ update({ incidentSeverities: [MAJOR_INCIDENT] }),
5065
+ ).resolves.toBeDefined();
5066
+ });
5067
+
5068
+ test.each<[string, Record<string, unknown>, string]>([
5069
+ [
5070
+ "a list with an unknown channel",
5071
+ { notificationChannels: [ComplianceNotificationChannel.Call, "Pager"] },
5072
+ UNKNOWN_CHANNEL_MESSAGE("Pager"),
5073
+ ],
5074
+ [
5075
+ "a list with a channel in the wrong case",
5076
+ { notificationChannels: ["push"] },
5077
+ UNKNOWN_CHANNEL_MESSAGE("push"),
5078
+ ],
5079
+ [
5080
+ "channels that are not a list",
5081
+ { notificationChannels: ComplianceNotificationChannel.Call },
5082
+ NOT_A_CHANNEL_LIST_MESSAGE,
5083
+ ],
5084
+ [
5085
+ "a garbage single channel beside a good list",
5086
+ {
5087
+ notificationChannels: [ComplianceNotificationChannel.Call],
5088
+ notificationChannel: "Pager",
5089
+ },
5090
+ UNKNOWN_CHANNEL_MESSAGE("Pager"),
5091
+ ],
5092
+ ])(
5093
+ "refuses %s before anything is read",
5094
+ async (_label: string, data: Record<string, unknown>, message: string) => {
5095
+ store(INCIDENT_CALL_CRITICAL);
5096
+
5097
+ await expect(update(data)).rejects.toThrow(new BadDataException(message));
5098
+ expectNoReads();
5099
+ },
5100
+ );
5101
+
5102
+ test("a type change to a method rule clears a stored list of several channels", async () => {
5103
+ store({
5104
+ ...INCIDENT_CALL_CRITICAL,
5105
+ notificationChannels: [
5106
+ ComplianceNotificationChannel.Call,
5107
+ ComplianceNotificationChannel.SMS,
5108
+ ComplianceNotificationChannel.Push,
5109
+ ],
5110
+ });
5111
+
5112
+ const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
5113
+ ruleType: ComplianceRuleType.HasNotificationEmailMethod,
5114
+ });
5115
+
5116
+ await onBeforeUpdate(updateBy);
5117
+
5118
+ expect(channelsOf(dataOf(updateBy))).toEqual({
5119
+ notificationChannels: [],
5120
+ notificationChannel: null,
5121
+ });
5122
+ });
5123
+
5124
+ test("a type change to another on-call rule keeps the stored channels, and judges the new rule by them", async () => {
5125
+ store(
5126
+ {
5127
+ ...INCIDENT_CALL_CRITICAL,
5128
+ notificationChannels: [
5129
+ ComplianceNotificationChannel.Call,
5130
+ ComplianceNotificationChannel.Push,
5131
+ ],
5132
+ },
5133
+ {
5134
+ ...CALL_AND_PUSH_FOR_CRITICAL,
5135
+ ruleType: ComplianceRuleType.HasIncidentEpisodeOnCallRules,
5136
+ },
5137
+ );
5138
+
5139
+ const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
5140
+ ruleType: ComplianceRuleType.HasIncidentEpisodeOnCallRules,
5141
+ });
5142
+
5143
+ await expect(onBeforeUpdate(updateBy)).rejects.toThrow(
5144
+ DUPLICATE_COMPLIANCE_RULE_MESSAGE,
5145
+ );
5146
+ // Not sent, so not rewritten: the row keeps the list it has.
5147
+ expect("notificationChannels" in dataOf(updateBy)).toBe(false);
5148
+ expect("notificationChannel" in dataOf(updateBy)).toBe(false);
5149
+ });
5150
+
5151
+ test("what the hook leaves for any channel payload passes the update check _updateBy repeats", async () => {
5152
+ store(INCIDENT_CALL_CRITICAL);
5153
+
5154
+ for (const data of [
5155
+ {
5156
+ notificationChannels: [
5157
+ ComplianceNotificationChannel.Push,
5158
+ ComplianceNotificationChannel.Call,
5159
+ ],
5160
+ },
5161
+ { notificationChannels: null },
5162
+ { notificationChannel: ComplianceNotificationChannel.SMS },
5163
+ { notificationChannel: null },
5164
+ ]) {
5165
+ const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
5166
+ ...data,
5167
+ });
5168
+
5169
+ await onBeforeUpdate(updateBy);
5170
+
5171
+ expect(Object.keys(dataOf(updateBy)).sort()).toEqual([
5172
+ "notificationChannel",
5173
+ "notificationChannels",
5174
+ ]);
5175
+ await expect(
5176
+ ModelPermission.checkUpdateQueryPermissions(
5177
+ TeamComplianceSetting,
5178
+ { _id: SETTING_ID },
5179
+ updateBy.data,
5180
+ EDITOR_PROPS,
5181
+ ),
5182
+ ).resolves.toBeDefined();
5183
+ }
5184
+ });
5185
+ });
5186
+
5187
+ describe("TeamComplianceSettingService - a payload from before the channel list", () => {
5188
+ /*
5189
+ * API clients written before a rule could require several channels, and a
5190
+ * Dashboard bundle from before the list, send notificationChannel alone. It
5191
+ * still means what it always meant: exactly that channel, or any channel.
5192
+ * Before the list existed the model had no other field, so dropping it -
5193
+ * reading such a payload as "any channel" - would silently widen the rule.
5194
+ */
5195
+ test("create: one channel is stored as a one-item list, with itself beside it", async () => {
5196
+ const result: OnCreate<TeamComplianceSetting> = await create({
5197
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5198
+ notificationChannel: ComplianceNotificationChannel.Call,
5199
+ incidentSeverities: [CRITICAL_INCIDENT],
5200
+ });
5201
+
5202
+ expect(channelsOf(result.createBy.data)).toEqual({
5203
+ notificationChannels: [ComplianceNotificationChannel.Call],
5204
+ notificationChannel: ComplianceNotificationChannel.Call,
5205
+ });
5206
+ });
5207
+
5208
+ test("create: null is 'any channel'", async () => {
5209
+ const result: OnCreate<TeamComplianceSetting> = await create({
5210
+ ruleType: ComplianceRuleType.HasAlertOnCallRules,
5211
+ notificationChannel: null,
5212
+ });
5213
+
5214
+ expect(channelsOf(result.createBy.data)).toEqual({
5215
+ notificationChannels: [],
5216
+ notificationChannel: null,
5217
+ });
5218
+ });
5219
+
5220
+ test("create: a channel sent the old way duplicates a rule stored with that channel alone in its list", async () => {
5221
+ store({
5222
+ id: SIBLING_SETTING_ID,
5223
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5224
+ notificationChannels: [ComplianceNotificationChannel.Call],
5225
+ incidentSeverityIds: [CRITICAL_INCIDENT],
5226
+ });
5227
+
5228
+ await expect(
5229
+ create({
5230
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5231
+ notificationChannel: ComplianceNotificationChannel.Call,
5232
+ incidentSeverities: [CRITICAL_INCIDENT],
5233
+ }),
5234
+ ).rejects.toThrow(new BadDataException(DUPLICATE_COMPLIANCE_RULE_MESSAGE));
5235
+ });
5236
+
5237
+ test("create: ...but not a rule on that channel and another", async () => {
5238
+ store(CALL_AND_PUSH_FOR_CRITICAL);
5239
+
5240
+ await expect(
5241
+ create({
5242
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5243
+ notificationChannel: ComplianceNotificationChannel.Call,
5244
+ incidentSeverities: [CRITICAL_INCIDENT],
5245
+ }),
5246
+ ).resolves.toBeDefined();
5247
+ });
5248
+
5249
+ test("update: one channel replaces the rule's whole list", async () => {
5250
+ store({ ...CALL_AND_PUSH_FOR_CRITICAL, id: SETTING_ID });
5251
+
5252
+ const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
5253
+ notificationChannel: ComplianceNotificationChannel.SMS,
5254
+ });
5255
+
5256
+ await onBeforeUpdate(updateBy);
5257
+
5258
+ expect(dataOf(updateBy)).toEqual({
5259
+ notificationChannels: [ComplianceNotificationChannel.SMS],
5260
+ notificationChannel: ComplianceNotificationChannel.SMS,
5261
+ });
5262
+ });
5263
+
5264
+ test("update: null clears the list to 'any channel' - a scope change, checked for duplicates", async () => {
5265
+ store(INCIDENT_CALL_CRITICAL, {
5266
+ id: SIBLING_SETTING_ID,
5267
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5268
+ incidentSeverityIds: [CRITICAL_INCIDENT],
5269
+ });
5270
+
5271
+ await expect(update({ notificationChannel: null })).rejects.toThrow(
5272
+ DUPLICATE_COMPLIANCE_RULE_MESSAGE,
5273
+ );
5274
+ });
5275
+
5276
+ test("update: a channel sent the old way is a scope change, so the caller's permission is checked before anything is read", async () => {
5277
+ store(INCIDENT_CALL_CRITICAL);
5278
+
5279
+ await expect(
5280
+ onBeforeUpdate(
5281
+ updateByFor(
5282
+ { notificationChannel: ComplianceNotificationChannel.Push },
5283
+ { props: OUTSIDER_PROPS },
5284
+ ),
5285
+ ),
5286
+ ).rejects.toThrow(NotAuthorizedException);
5287
+
5288
+ expectNoReads();
5289
+ });
5290
+
5291
+ test("update: a rule sent back as it was read - the list and its first channel - keeps its list", async () => {
5292
+ store({ ...CALL_AND_PUSH_FOR_CRITICAL, id: SETTING_ID });
5293
+
5294
+ const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
5295
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5296
+ notificationChannels: [
5297
+ ComplianceNotificationChannel.Call,
5298
+ ComplianceNotificationChannel.Push,
5299
+ ],
5300
+ notificationChannel: ComplianceNotificationChannel.Call,
5301
+ incidentSeverities: [{ _id: CRITICAL_INCIDENT }],
5302
+ alertSeverities: [],
5303
+ enabled: true,
5304
+ });
5305
+
5306
+ await expect(onBeforeUpdate(updateBy)).resolves.toBeDefined();
5307
+
5308
+ expect(channelsOf(dataOf(updateBy))).toEqual({
5309
+ notificationChannels: [
5310
+ ComplianceNotificationChannel.Call,
5311
+ ComplianceNotificationChannel.Push,
5312
+ ],
5313
+ notificationChannel: ComplianceNotificationChannel.Call,
5314
+ });
5315
+ });
5316
+
5317
+ test("update: a list changed beside the single channel it was read with is written as the new list", async () => {
5318
+ store(INCIDENT_CALL_CRITICAL);
5319
+
5320
+ const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
5321
+ notificationChannels: [
5322
+ ComplianceNotificationChannel.Push,
5323
+ ComplianceNotificationChannel.SMS,
5324
+ ],
5325
+ // Stale: what the rule was read with.
5326
+ notificationChannel: ComplianceNotificationChannel.Call,
5327
+ });
5328
+
5329
+ await onBeforeUpdate(updateBy);
5330
+
5331
+ expect(dataOf(updateBy)).toEqual({
5332
+ notificationChannels: [
5333
+ ComplianceNotificationChannel.SMS,
5334
+ ComplianceNotificationChannel.Push,
5335
+ ],
5336
+ notificationChannel: ComplianceNotificationChannel.SMS,
5337
+ });
5338
+ });
5339
+
5340
+ test("update: a channel sent the old way to a method rule is dropped, list and all", async () => {
5341
+ store({
5342
+ id: SETTING_ID,
5343
+ ruleType: ComplianceRuleType.HasNotificationSMSMethod,
5344
+ });
5345
+
5346
+ const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
5347
+ notificationChannel: ComplianceNotificationChannel.Call,
5348
+ });
5349
+
5350
+ await onBeforeUpdate(updateBy);
5351
+
5352
+ expect(dataOf(updateBy)).toEqual({
5353
+ notificationChannels: [],
5354
+ notificationChannel: null,
5355
+ });
5356
+ });
5357
+ });
5358
+
5359
+ describe("TeamComplianceSettingService - rules an older build wrote", () => {
5360
+ /*
5361
+ * An older replica still serving during an upgrade - or the build a site
5362
+ * rolled back to - writes only notificationChannel and leaves the list as
5363
+ * it was. Its rows are judged by what that column says, so a rule such a
5364
+ * build created or changed is neither missed by the duplicate check nor
5365
+ * read as a rule it no longer is.
5366
+ */
5367
+ test("a rule it created - no list, one channel - duplicates a new rule on that one channel", async () => {
5368
+ store({
5369
+ id: SIBLING_SETTING_ID,
5370
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5371
+ notificationChannel: ComplianceNotificationChannel.Call,
5372
+ incidentSeverityIds: [CRITICAL_INCIDENT],
5373
+ });
5374
+
5375
+ await expect(
5376
+ create({
5377
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5378
+ notificationChannels: [ComplianceNotificationChannel.Call],
5379
+ incidentSeverities: [CRITICAL_INCIDENT],
5380
+ }),
5381
+ ).rejects.toThrow(new BadDataException(DUPLICATE_COMPLIANCE_RULE_MESSAGE));
5382
+
5383
+ await expect(
5384
+ create({
5385
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5386
+ notificationChannels: [
5387
+ ComplianceNotificationChannel.Call,
5388
+ ComplianceNotificationChannel.Push,
5389
+ ],
5390
+ incidentSeverities: [CRITICAL_INCIDENT],
5391
+ }),
5392
+ ).resolves.toBeDefined();
5393
+ });
5394
+
5395
+ test("a rule it re-pointed to another channel is that channel only, whatever its list still says", async () => {
5396
+ store({
5397
+ ...CALL_AND_PUSH_FOR_CRITICAL,
5398
+ notificationChannel: ComplianceNotificationChannel.SMS,
5399
+ });
5400
+
5401
+ await expect(
5402
+ create({
5403
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5404
+ notificationChannels: [ComplianceNotificationChannel.SMS],
5405
+ incidentSeverities: [CRITICAL_INCIDENT],
5406
+ }),
5407
+ ).rejects.toThrow(DUPLICATE_COMPLIANCE_RULE_MESSAGE);
5408
+
5409
+ await expect(
5410
+ create({
5411
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5412
+ notificationChannels: [
5413
+ ComplianceNotificationChannel.Call,
5414
+ ComplianceNotificationChannel.Push,
5415
+ ],
5416
+ incidentSeverities: [CRITICAL_INCIDENT],
5417
+ }),
5418
+ ).resolves.toBeDefined();
5419
+ });
5420
+
5421
+ test("a rule it cleared to 'any channel' is 'any channel', whatever its list still says", async () => {
5422
+ store({ ...CALL_AND_PUSH_FOR_CRITICAL, notificationChannel: null });
5423
+
5424
+ await expect(
5425
+ create({
5426
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5427
+ notificationChannels: [],
5428
+ incidentSeverities: [CRITICAL_INCIDENT],
5429
+ }),
5430
+ ).rejects.toThrow(DUPLICATE_COMPLIANCE_RULE_MESSAGE);
5431
+
5432
+ await expect(
5433
+ create({
5434
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5435
+ notificationChannels: [
5436
+ ComplianceNotificationChannel.Call,
5437
+ ComplianceNotificationChannel.Push,
5438
+ ],
5439
+ incidentSeverities: [CRITICAL_INCIDENT],
5440
+ }),
5441
+ ).resolves.toBeDefined();
5442
+ });
5443
+
5444
+ test("a rule it re-saved without touching the channel keeps its whole list", async () => {
5445
+ store({
5446
+ ...CALL_AND_PUSH_FOR_CRITICAL,
5447
+ notificationChannel: ComplianceNotificationChannel.Call,
5448
+ });
5449
+
5450
+ await expect(
5451
+ create({
5452
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5453
+ notificationChannels: [
5454
+ ComplianceNotificationChannel.Push,
5455
+ ComplianceNotificationChannel.Call,
5456
+ ],
5457
+ incidentSeverities: [CRITICAL_INCIDENT],
5458
+ }),
5459
+ ).rejects.toThrow(DUPLICATE_COMPLIANCE_RULE_MESSAGE);
5460
+
5461
+ await expect(
5462
+ create({
5463
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5464
+ notificationChannels: [ComplianceNotificationChannel.Call],
5465
+ incidentSeverities: [CRITICAL_INCIDENT],
5466
+ }),
5467
+ ).resolves.toBeDefined();
5468
+ });
5469
+
5470
+ test("the rule being updated is judged by its single channel when its list disagrees", async () => {
5471
+ store(
5472
+ {
5473
+ // SMS for Critical: an older build re-pointed "Call and Push".
5474
+ ...CALL_AND_PUSH_FOR_CRITICAL,
5475
+ id: SETTING_ID,
5476
+ notificationChannel: ComplianceNotificationChannel.SMS,
5477
+ },
5478
+ {
5479
+ id: SIBLING_SETTING_ID,
5480
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5481
+ notificationChannels: [ComplianceNotificationChannel.SMS],
5482
+ incidentSeverityIds: [MAJOR_INCIDENT],
5483
+ },
5484
+ );
5485
+
5486
+ // Re-scoped to Major it is "SMS for Major" - the sibling.
5487
+ await expect(
5488
+ update({ incidentSeverities: [MAJOR_INCIDENT] }),
5489
+ ).rejects.toThrow(DUPLICATE_COMPLIANCE_RULE_MESSAGE);
5490
+ });
5491
+
5492
+ test("...and by its list when the two agree", async () => {
5493
+ store(
5494
+ { ...CALL_AND_PUSH_FOR_CRITICAL, id: SETTING_ID },
5495
+ {
5496
+ id: SIBLING_SETTING_ID,
5497
+ ruleType: ComplianceRuleType.HasIncidentOnCallRules,
5498
+ notificationChannels: [ComplianceNotificationChannel.SMS],
5499
+ incidentSeverityIds: [MAJOR_INCIDENT],
5500
+ },
5501
+ );
5502
+
5503
+ // "Call and Push for Major" is not "SMS for Major".
5504
+ await expect(
5505
+ update({ incidentSeverities: [MAJOR_INCIDENT] }),
5506
+ ).resolves.toBeDefined();
5507
+ });
5508
+
5509
+ test("an update that sends the list writes the pair, so the row reads as its list again", async () => {
5510
+ store({
5511
+ ...CALL_AND_PUSH_FOR_CRITICAL,
5512
+ id: SETTING_ID,
5513
+ notificationChannel: ComplianceNotificationChannel.SMS,
5514
+ });
5515
+
5516
+ const updateBy: UpdateBy<TeamComplianceSetting> = updateByFor({
5517
+ notificationChannels: [
5518
+ ComplianceNotificationChannel.Push,
5519
+ ComplianceNotificationChannel.SMS,
5520
+ ],
5521
+ });
5522
+
5523
+ await onBeforeUpdate(updateBy);
5524
+
5525
+ expect(channelsOf(dataOf(updateBy))).toEqual({
5526
+ notificationChannels: [
5527
+ ComplianceNotificationChannel.SMS,
5528
+ ComplianceNotificationChannel.Push,
5529
+ ],
5530
+ notificationChannel: ComplianceNotificationChannel.SMS,
5531
+ });
5532
+ expect(
5533
+ TeamComplianceSettingServiceClass.getStoredChannels(dataOf(updateBy)),
5534
+ ).toEqual([
5535
+ ComplianceNotificationChannel.SMS,
5536
+ ComplianceNotificationChannel.Push,
5537
+ ]);
5538
+ });
5539
+ });
5540
+
5541
+ /*
5542
+ * ---------------------------------------------------------------------------
5543
+ * Through updateOneById, the path BaseAPI takes.
5544
+ * ---------------------------------------------------------------------------
5545
+ */
5546
+
5547
+ type InternalFindFunction = (
5548
+ findBy: JSONObject,
5549
+ ) => Promise<Array<TeamComplianceSetting>>;
5550
+
5551
+ interface ServiceInternals {
5552
+ _findBy: InternalFindFunction;
5553
+ }
5554
+
5555
+ describe("TeamComplianceSettingService updates reach the write normalised", () => {
5556
+ let service: TeamComplianceSettingServiceClass;
5557
+ let save: jest.Mock;
5558
+ let repositoryUpdate: jest.Mock;
5559
+
5560
+ beforeEach(() => {
5561
+ service = new TeamComplianceSettingServiceClass();
5562
+
5563
+ store(INCIDENT_CALL_CRITICAL);
5564
+
5565
+ // The hook's reads, from the in-memory team.
5566
+ jest.spyOn(service, "findBy").mockImplementation(((findBy: {
5567
+ query: JSONObject;
5568
+ }) => {
5569
+ return Promise.resolve(
5570
+ storedSettings.filter((row: TeamComplianceSetting): boolean => {
5571
+ return matchesQuery(row, findBy.query);
5572
+ }),
5573
+ );
5574
+ }) as never);
5575
+
5576
+ // _updateBy's own internal find of the row it is about to write.
5577
+ jest
5578
+ .spyOn(service as unknown as ServiceInternals, "_findBy")
5579
+ .mockImplementation((): Promise<Array<TeamComplianceSetting>> => {
5580
+ const row: TeamComplianceSetting = new TeamComplianceSetting();
5581
+ row._id = SETTING_ID;
5582
+ row.projectId = PROJECT_ID;
5583
+ return Promise.resolve([row]);
5584
+ });
5585
+
5586
+ save = jest.fn((item: unknown) => {
5587
+ return Promise.resolve(item);
5588
+ });
5589
+ repositoryUpdate = jest.fn(() => {
5590
+ return Promise.resolve({ affected: 1 });
5591
+ });
5592
+ jest.spyOn(service, "getRepository").mockReturnValue({
5593
+ save: save,
5594
+ update: repositoryUpdate,
5595
+ } as never);
5596
+
5597
+ // The permission layer needs a database and is not what this is about.
5598
+ jest
5599
+ .spyOn(ModelPermission, "checkUpdateQueryPermissions")
5600
+ .mockImplementation(((_modelType: unknown, query: unknown) => {
5601
+ return Promise.resolve(query);
5602
+ }) as never);
5603
+ jest
5604
+ .spyOn(ModelPermission, "checkUpdatePermissionByModel")
5605
+ .mockResolvedValue(undefined as never);
5606
+ });
5607
+
5608
+ test("a toggle is a plain column update: no hook reads, no relation write", async () => {
5609
+ await service.updateOneById({
5610
+ id: new ObjectID(SETTING_ID),
5611
+ data: { enabled: false },
5612
+ props: { isRoot: true },
5613
+ });
5614
+
3950
5615
  expect(service.findBy).not.toHaveBeenCalled();
3951
5616
  expect(save).not.toHaveBeenCalled();
3952
5617
  expect(repositoryUpdate).toHaveBeenCalledTimes(1);
@@ -3973,6 +5638,7 @@ describe("TeamComplianceSettingService updates reach the write normalised", () =
3973
5638
  expect(written["ruleType"]).toBe(
3974
5639
  ComplianceRuleType.HasNotificationEmailMethod,
3975
5640
  );
5641
+ expect(written["notificationChannels"]).toEqual([]);
3976
5642
  expect(written["notificationChannel"]).toBeNull();
3977
5643
  expect(written["incidentSeverities"]).toEqual([]);
3978
5644
  expect(written["alertSeverities"]).toEqual([]);
@@ -3982,14 +5648,14 @@ describe("TeamComplianceSettingService updates reach the write normalised", () =
3982
5648
  store({
3983
5649
  id: SIBLING_SETTING_ID,
3984
5650
  ruleType: ComplianceRuleType.HasIncidentOnCallRules,
3985
- notificationChannel: ComplianceNotificationChannel.Push,
5651
+ notificationChannels: [ComplianceNotificationChannel.Push],
3986
5652
  incidentSeverityIds: [CRITICAL_INCIDENT],
3987
5653
  });
3988
5654
 
3989
5655
  await expect(
3990
5656
  service.updateOneById({
3991
5657
  id: new ObjectID(SETTING_ID),
3992
- data: { notificationChannel: ComplianceNotificationChannel.Push },
5658
+ data: { notificationChannels: [ComplianceNotificationChannel.Push] },
3993
5659
  props: { isRoot: true },
3994
5660
  }),
3995
5661
  ).rejects.toThrow(DUPLICATE_COMPLIANCE_RULE_MESSAGE);
@@ -4038,4 +5704,100 @@ describe("TeamComplianceSettingService updates reach the write normalised", () =
4038
5704
  expect(save).not.toHaveBeenCalled();
4039
5705
  expect(repositoryUpdate).not.toHaveBeenCalled();
4040
5706
  });
5707
+
5708
+ /*
5709
+ * The channel columns are plain columns - the list is JSON, not a relation
5710
+ * - so an update that changes only them is a plain column update, and
5711
+ * reaches it as the pair the hook wrote.
5712
+ */
5713
+ test("a channel list reaches the write canonical, with its first channel beside it", async () => {
5714
+ await service.updateOneById({
5715
+ id: new ObjectID(SETTING_ID),
5716
+ data: {
5717
+ notificationChannels: [
5718
+ ComplianceNotificationChannel.Push,
5719
+ ComplianceNotificationChannel.Call,
5720
+ ComplianceNotificationChannel.Push,
5721
+ ],
5722
+ } as never,
5723
+ props: { isRoot: true },
5724
+ });
5725
+
5726
+ expect(save).not.toHaveBeenCalled();
5727
+ expect(repositoryUpdate).toHaveBeenCalledTimes(1);
5728
+ expect(repositoryUpdate.mock.calls[0]?.[1]).toMatchObject({
5729
+ notificationChannels: [
5730
+ ComplianceNotificationChannel.Call,
5731
+ ComplianceNotificationChannel.Push,
5732
+ ],
5733
+ notificationChannel: ComplianceNotificationChannel.Call,
5734
+ });
5735
+ });
5736
+
5737
+ test("a channel sent the old way reaches the write as a one-item list", async () => {
5738
+ await service.updateOneById({
5739
+ id: new ObjectID(SETTING_ID),
5740
+ data: { notificationChannel: ComplianceNotificationChannel.SMS },
5741
+ props: { isRoot: true },
5742
+ });
5743
+
5744
+ expect(repositoryUpdate).toHaveBeenCalledTimes(1);
5745
+ expect(repositoryUpdate.mock.calls[0]?.[1]).toMatchObject({
5746
+ notificationChannels: [ComplianceNotificationChannel.SMS],
5747
+ notificationChannel: ComplianceNotificationChannel.SMS,
5748
+ });
5749
+ });
5750
+
5751
+ test("clearing the channels reaches the write as an empty list and no channel", async () => {
5752
+ await service.updateOneById({
5753
+ id: new ObjectID(SETTING_ID),
5754
+ data: { notificationChannels: [] } as never,
5755
+ props: { isRoot: true },
5756
+ });
5757
+
5758
+ expect(repositoryUpdate).toHaveBeenCalledTimes(1);
5759
+ expect(repositoryUpdate.mock.calls[0]?.[1]).toMatchObject({
5760
+ notificationChannels: [],
5761
+ notificationChannel: null,
5762
+ });
5763
+ });
5764
+
5765
+ test("a list with a channel this build does not know is refused before anything is written", async () => {
5766
+ await expect(
5767
+ service.updateOneById({
5768
+ id: new ObjectID(SETTING_ID),
5769
+ data: {
5770
+ notificationChannels: [ComplianceNotificationChannel.Call, "Pager"],
5771
+ } as never,
5772
+ props: { isRoot: true },
5773
+ }),
5774
+ ).rejects.toThrow(UNKNOWN_CHANNEL_MESSAGE("Pager"));
5775
+
5776
+ expect(save).not.toHaveBeenCalled();
5777
+ expect(repositoryUpdate).not.toHaveBeenCalled();
5778
+ });
5779
+
5780
+ test("a rule type change clears a list of several channels in the same write", async () => {
5781
+ storedSettings = [];
5782
+ store({
5783
+ ...INCIDENT_CALL_CRITICAL,
5784
+ notificationChannels: [
5785
+ ComplianceNotificationChannel.Call,
5786
+ ComplianceNotificationChannel.Push,
5787
+ ],
5788
+ });
5789
+
5790
+ await service.updateOneById({
5791
+ id: new ObjectID(SETTING_ID),
5792
+ data: { ruleType: ComplianceRuleType.HasNotificationWebhookMethod },
5793
+ props: { isRoot: true },
5794
+ });
5795
+
5796
+ const written: Record<string, unknown> = save.mock.calls[0]?.[0] as Record<
5797
+ string,
5798
+ unknown
5799
+ >;
5800
+ expect(written["notificationChannels"]).toEqual([]);
5801
+ expect(written["notificationChannel"]).toBeNull();
5802
+ });
4041
5803
  });