@oneuptime/common 14.0.10 → 14.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (837) hide show
  1. package/Models/DatabaseModels/AIConversation.ts +127 -1
  2. package/Models/DatabaseModels/CephCluster.ts +12 -0
  3. package/Models/DatabaseModels/CloudResource.ts +12 -0
  4. package/Models/DatabaseModels/DatabaseServer.ts +12 -0
  5. package/Models/DatabaseModels/DockerHost.ts +12 -0
  6. package/Models/DatabaseModels/DockerSwarmCluster.ts +12 -0
  7. package/Models/DatabaseModels/GlobalOidc.ts +0 -4
  8. package/Models/DatabaseModels/GlobalOidcProject.ts +0 -4
  9. package/Models/DatabaseModels/GlobalSso.ts +0 -4
  10. package/Models/DatabaseModels/GlobalSsoProject.ts +0 -4
  11. package/Models/DatabaseModels/Host.ts +12 -0
  12. package/Models/DatabaseModels/IncidentForm.ts +594 -0
  13. package/Models/DatabaseModels/IncidentFormSubmission.ts +283 -0
  14. package/Models/DatabaseModels/IncidentTemplate.ts +59 -0
  15. package/Models/DatabaseModels/Index.ts +14 -0
  16. package/Models/DatabaseModels/IoTFleet.ts +12 -0
  17. package/Models/DatabaseModels/KubernetesCluster.ts +12 -0
  18. package/Models/DatabaseModels/MessageQueue.ts +1102 -0
  19. package/Models/DatabaseModels/MessageQueueLabelRule.ts +553 -0
  20. package/Models/DatabaseModels/MessageQueueOwnerRule.ts +633 -0
  21. package/Models/DatabaseModels/MessageQueueOwnerTeam.ts +491 -0
  22. package/Models/DatabaseModels/MessageQueueOwnerUser.ts +490 -0
  23. package/Models/DatabaseModels/PodmanHost.ts +12 -0
  24. package/Models/DatabaseModels/Project.ts +59 -0
  25. package/Models/DatabaseModels/ProjectOidc.ts +0 -4
  26. package/Models/DatabaseModels/ProjectSso.ts +0 -4
  27. package/Models/DatabaseModels/ProxmoxCluster.ts +12 -0
  28. package/Models/DatabaseModels/RumApplication.ts +12 -0
  29. package/Models/DatabaseModels/ServerlessFunction.ts +12 -0
  30. package/Models/DatabaseModels/Service.ts +12 -0
  31. package/Models/DatabaseModels/StatusPageOidc.ts +0 -4
  32. package/Models/DatabaseModels/StatusPageSso.ts +0 -4
  33. package/Models/DatabaseModels/TeamComplianceSetting.ts +47 -2
  34. package/Models/DatabaseModels/VMwareVCenter.ts +12 -0
  35. package/Server/API/AIChatAPI.ts +13 -114
  36. package/Server/API/AIInvestigationAPI.ts +3 -3
  37. package/Server/API/AIInvestigationConversationAPI.ts +266 -0
  38. package/Server/API/IncidentFormAPI.ts +376 -0
  39. package/Server/API/ProjectOIDC.ts +16 -25
  40. package/Server/API/ProjectSSO.ts +16 -24
  41. package/Server/API/StatusPageAPI.ts +42 -77
  42. package/Server/Enterprise/EnterpriseEdition.ts +93 -28
  43. package/Server/Enterprise/EnterpriseFeature.ts +25 -3
  44. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +1 -1
  45. package/Server/Enterprise/EnterpriseServerModule.ts +4 -1
  46. package/Server/EnvironmentConfig.ts +1 -1
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.ts +129 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.ts +52 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.ts +75 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.ts +477 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  52. package/Server/Middleware/IncidentFormRateLimit.ts +847 -0
  53. package/Server/Middleware/UserAuthorization.ts +16 -38
  54. package/Server/Services/AIService.ts +10 -13
  55. package/Server/Services/IncidentCustomFieldService.ts +112 -2
  56. package/Server/Services/IncidentEpisodeMemberService.ts +24 -4
  57. package/Server/Services/IncidentEpisodeService.ts +10 -1
  58. package/Server/Services/IncidentFormService.ts +1566 -0
  59. package/Server/Services/IncidentFormSubmissionService.ts +97 -0
  60. package/Server/Services/IncidentGroupingEngineService.ts +45 -8
  61. package/Server/Services/IncidentService.ts +123 -5
  62. package/Server/Services/IncidentTemplateService.ts +22 -0
  63. package/Server/Services/Index.ts +14 -0
  64. package/Server/Services/MessageQueueLabelRuleEngineService.ts +321 -0
  65. package/Server/Services/MessageQueueLabelRuleService.ts +14 -0
  66. package/Server/Services/MessageQueueOwnerRuleEngineService.ts +412 -0
  67. package/Server/Services/MessageQueueOwnerRuleService.ts +14 -0
  68. package/Server/Services/MessageQueueOwnerTeamService.ts +62 -0
  69. package/Server/Services/MessageQueueOwnerUserService.ts +62 -0
  70. package/Server/Services/MessageQueueService.ts +1463 -0
  71. package/Server/Services/OpenTelemetryIngestService.ts +37 -4
  72. package/Server/Services/ProjectService.ts +0 -59
  73. package/Server/Services/StatusPagePrivateUserService.ts +1 -4
  74. package/Server/Services/StatusPageService.ts +1 -51
  75. package/Server/Services/TeamComplianceSettingService.ts +163 -42
  76. package/Server/Services/UserNotificationRuleService.ts +8 -1
  77. package/Server/Services/WorkspaceNotificationSummaryService.ts +12 -3
  78. package/Server/Types/Database/Permissions/CreatePermission.ts +17 -3
  79. package/Server/Types/Database/Permissions/EditionPermission.ts +140 -38
  80. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +16 -0
  81. package/Server/Types/Database/Permissions/TablePermission.ts +3 -3
  82. package/Server/Types/Database/Permissions/UpdatePermission.ts +20 -6
  83. package/Server/Utils/AI/Chat/AgentContextCompactor.ts +200 -0
  84. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +307 -48
  85. package/Server/Utils/AI/Chat/ChatRunCancellation.ts +156 -0
  86. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +78 -18
  87. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  88. package/Server/Utils/AI/Chat/ToolOutputPager.ts +322 -0
  89. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +88 -30
  90. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +13 -1
  91. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +0 -32
  92. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +27 -25
  93. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +7 -1
  94. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +34 -14
  95. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +69 -24
  96. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +9 -0
  97. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +53 -10
  98. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +27 -10
  99. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +27 -10
  100. package/Server/Utils/AI/SRE/InvestigationQueue.ts +16 -19
  101. package/Server/Utils/AI/SRE/InvestigationThread.ts +646 -0
  102. package/Server/Utils/AI/SRE/InvestigationThreadService.ts +715 -0
  103. package/Server/Utils/AI/Toolbox/Serializer.ts +10 -3
  104. package/Server/Utils/EditionEnforcement.ts +19 -202
  105. package/Server/Utils/LLM/LLMService.ts +259 -63
  106. package/Server/Utils/RelaxedScimTeamLocksReport.ts +245 -0
  107. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  108. package/Server/Utils/SameOriginRequest.ts +203 -0
  109. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  110. package/Server/Utils/Telemetry/EntityRegistry.ts +4 -1
  111. package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +1402 -0
  112. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +4 -1
  113. package/Server/Utils/VendorAssets.ts +3 -3
  114. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +3 -1
  115. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +3 -1
  116. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +10 -1
  117. package/Tests/App/Accounts/IncidentFormPage.test.tsx +2036 -0
  118. package/Tests/App/Accounts/IncidentFormServerMessages.test.ts +119 -0
  119. package/Tests/App/Accounts/IncidentFormUtils.test.ts +1157 -0
  120. package/Tests/App/Accounts/LoginPasskey.test.tsx +6 -4
  121. package/Tests/App/Accounts/LoginSso.test.tsx +724 -0
  122. package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +338 -0
  123. package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +331 -0
  124. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +47 -33
  125. package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +1021 -0
  126. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +876 -78
  127. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +20 -3
  128. package/Tests/App/Dashboard/CephProxmoxVMwareDocumentationCards.test.tsx +359 -0
  129. package/Tests/App/Dashboard/CephSetupGuide.test.ts +961 -0
  130. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +381 -95
  131. package/Tests/App/Dashboard/CloudSetupGuide.test.ts +1463 -0
  132. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +174 -12
  133. package/Tests/App/Dashboard/ContainerSetupGuideCards.test.tsx +345 -0
  134. package/Tests/App/Dashboard/CoreListEmptyStates.test.tsx +501 -0
  135. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +0 -1
  136. package/Tests/App/Dashboard/DatabaseDocumentationCard.test.tsx +400 -0
  137. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +5 -0
  138. package/Tests/App/Dashboard/DatabaseSetupGuide.test.ts +1869 -0
  139. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +44 -0
  140. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +50 -9
  141. package/Tests/App/Dashboard/DockerSetupGuide.test.ts +899 -0
  142. package/Tests/App/Dashboard/DockerSwarmSetupGuide.test.ts +964 -0
  143. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +141 -7
  144. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +52 -39
  145. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +7 -1
  146. package/Tests/App/Dashboard/GettingStartedTaskRoutes.test.tsx +331 -0
  147. package/Tests/App/Dashboard/HomeOverviewStatsFirstRun.test.tsx +925 -0
  148. package/Tests/App/Dashboard/HostDocumentationCard.test.tsx +225 -0
  149. package/Tests/App/Dashboard/HostSetupGuide.test.ts +1183 -0
  150. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +69 -45
  151. package/Tests/App/Dashboard/IncidentCreateTemplateCustomFieldSettings.test.tsx +745 -0
  152. package/Tests/App/Dashboard/IncidentCreateTemplateOwners.test.tsx +414 -0
  153. package/Tests/App/Dashboard/IncidentCustomFieldCreateSettingsForm.test.ts +1042 -0
  154. package/Tests/App/Dashboard/IncidentCustomFieldSettingsCard.test.tsx +1816 -0
  155. package/Tests/App/Dashboard/IncidentFormPlan.test.ts +89 -0
  156. package/Tests/App/Dashboard/IncidentFormShareLinkCard.test.tsx +846 -0
  157. package/Tests/App/Dashboard/IncidentFormsPages.test.tsx +1324 -0
  158. package/Tests/App/Dashboard/IncidentTemplateCustomFieldSettings.test.tsx +630 -0
  159. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +13 -0
  160. package/Tests/App/Dashboard/IncomingEmailMonitorLinkVerifyHint.test.tsx +104 -0
  161. package/Tests/App/Dashboard/InvestigationConversation.test.tsx +1107 -0
  162. package/Tests/App/Dashboard/InvestigationConversationData.test.ts +546 -0
  163. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +170 -5
  164. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +207 -2
  165. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +729 -34
  166. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +9 -21
  167. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +274 -37
  168. package/Tests/App/Dashboard/InvestigationStatusBadge.test.tsx +130 -0
  169. package/Tests/App/Dashboard/IoTDocumentationCard.test.tsx +218 -0
  170. package/Tests/App/Dashboard/IoTSetupGuide.test.ts +1124 -0
  171. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +20 -6
  172. package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +107 -83
  173. package/Tests/App/Dashboard/KubernetesSetupGuide.test.ts +787 -0
  174. package/Tests/App/Dashboard/MessageQueueBreadcrumbs.test.tsx +228 -0
  175. package/Tests/App/Dashboard/MessageQueueBrokerHealth.test.tsx +1538 -0
  176. package/Tests/App/Dashboard/MessageQueueBrokerHealthMetricChart.test.tsx +969 -0
  177. package/Tests/App/Dashboard/MessageQueueBrokerHealthReads.test.ts +889 -0
  178. package/Tests/App/Dashboard/MessageQueueBrokerMetricsReach.test.ts +236 -0
  179. package/Tests/App/Dashboard/MessageQueueDocumentationCard.test.tsx +479 -0
  180. package/Tests/App/Dashboard/MessageQueueListPages.test.tsx +1232 -0
  181. package/Tests/App/Dashboard/MessageQueueMetricDescriptions.test.ts +244 -0
  182. package/Tests/App/Dashboard/MessageQueueMonitorLink.test.ts +952 -0
  183. package/Tests/App/Dashboard/MessageQueueMonitorLinkMonitorCreate.test.tsx +859 -0
  184. package/Tests/App/Dashboard/MessageQueueOverview.test.tsx +1773 -0
  185. package/Tests/App/Dashboard/MessageQueueOverviewPresentation.test.ts +196 -0
  186. package/Tests/App/Dashboard/MessageQueuePresentation.test.ts +799 -0
  187. package/Tests/App/Dashboard/MessageQueueProducersConsumers.test.tsx +680 -0
  188. package/Tests/App/Dashboard/MessageQueueRoutes.test.tsx +383 -0
  189. package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +278 -0
  190. package/Tests/App/Dashboard/MessageQueueSetupGuide.test.ts +2778 -0
  191. package/Tests/App/Dashboard/MessageQueueSideMenus.test.tsx +273 -0
  192. package/Tests/App/Dashboard/MessageQueueSpanPopulations.test.ts +930 -0
  193. package/Tests/App/Dashboard/MessageQueueSpanStore.ts +351 -0
  194. package/Tests/App/Dashboard/MessageQueueTelemetryScope.test.ts +375 -0
  195. package/Tests/App/Dashboard/MessageQueueTelemetryScopeTabs.test.tsx +668 -0
  196. package/Tests/App/Dashboard/MessageQueueViewPages.test.tsx +685 -0
  197. package/Tests/App/Dashboard/MonitorAndHomeNotOperationalMenus.test.tsx +342 -0
  198. package/Tests/App/Dashboard/MonitorCreateFirstRunDefaults.test.tsx +623 -0
  199. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +442 -0
  200. package/Tests/App/Dashboard/MonitorLogsPageViewSummary.test.tsx +814 -0
  201. package/Tests/App/Dashboard/MonitorSetupCardBodies.test.tsx +246 -0
  202. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +8 -0
  203. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +27 -12
  204. package/Tests/App/Dashboard/PlanGatedPage.test.tsx +292 -0
  205. package/Tests/App/Dashboard/PodmanSetupGuide.test.ts +948 -0
  206. package/Tests/App/Dashboard/ProductOrientation.test.tsx +5 -4
  207. package/Tests/App/Dashboard/ProductSettingsSectionCollapsed.test.tsx +266 -0
  208. package/Tests/App/Dashboard/ProxmoxSetupGuide.test.ts +1318 -0
  209. package/Tests/App/Dashboard/ResourceAiAgentAttentionServerParity.test.ts +555 -0
  210. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +298 -9
  211. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +453 -0
  212. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +16 -0
  213. package/Tests/App/Dashboard/ResourceConnectionGuideCard.test.tsx +444 -0
  214. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsInfra.test.tsx +798 -0
  215. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsPlatforms.test.tsx +717 -0
  216. package/Tests/App/Dashboard/ResourceConnectionGuides.test.ts +981 -0
  217. package/Tests/App/Dashboard/ResourceConnectionState.test.ts +132 -0
  218. package/Tests/App/Dashboard/RumDocumentationCard.test.tsx +293 -0
  219. package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +467 -0
  220. package/Tests/App/Dashboard/RumSetupGuide.test.ts +758 -0
  221. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +25 -0
  222. package/Tests/App/Dashboard/ServerlessDocumentationCard.test.tsx +254 -0
  223. package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1074 -0
  224. package/Tests/App/Dashboard/SetupGuide.test.ts +246 -0
  225. package/Tests/App/Dashboard/SetupGuideCard.test.tsx +756 -0
  226. package/Tests/App/Dashboard/SloListSideMenu.test.tsx +120 -0
  227. package/Tests/App/Dashboard/SsoPages.test.tsx +833 -0
  228. package/Tests/App/Dashboard/TelemetryDocumentation.test.tsx +253 -0
  229. package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +730 -0
  230. package/Tests/App/Dashboard/VMwareSetupGuide.test.ts +1033 -0
  231. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +87 -7
  232. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +28 -9
  233. package/Tests/Models/DatabaseModels/IncidentFormModel.test.ts +1250 -0
  234. package/Tests/Models/DatabaseModels/MessageQueueModels.test.ts +1983 -0
  235. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  236. package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +190 -14
  237. package/Tests/Models/IncidentTemplateCustomFieldSettingsColumn.test.ts +291 -0
  238. package/Tests/Server/API/AIInvestigationConversationAPI.test.ts +412 -0
  239. package/Tests/Server/API/GlobalConfigLicense.test.ts +38 -9
  240. package/Tests/Server/API/IncidentFormAPI.test.ts +942 -0
  241. package/Tests/Server/API/IncidentFormPublicRoutes.test.ts +1653 -0
  242. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -1
  243. package/Tests/Server/API/{SsoProviderListingsEdition.test.ts → SsoProviderListings.test.ts} +164 -110
  244. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +76 -54
  245. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +125 -42
  246. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +36 -10
  247. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +51 -9
  248. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +13 -8
  249. package/Tests/Server/Enterprise/SsoInCommunityEdition.test.ts +540 -0
  250. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  251. package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +438 -0
  252. package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleNotificationChannelsMigration.test.ts +255 -0
  253. package/Tests/Server/Infrastructure/Postgres/MessageQueueTablesMigration.test.ts +637 -0
  254. package/Tests/Server/Middleware/IncidentFormRateLimit.test.ts +1630 -0
  255. package/Tests/Server/Middleware/UserAuthorization.test.ts +16 -17
  256. package/Tests/Server/Middleware/UserAuthorizationSsoEnforcement.test.ts +544 -0
  257. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +37 -8
  258. package/Tests/Server/Services/IncidentCreatedFeedTitle.test.ts +212 -0
  259. package/Tests/Server/Services/IncidentCustomFieldDeleteFormQuestions.test.ts +297 -0
  260. package/Tests/Server/Services/IncidentFormOwnersCreatedNotification.test.ts +497 -0
  261. package/Tests/Server/Services/IncidentFormPostgres.test.ts +958 -0
  262. package/Tests/Server/Services/IncidentFormPublicForm.test.ts +1260 -0
  263. package/Tests/Server/Services/IncidentFormPublicSubmission.test.ts +2520 -0
  264. package/Tests/Server/Services/IncidentFormRegistration.test.ts +159 -0
  265. package/Tests/Server/Services/IncidentFormService.test.ts +663 -0
  266. package/Tests/Server/Services/IncidentFormSubmissionService.test.ts +430 -0
  267. package/Tests/Server/Services/IncidentFormSubmissionTemplateBranch.test.ts +473 -0
  268. package/Tests/Server/Services/IncidentGroupingTemplateSubstitution.test.ts +81 -0
  269. package/Tests/Server/Services/IncidentTemplateCustomFieldSettings.test.ts +262 -0
  270. package/Tests/Server/Services/IncidentTemplateOwnersOnDeclare.test.ts +566 -0
  271. package/Tests/Server/Services/IncidentTitleMarkdownSinks.test.ts +640 -0
  272. package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +3 -3
  273. package/Tests/Server/Services/MessageQueueOwnerServices.test.ts +440 -0
  274. package/Tests/Server/Services/MessageQueueRegistries.test.ts +577 -0
  275. package/Tests/Server/Services/MessageQueueRuleEngines.test.ts +900 -0
  276. package/Tests/Server/Services/MessageQueueService.test.ts +2210 -0
  277. package/Tests/Server/Services/MessageQueueSqlPostgres.test.ts +1271 -0
  278. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
  279. package/Tests/Server/Services/OpenTelemetryRetentionOverrideEdition.test.ts +474 -0
  280. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +21 -0
  281. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +3 -0
  282. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +0 -1
  283. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +56 -6
  284. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -1
  285. package/Tests/Server/Services/SsoRequirementReads.test.ts +454 -0
  286. package/Tests/Server/Services/SsoRequirementWrites.test.ts +529 -0
  287. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  288. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +107 -89
  289. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +1068 -176
  290. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +1962 -200
  291. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +654 -297
  292. package/Tests/Server/Types/Database/Permissions/RetentionOverrideColumns.test.ts +784 -0
  293. package/Tests/Server/Types/Database/Permissions/SsoScalePlanGate.test.ts +418 -0
  294. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +0 -1
  295. package/Tests/Server/Utils/AI/AIInvestigationEngineRunLimits.test.ts +136 -0
  296. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +15 -14
  297. package/Tests/Server/Utils/AI/AgentContextCompactor.test.ts +351 -0
  298. package/Tests/Server/Utils/AI/ChatAgentRunnerSharedThread.test.ts +842 -0
  299. package/Tests/Server/Utils/AI/ChatRunCancellation.test.ts +195 -0
  300. package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +10 -57
  301. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +20 -24
  302. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +7 -30
  303. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +225 -29
  304. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +266 -25
  305. package/Tests/Server/Utils/AI/InvestigationThread.test.ts +580 -0
  306. package/Tests/Server/Utils/AI/InvestigationThreadService.test.ts +801 -0
  307. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +525 -43
  308. package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +4 -2
  309. package/Tests/Server/Utils/AI/LLMServiceUnreachableProvider.test.ts +435 -0
  310. package/Tests/Server/Utils/AI/ObservabilityAssistantLimits.test.ts +462 -0
  311. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +14 -25
  312. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +2 -0
  313. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +297 -15
  314. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +10 -6
  315. package/Tests/Server/Utils/AI/ToolOutputPager.test.ts +382 -0
  316. package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +23 -4
  317. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +25 -6
  318. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +14 -3
  319. package/Tests/Server/Utils/EditionEnforcement.test.ts +107 -147
  320. package/Tests/Server/Utils/{CommunityEditionSsoReport.test.ts → RelaxedScimTeamLocksReport.test.ts} +212 -208
  321. package/Tests/Server/Utils/SameOriginRequest.test.ts +372 -0
  322. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +20 -0
  323. package/Tests/Server/Utils/Telemetry/MessageQueueDiscovery.test.ts +2590 -0
  324. package/Tests/Server/Utils/Telemetry/MessageQueueSpanQueryTwin.ts +246 -0
  325. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +23 -0
  326. package/Tests/Types/AI/AIAgentRunLimits.test.ts +255 -0
  327. package/Tests/Types/Code/JsonSyntax.test.ts +1300 -0
  328. package/Tests/Types/CustomField/CustomFieldCreateSettings.test.ts +1113 -0
  329. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +91 -0
  330. package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +30 -0
  331. package/Tests/Types/Incident/IncidentFormIpAllowlist.test.ts +227 -0
  332. package/Tests/Types/Incident/IncidentFormPublic.test.ts +1916 -0
  333. package/Tests/Types/MessageQueue/MessageQueueEntityKey.test.ts +916 -0
  334. package/Tests/Types/MessageQueue/MessageQueueIdentity.test.ts +567 -0
  335. package/Tests/Types/MessageQueue/MessageQueueManualIdentity.test.ts +686 -0
  336. package/Tests/Types/MessageQueue/MessageQueueMetricCatalog.test.ts +1726 -0
  337. package/Tests/Types/MessageQueue/MessageQueueMetricResolution.test.ts +1758 -0
  338. package/Tests/Types/MessageQueue/MessagingInstrumentationFixtures.test.ts +4686 -0
  339. package/Tests/Types/MessageQueue/MessagingSystem.test.ts +840 -0
  340. package/Tests/Types/MessageQueue/MessagingTelemetryFixtures.ts +3287 -0
  341. package/Tests/Types/MessageQueue/MessagingTelemetryResolver.test.ts +2966 -0
  342. package/Tests/Types/Monitor/MessageQueueAlertTemplates.test.ts +5401 -0
  343. package/Tests/Types/Monitor/MetricEngineFold.ts +154 -0
  344. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +5 -3
  345. package/Tests/Types/Team/ComplianceRule.test.ts +588 -37
  346. package/Tests/Types/Team/TeamComplianceStatus.test.ts +64 -11
  347. package/Tests/Types/XML.test.ts +51 -0
  348. package/Tests/UI/Components/CodeEditor/CodeEditor.test.tsx +2362 -0
  349. package/Tests/UI/Components/CodeEditor/CodeEditorCommands.test.ts +810 -0
  350. package/Tests/UI/Components/CodeEditor/CodeEditorHighlight.test.ts +338 -0
  351. package/Tests/UI/Components/CodeEditor/CodeEditorLanguages.test.ts +222 -0
  352. package/Tests/UI/Components/CodeEditor/CodeEditorStyles.test.ts +807 -0
  353. package/Tests/UI/Components/CodeEditor/NoMonaco.test.ts +245 -0
  354. package/Tests/UI/Components/CodeEditor/YamlEditor.test.tsx +729 -0
  355. package/Tests/UI/Components/CopyTextButton.test.tsx +76 -0
  356. package/Tests/UI/Components/EditionLabelLapseCopy.ts +51 -14
  357. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +131 -23
  358. package/Tests/UI/Components/ErrorMessageAction.test.tsx +142 -0
  359. package/Tests/UI/Components/FacetSidebarInScope.test.tsx +459 -0
  360. package/Tests/UI/Components/FacetValuesInScope.test.ts +270 -0
  361. package/Tests/UI/Components/Forms/FormFieldCodeEditors.test.tsx +294 -0
  362. package/Tests/UI/Components/Forms/FormFieldMarkdown.test.tsx +126 -0
  363. package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +22 -75
  364. package/Tests/UI/Components/Forms/ModelFormOnBeforeCreateMiscData.test.tsx +254 -0
  365. package/Tests/UI/Components/Icon.test.tsx +32 -0
  366. package/Tests/UI/Components/Input.test.tsx +31 -0
  367. package/Tests/UI/Components/LockedFilterChipScope.test.tsx +501 -0
  368. package/Tests/UI/Components/MarkdownConverters.test.ts +253 -1
  369. package/Tests/UI/Components/MarkdownEditor.test.tsx +2785 -2
  370. package/Tests/UI/Components/MarkdownEditorHistory.test.ts +243 -0
  371. package/Tests/UI/Components/MarkdownListEditing.test.ts +1118 -0
  372. package/Tests/UI/Components/MarkdownPaste.test.ts +1180 -0
  373. package/Tests/UI/Components/MarkdownViewerCopy.test.tsx +466 -0
  374. package/Tests/UI/Components/MarkdownVisualEditing.test.ts +1089 -0
  375. package/Tests/UI/Components/ModelTable/BaseModelTableEmptyStateAction.test.tsx +623 -0
  376. package/Tests/UI/Components/ResetObjectID.test.tsx +282 -0
  377. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  378. package/Tests/UI/Components/Table/EmptyTableMessage.test.ts +439 -0
  379. package/Tests/UI/Components/Table/TableEmptyState.test.tsx +352 -0
  380. package/Tests/UI/Components/TableRowMobileTitles.test.tsx +78 -0
  381. package/Tests/UI/Components/TextArea.test.tsx +19 -0
  382. package/Tests/UI/Components/Workflow/ModelColumnEditor.render.test.tsx +12 -29
  383. package/Tests/UI/Components/fixtures/MarkdownPasteFixtures.ts +460 -0
  384. package/Tests/UI/EsbuildConfig.test.ts +115 -39
  385. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +4 -4
  386. package/Tests/UI/Monitor/MonitorLogSummaryRender.test.tsx +377 -0
  387. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +81 -1
  388. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +17 -0
  389. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  390. package/Tests/Utils/Markdown/DashboardMarkdownRenderer.ts +81 -0
  391. package/Tests/Utils/Markdown/UntrustedMarkdown.test.ts +1339 -0
  392. package/Tests/Utils/Monitor/MonitorLogSummaryUtil.test.ts +862 -0
  393. package/Types/AI/AIAgentRunLimits.ts +146 -0
  394. package/Types/Code/CodeType.ts +2 -0
  395. package/Types/Code/JsonSyntax.ts +923 -0
  396. package/Types/CustomField/CustomFieldCreateSettings.ts +549 -0
  397. package/Types/CustomField/CustomFieldMappingCatalog.ts +77 -0
  398. package/Types/CustomField/CustomFieldValueValidator.ts +10 -7
  399. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +1 -1
  400. package/Types/Icon/IconProp.ts +2 -0
  401. package/Types/Incident/IncidentFormIpAllowlist.ts +206 -0
  402. package/Types/Incident/IncidentFormPublic.ts +1145 -0
  403. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +10 -3
  404. package/Types/MessageQueue/MessageQueueIdentity.ts +256 -0
  405. package/Types/MessageQueue/MessageQueueManualIdentity.ts +325 -0
  406. package/Types/MessageQueue/MessageQueueMetricCatalog.ts +1357 -0
  407. package/Types/MessageQueue/MessagingSystem.ts +518 -0
  408. package/Types/MessageQueue/MessagingTelemetryResolver.ts +2311 -0
  409. package/Types/Monitor/MessageQueueAlertTemplates.ts +2128 -0
  410. package/Types/Permission.ts +310 -0
  411. package/Types/ResourceAiAgent/ResourceAiAccess.ts +10 -4
  412. package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
  413. package/Types/Rules/RuleRun.ts +4 -0
  414. package/Types/Team/ComplianceNotificationChannel.ts +4 -3
  415. package/Types/Team/ComplianceRule.ts +71 -18
  416. package/Types/Team/ComplianceRuleType.ts +2 -2
  417. package/Types/Team/TeamComplianceStatus.ts +6 -2
  418. package/Types/Telemetry/EntityType.ts +16 -0
  419. package/Types/Telemetry/LockedFilterDetail.ts +22 -0
  420. package/Types/XML.ts +26 -0
  421. package/UI/Components/CodeEditor/CodeEditor.css +379 -0
  422. package/UI/Components/CodeEditor/CodeEditor.tsx +1128 -294
  423. package/UI/Components/CodeEditor/CodeEditorCommands.ts +774 -0
  424. package/UI/Components/CodeEditor/CodeEditorHighlight.ts +106 -0
  425. package/UI/Components/CodeEditor/CodeEditorLanguages.ts +164 -0
  426. package/UI/Components/CodeEditor/YamlEditor.tsx +28 -326
  427. package/UI/Components/CopyTextButton/CopyTextButton.tsx +5 -1
  428. package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +6 -25
  429. package/UI/Components/EditionLabel/EditionLabel.tsx +14 -13
  430. package/UI/Components/ErrorMessage/ErrorMessage.tsx +11 -1
  431. package/UI/Components/Forms/Fields/FormField.tsx +8 -0
  432. package/UI/Components/Forms/Types/Field.ts +8 -0
  433. package/UI/Components/Icon/Icon.tsx +18 -0
  434. package/UI/Components/Input/Input.tsx +11 -4
  435. package/UI/Components/LogsViewer/LogsViewer.tsx +4 -0
  436. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +21 -3
  437. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  438. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +877 -79
  439. package/UI/Components/Markdown.tsx/MarkdownEditorHistory.ts +284 -0
  440. package/UI/Components/Markdown.tsx/MarkdownListEditing.ts +1362 -0
  441. package/UI/Components/Markdown.tsx/MarkdownPaste.ts +1326 -0
  442. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +106 -10
  443. package/UI/Components/Markdown.tsx/MarkdownVisualEditing.ts +1032 -0
  444. package/UI/Components/ModelTable/BaseModelTable.tsx +85 -7
  445. package/UI/Components/ResetObjectID/ResetObjectID.tsx +35 -9
  446. package/UI/Components/Table/EmptyTableMessage.ts +81 -0
  447. package/UI/Components/Table/Table.tsx +50 -21
  448. package/UI/Components/Table/TableRow.tsx +9 -1
  449. package/UI/Components/TelemetryViewer/FacetVisibility.ts +97 -2
  450. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +13 -0
  451. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +214 -7
  452. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +21 -3
  453. package/UI/Components/TextArea/TextArea.tsx +9 -2
  454. package/UI/Components/Workflow/ModelFieldPicker.tsx +10 -12
  455. package/UI/Styles/Theme.css +8 -0
  456. package/UI/esbuild-config.js +2 -32
  457. package/Utils/LabelRuleImportExport.ts +2 -0
  458. package/Utils/Markdown/UntrustedMarkdown.ts +1513 -0
  459. package/Utils/Monitor/IncomingEmailMonitorRequestUtil.ts +41 -0
  460. package/Utils/Monitor/MonitorLogSummaryUtil.ts +212 -0
  461. package/Utils/Telemetry/EntityKey.ts +48 -0
  462. package/build/dist/Models/DatabaseModels/AIConversation.js +125 -1
  463. package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
  464. package/build/dist/Models/DatabaseModels/CephCluster.js +12 -0
  465. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  466. package/build/dist/Models/DatabaseModels/CloudResource.js +12 -0
  467. package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
  468. package/build/dist/Models/DatabaseModels/DatabaseServer.js +12 -0
  469. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  470. package/build/dist/Models/DatabaseModels/DockerHost.js +12 -0
  471. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  472. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +12 -0
  473. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  474. package/build/dist/Models/DatabaseModels/GlobalOidc.js +0 -4
  475. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  476. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +0 -4
  477. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
  478. package/build/dist/Models/DatabaseModels/GlobalSso.js +0 -4
  479. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  480. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +0 -4
  481. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
  482. package/build/dist/Models/DatabaseModels/Host.js +12 -0
  483. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  484. package/build/dist/Models/DatabaseModels/IncidentForm.js +605 -0
  485. package/build/dist/Models/DatabaseModels/IncidentForm.js.map +1 -0
  486. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js +299 -0
  487. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js.map +1 -0
  488. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +60 -0
  489. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  490. package/build/dist/Models/DatabaseModels/Index.js +14 -0
  491. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  492. package/build/dist/Models/DatabaseModels/IoTFleet.js +12 -0
  493. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
  494. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +12 -0
  495. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  496. package/build/dist/Models/DatabaseModels/MessageQueue.js +1106 -0
  497. package/build/dist/Models/DatabaseModels/MessageQueue.js.map +1 -0
  498. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js +562 -0
  499. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js.map +1 -0
  500. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js +643 -0
  501. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js.map +1 -0
  502. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js +506 -0
  503. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js.map +1 -0
  504. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js +505 -0
  505. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js.map +1 -0
  506. package/build/dist/Models/DatabaseModels/PodmanHost.js +12 -0
  507. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  508. package/build/dist/Models/DatabaseModels/Project.js +61 -0
  509. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  510. package/build/dist/Models/DatabaseModels/ProjectOidc.js +0 -4
  511. package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
  512. package/build/dist/Models/DatabaseModels/ProjectSso.js +0 -4
  513. package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
  514. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +12 -0
  515. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  516. package/build/dist/Models/DatabaseModels/RumApplication.js +12 -0
  517. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  518. package/build/dist/Models/DatabaseModels/ServerlessFunction.js +12 -0
  519. package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
  520. package/build/dist/Models/DatabaseModels/Service.js +12 -0
  521. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  522. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +0 -4
  523. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  524. package/build/dist/Models/DatabaseModels/StatusPageSso.js +0 -4
  525. package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
  526. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +49 -3
  527. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  528. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +12 -0
  529. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  530. package/build/dist/Server/API/AIChatAPI.js +9 -103
  531. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  532. package/build/dist/Server/API/AIInvestigationAPI.js +3 -3
  533. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  534. package/build/dist/Server/API/AIInvestigationConversationAPI.js +162 -0
  535. package/build/dist/Server/API/AIInvestigationConversationAPI.js.map +1 -0
  536. package/build/dist/Server/API/IncidentFormAPI.js +245 -0
  537. package/build/dist/Server/API/IncidentFormAPI.js.map +1 -0
  538. package/build/dist/Server/API/ProjectOIDC.js +16 -24
  539. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  540. package/build/dist/Server/API/ProjectSSO.js +16 -24
  541. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  542. package/build/dist/Server/API/StatusPageAPI.js +42 -75
  543. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  544. package/build/dist/Server/Enterprise/EnterpriseEdition.js +79 -25
  545. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -1
  546. package/build/dist/Server/Enterprise/EnterpriseFeature.js +24 -3
  547. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -1
  548. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +1 -1
  549. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -1
  550. package/build/dist/Server/EnvironmentConfig.js +1 -1
  551. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js +63 -0
  552. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js.map +1 -0
  553. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js +41 -0
  554. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js.map +1 -0
  555. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js +40 -0
  556. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js.map +1 -0
  557. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js +183 -0
  558. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js.map +1 -0
  559. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  560. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  561. package/build/dist/Server/Middleware/IncidentFormRateLimit.js +559 -0
  562. package/build/dist/Server/Middleware/IncidentFormRateLimit.js.map +1 -0
  563. package/build/dist/Server/Middleware/UserAuthorization.js +11 -30
  564. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  565. package/build/dist/Server/Services/AIService.js +10 -13
  566. package/build/dist/Server/Services/AIService.js.map +1 -1
  567. package/build/dist/Server/Services/IncidentCustomFieldService.js +83 -0
  568. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  569. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
  570. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  571. package/build/dist/Server/Services/IncidentEpisodeService.js +10 -1
  572. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  573. package/build/dist/Server/Services/IncidentFormService.js +1202 -0
  574. package/build/dist/Server/Services/IncidentFormService.js.map +1 -0
  575. package/build/dist/Server/Services/IncidentFormSubmissionService.js +91 -0
  576. package/build/dist/Server/Services/IncidentFormSubmissionService.js.map +1 -0
  577. package/build/dist/Server/Services/IncidentGroupingEngineService.js +20 -8
  578. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  579. package/build/dist/Server/Services/IncidentService.js +106 -4
  580. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  581. package/build/dist/Server/Services/IncidentTemplateService.js +18 -0
  582. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  583. package/build/dist/Server/Services/Index.js +14 -0
  584. package/build/dist/Server/Services/Index.js.map +1 -1
  585. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js +262 -0
  586. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js.map +1 -0
  587. package/build/dist/Server/Services/MessageQueueLabelRuleService.js +13 -0
  588. package/build/dist/Server/Services/MessageQueueLabelRuleService.js.map +1 -0
  589. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js +334 -0
  590. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js.map +1 -0
  591. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js +13 -0
  592. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js.map +1 -0
  593. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js +62 -0
  594. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js.map +1 -0
  595. package/build/dist/Server/Services/MessageQueueOwnerUserService.js +62 -0
  596. package/build/dist/Server/Services/MessageQueueOwnerUserService.js.map +1 -0
  597. package/build/dist/Server/Services/MessageQueueService.js +1140 -0
  598. package/build/dist/Server/Services/MessageQueueService.js.map +1 -0
  599. package/build/dist/Server/Services/OpenTelemetryIngestService.js +25 -4
  600. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  601. package/build/dist/Server/Services/ProjectService.js +0 -54
  602. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  603. package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -4
  604. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  605. package/build/dist/Server/Services/StatusPageService.js +0 -46
  606. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  607. package/build/dist/Server/Services/TeamComplianceSettingService.js +120 -31
  608. package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
  609. package/build/dist/Server/Services/UserNotificationRuleService.js +8 -1
  610. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  611. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +12 -3
  612. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
  613. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +6 -3
  614. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  615. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +109 -37
  616. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  617. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +16 -0
  618. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  619. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +3 -3
  620. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +9 -6
  621. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  622. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js +128 -0
  623. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js.map +1 -0
  624. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +192 -50
  625. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  626. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js +133 -0
  627. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js.map +1 -0
  628. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +53 -13
  629. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  630. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  631. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js +206 -0
  632. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js.map +1 -0
  633. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +53 -26
  634. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
  635. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +4 -2
  636. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
  637. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +1 -29
  638. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  639. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +24 -24
  640. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  641. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +7 -2
  642. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  643. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +29 -14
  644. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  645. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +38 -14
  646. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -1
  647. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +2 -0
  648. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -1
  649. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +40 -10
  650. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  651. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +19 -7
  652. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  653. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +19 -7
  654. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  655. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +15 -18
  656. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  657. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js +412 -0
  658. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js.map +1 -0
  659. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js +495 -0
  660. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js.map +1 -0
  661. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +10 -3
  662. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -1
  663. package/build/dist/Server/Utils/EditionEnforcement.js +20 -158
  664. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -1
  665. package/build/dist/Server/Utils/LLM/LLMService.js +193 -54
  666. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  667. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js +160 -0
  668. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js.map +1 -0
  669. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  670. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  671. package/build/dist/Server/Utils/SameOriginRequest.js +151 -0
  672. package/build/dist/Server/Utils/SameOriginRequest.js.map +1 -0
  673. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  674. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  675. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -1
  676. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  677. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +1015 -0
  678. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -0
  679. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +4 -1
  680. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  681. package/build/dist/Server/Utils/VendorAssets.js +3 -3
  682. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +3 -1
  683. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  684. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +3 -1
  685. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  686. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +10 -1
  687. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  688. package/build/dist/Types/AI/AIAgentRunLimits.js +91 -0
  689. package/build/dist/Types/AI/AIAgentRunLimits.js.map +1 -0
  690. package/build/dist/Types/Code/CodeType.js +2 -0
  691. package/build/dist/Types/Code/CodeType.js.map +1 -1
  692. package/build/dist/Types/Code/JsonSyntax.js +604 -0
  693. package/build/dist/Types/Code/JsonSyntax.js.map +1 -0
  694. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js +310 -0
  695. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js.map +1 -0
  696. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +38 -0
  697. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -1
  698. package/build/dist/Types/CustomField/CustomFieldValueValidator.js +10 -7
  699. package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -1
  700. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +1 -1
  701. package/build/dist/Types/Icon/IconProp.js +2 -0
  702. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  703. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js +119 -0
  704. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js.map +1 -0
  705. package/build/dist/Types/Incident/IncidentFormPublic.js +678 -0
  706. package/build/dist/Types/Incident/IncidentFormPublic.js.map +1 -0
  707. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +10 -3
  708. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
  709. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js +184 -0
  710. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js.map +1 -0
  711. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js +190 -0
  712. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js.map +1 -0
  713. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js +1057 -0
  714. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js.map +1 -0
  715. package/build/dist/Types/MessageQueue/MessagingSystem.js +394 -0
  716. package/build/dist/Types/MessageQueue/MessagingSystem.js.map +1 -0
  717. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js +1768 -0
  718. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js.map +1 -0
  719. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js +1207 -0
  720. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js.map +1 -0
  721. package/build/dist/Types/Permission.js +274 -0
  722. package/build/dist/Types/Permission.js.map +1 -1
  723. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +10 -4
  724. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -1
  725. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +12 -0
  726. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  727. package/build/dist/Types/Rules/RuleRun.js +4 -0
  728. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  729. package/build/dist/Types/Team/ComplianceNotificationChannel.js +4 -3
  730. package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -1
  731. package/build/dist/Types/Team/ComplianceRule.js +48 -14
  732. package/build/dist/Types/Team/ComplianceRule.js.map +1 -1
  733. package/build/dist/Types/Team/ComplianceRuleType.js +2 -2
  734. package/build/dist/Types/Telemetry/EntityType.js +16 -0
  735. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  736. package/build/dist/Types/XML.js +23 -0
  737. package/build/dist/Types/XML.js.map +1 -1
  738. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +641 -266
  739. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  740. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js +464 -0
  741. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js.map +1 -0
  742. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js +69 -0
  743. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js.map +1 -0
  744. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js +108 -0
  745. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js.map +1 -0
  746. package/build/dist/UI/Components/CodeEditor/YamlEditor.js +14 -186
  747. package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -1
  748. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
  749. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
  750. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +5 -14
  751. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -1
  752. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +14 -13
  753. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  754. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +1 -1
  755. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  756. package/build/dist/UI/Components/Forms/Fields/FormField.js +8 -3
  757. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  758. package/build/dist/UI/Components/Icon/Icon.js +8 -0
  759. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  760. package/build/dist/UI/Components/Input/Input.js +11 -3
  761. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  762. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +2 -1
  763. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  764. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +14 -4
  765. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  766. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  767. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  768. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +710 -65
  769. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  770. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js +238 -0
  771. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js.map +1 -0
  772. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js +1028 -0
  773. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js.map +1 -0
  774. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js +1088 -0
  775. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js.map +1 -0
  776. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +70 -10
  777. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  778. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js +887 -0
  779. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js.map +1 -0
  780. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +57 -6
  781. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  782. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +7 -5
  783. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
  784. package/build/dist/UI/Components/Table/EmptyTableMessage.js +51 -0
  785. package/build/dist/UI/Components/Table/EmptyTableMessage.js.map +1 -0
  786. package/build/dist/UI/Components/Table/Table.js +30 -11
  787. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  788. package/build/dist/UI/Components/Table/TableRow.js +9 -2
  789. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  790. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +63 -1
  791. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -1
  792. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +4 -2
  793. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  794. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +91 -10
  795. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
  796. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -4
  797. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  798. package/build/dist/UI/Components/TextArea/TextArea.js +9 -3
  799. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  800. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js +1 -2
  801. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js.map +1 -1
  802. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  803. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  804. package/build/dist/Utils/Markdown/UntrustedMarkdown.js +988 -0
  805. package/build/dist/Utils/Markdown/UntrustedMarkdown.js.map +1 -0
  806. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js +34 -0
  807. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js.map +1 -0
  808. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js +148 -0
  809. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js.map +1 -0
  810. package/build/dist/Utils/Telemetry/EntityKey.js +36 -0
  811. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  812. package/package.json +1 -3
  813. package/Server/Utils/CommunityEditionSsoReport.ts +0 -361
  814. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +0 -616
  815. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +0 -217
  816. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +0 -271
  817. package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +0 -215
  818. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +0 -784
  819. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +0 -518
  820. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +0 -419
  821. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +0 -769
  822. package/Tests/UI/Components/CodeEditor.test.tsx +0 -638
  823. package/Tests/UI/Components/MonacoLoader.test.ts +0 -67
  824. package/Tests/UI/Components/MonacoRuntime.test.ts +0 -121
  825. package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +0 -329
  826. package/Tests/UI/Components/YamlEditor.test.tsx +0 -847
  827. package/UI/Components/CodeEditor/MonacoLoader.ts +0 -36
  828. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -319
  829. package/UI/Components/Telemetry/TelemetryRetentionConfigSummary.tsx +0 -223
  830. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +0 -223
  831. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +0 -1
  832. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +0 -34
  833. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +0 -1
  834. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +0 -171
  835. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +0 -1
  836. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js +0 -119
  837. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js.map +0 -1
@@ -0,0 +1,958 @@
1
+ import Entities from "../../../Models/DatabaseModels/Index";
2
+ import IncidentForm from "../../../Models/DatabaseModels/IncidentForm";
3
+ import IncidentFormSubmission from "../../../Models/DatabaseModels/IncidentFormSubmission";
4
+ import PostgresAppInstance from "../../../Server/Infrastructure/PostgresDatabase";
5
+ import IncidentCustomFieldService from "../../../Server/Services/IncidentCustomFieldService";
6
+ import IncidentFormService from "../../../Server/Services/IncidentFormService";
7
+ import IncidentFormSubmissionService from "../../../Server/Services/IncidentFormSubmissionService";
8
+ import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
9
+ import BadDataException from "../../../Types/Exception/BadDataException";
10
+ import Email from "../../../Types/Email";
11
+ import { IncidentFormFieldSetting } from "../../../Types/Incident/IncidentFormPublic";
12
+ import ObjectID from "../../../Types/ObjectID";
13
+ import Permission, {
14
+ UserTenantAccessPermission,
15
+ } from "../../../Types/Permission";
16
+ import UserType from "../../../Types/UserType";
17
+ import {
18
+ afterAll,
19
+ beforeAll,
20
+ beforeEach,
21
+ describe,
22
+ expect,
23
+ jest,
24
+ test,
25
+ } from "@jest/globals";
26
+ import { DataSource } from "typeorm";
27
+
28
+ /*
29
+ * Opt in with RUN_POSTGRES_INCIDENT_FORM_TESTS=true against a database the
30
+ * registered migrations have been applied to, e.g.
31
+ *
32
+ * RUN_POSTGRES_INCIDENT_FORM_TESTS=true \
33
+ * INCIDENT_FORM_TEST_DATABASE_HOST=127.0.0.1 \
34
+ * INCIDENT_FORM_TEST_DATABASE_PORT=5400 \
35
+ * DATABASE_PASSWORD=... npx jest Tests/Server/Services/IncidentFormPostgres.test.ts
36
+ *
37
+ * CI runs it in .github/workflows/postgres-schema-drift.yaml ("Test incident
38
+ * forms on migrated Postgres"), right after that job has applied every
39
+ * registered migration to an empty database. The Common test job's Postgres
40
+ * is not migrated, so the suite is skipped there.
41
+ *
42
+ * Two halves:
43
+ *
44
+ * - the migrated public tables are inspected as they are: every foreign
45
+ * key's ON DELETE rule, the link key's unique constraint, and the columns
46
+ * a fake QueryRunner cannot prove are what Postgres ended up with;
47
+ * - behaviour runs in a uniquely named schema holding structure-only clones
48
+ * of the tables involved. The clones carry the migrated indexes and
49
+ * constraints (LIKE ... INCLUDING ALL), and the two new tables' foreign
50
+ * keys are copied from the migrated definitions, so a cascade observed
51
+ * here is the cascade the migration declared. No row is ever written
52
+ * outside that schema, and the schema is dropped afterwards.
53
+ *
54
+ * The production IncidentFormService and IncidentFormSubmissionService run
55
+ * against the clones; only realtime and workflow triggers are stubbed.
56
+ * Privacy clauses reference the owner and team tables, which are not
57
+ * cloned: they resolve to the migrated public tables through the search
58
+ * path, where a member with a freshly generated id owns nothing.
59
+ */
60
+ // describe.skip's type is the one both branches share.
61
+ const describePostgres: typeof describe.skip =
62
+ process.env["RUN_POSTGRES_INCIDENT_FORM_TESTS"] === "true"
63
+ ? describe
64
+ : describe.skip;
65
+
66
+ const TABLES: Array<string> = [
67
+ "Project",
68
+ "User",
69
+ "IncidentSeverity",
70
+ "IncidentTemplate",
71
+ "Incident",
72
+ "IncidentCustomField",
73
+ "IncidentForm",
74
+ "IncidentFormSubmission",
75
+ ];
76
+
77
+ const NEW_TABLES: Array<string> = ["IncidentForm", "IncidentFormSubmission"];
78
+
79
+ interface ForeignKeyRow {
80
+ table: string;
81
+ name: string;
82
+ column: string;
83
+ referencedTable: string;
84
+ onDelete: string;
85
+ definition: string;
86
+ }
87
+
88
+ describePostgres("Incident forms against a migrated Postgres", () => {
89
+ const schema: string = `incident_form_${ObjectID.generate()
90
+ .toString()
91
+ .replace(/-/g, "")}`;
92
+
93
+ const projectId: ObjectID = ObjectID.generate();
94
+ const otherProjectId: ObjectID = ObjectID.generate();
95
+
96
+ let database: DataSource;
97
+ let migratedForeignKeys: Array<ForeignKeyRow> = [];
98
+
99
+ beforeAll(async () => {
100
+ database = new DataSource({
101
+ type: "postgres",
102
+ host: process.env["INCIDENT_FORM_TEST_DATABASE_HOST"] || "localhost",
103
+ port: Number(process.env["INCIDENT_FORM_TEST_DATABASE_PORT"] || "5400"),
104
+ username: process.env["DATABASE_USERNAME"] || "postgres",
105
+ password: process.env["DATABASE_PASSWORD"] || "password",
106
+ database:
107
+ process.env["INCIDENT_FORM_TEST_DATABASE_NAME"] ||
108
+ process.env["DATABASE_NAME"] ||
109
+ "oneuptimedb",
110
+ entities: Entities,
111
+ schema,
112
+ synchronize: false,
113
+ extra: { options: `-c search_path=${schema},public` },
114
+ });
115
+ await database.initialize();
116
+
117
+ /*
118
+ * Read the migrated foreign keys before the clones exist, so their
119
+ * definitions name the referenced tables without a schema.
120
+ */
121
+ migratedForeignKeys = await database.query(
122
+ `SELECT t.relname AS "table",
123
+ c.conname AS "name",
124
+ a.attname AS "column",
125
+ r.relname AS "referencedTable",
126
+ c.confdeltype AS "onDelete",
127
+ pg_get_constraintdef(c.oid) AS "definition"
128
+ FROM pg_constraint c
129
+ JOIN pg_class t ON t.oid = c.conrelid
130
+ JOIN pg_namespace n ON n.oid = t.relnamespace
131
+ JOIN pg_class r ON r.oid = c.confrelid
132
+ JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = c.conkey[1]
133
+ WHERE n.nspname = 'public' AND t.relname = ANY($1) AND c.contype = 'f'
134
+ ORDER BY t.relname, a.attname`,
135
+ [NEW_TABLES],
136
+ );
137
+
138
+ await database.query(`CREATE SCHEMA "${schema}"`);
139
+
140
+ for (const table of TABLES) {
141
+ await database.query(
142
+ `CREATE TABLE "${schema}"."${table}" (LIKE public."${table}" INCLUDING ALL)`,
143
+ );
144
+ }
145
+
146
+ for (const foreignKey of migratedForeignKeys) {
147
+ const definition: string = foreignKey.definition.replace(
148
+ /REFERENCES public\./g,
149
+ "REFERENCES ",
150
+ );
151
+ await database.query(
152
+ `ALTER TABLE "${schema}"."${foreignKey.table}" ADD CONSTRAINT "${foreignKey.name}" ${definition}`,
153
+ );
154
+ }
155
+
156
+ const currentSchema: Array<{ current_schema: string }> =
157
+ await database.query("SELECT current_schema()");
158
+ expect(currentSchema[0]?.current_schema).toBe(schema);
159
+
160
+ jest.spyOn(PostgresAppInstance, "isConnected").mockReturnValue(true);
161
+ jest.spyOn(PostgresAppInstance, "getDataSource").mockReturnValue(database);
162
+
163
+ for (const service of [
164
+ IncidentFormService,
165
+ IncidentFormSubmissionService,
166
+ IncidentCustomFieldService,
167
+ ] as Array<{
168
+ onTriggerRealtime: unknown;
169
+ onTriggerWorkflow: unknown;
170
+ }>) {
171
+ jest
172
+ .spyOn(service as never, "onTriggerRealtime" as never)
173
+ .mockResolvedValue(undefined as never);
174
+ jest
175
+ .spyOn(service as never, "onTriggerWorkflow" as never)
176
+ .mockResolvedValue(undefined as never);
177
+ }
178
+ });
179
+
180
+ beforeEach(async () => {
181
+ await database.query(
182
+ TABLES.map((table: string): string => {
183
+ return `DELETE FROM "${schema}"."${table}"`;
184
+ })
185
+ .reverse()
186
+ .join("; "),
187
+ );
188
+ await seedProject(projectId);
189
+ await seedProject(otherProjectId);
190
+ });
191
+
192
+ afterAll(async () => {
193
+ jest.restoreAllMocks();
194
+ if (database?.isInitialized) {
195
+ await database.query(`DROP SCHEMA IF EXISTS "${schema}" CASCADE`);
196
+ await database.destroy();
197
+ }
198
+ });
199
+
200
+ async function seedProject(id: ObjectID): Promise<void> {
201
+ await database.query(
202
+ `INSERT INTO "${schema}"."Project" ("_id", "name", "slug", "version")
203
+ VALUES ($1, 'Incident form test', $2, 1)`,
204
+ [id.toString(), `incident-form-${id.toString()}`],
205
+ );
206
+ }
207
+
208
+ async function seedSeverity(
209
+ project: ObjectID = projectId,
210
+ ): Promise<ObjectID> {
211
+ const id: ObjectID = ObjectID.generate();
212
+ await database.query(
213
+ `INSERT INTO "${schema}"."IncidentSeverity" ("_id", "projectId", "name", "slug", "color", "order", "version")
214
+ VALUES ($1, $2, 'High', $3, '#ff0000', 1, 1)`,
215
+ [id.toString(), project.toString(), `severity-${id.toString()}`],
216
+ );
217
+ return id;
218
+ }
219
+
220
+ async function seedTemplate(
221
+ project: ObjectID = projectId,
222
+ ): Promise<ObjectID> {
223
+ const id: ObjectID = ObjectID.generate();
224
+ await database.query(
225
+ `INSERT INTO "${schema}"."IncidentTemplate" ("_id", "projectId", "title", "templateName", "templateDescription", "slug", "version")
226
+ VALUES ($1, $2, 'Possible data breach', 'Data breach', 'For security reports', $3, 1)`,
227
+ [id.toString(), project.toString(), `template-${id.toString()}`],
228
+ );
229
+ return id;
230
+ }
231
+
232
+ async function seedIncident(
233
+ options: { isPrivate?: boolean } = {},
234
+ ): Promise<ObjectID> {
235
+ const id: ObjectID = ObjectID.generate();
236
+ await database.query(
237
+ `INSERT INTO "${schema}"."Incident"
238
+ ("_id", "projectId", "title", "slug", "currentIncidentStateId", "incidentSeverityId", "isPrivate", "version")
239
+ VALUES ($1, $2, 'Checkout is failing', $3, $4, $5, $6, 1)`,
240
+ [
241
+ id.toString(),
242
+ projectId.toString(),
243
+ `incident-${id.toString()}`,
244
+ ObjectID.generate().toString(),
245
+ ObjectID.generate().toString(),
246
+ Boolean(options.isPrivate),
247
+ ],
248
+ );
249
+ return id;
250
+ }
251
+
252
+ async function createForm(
253
+ data: Partial<IncidentForm> = {},
254
+ ): Promise<IncidentForm> {
255
+ const form: IncidentForm = new IncidentForm();
256
+ form.projectId = projectId;
257
+ form.name = `Report ${ObjectID.generate().toString()}`;
258
+ form.incidentSeverityId = await seedSeverity();
259
+ Object.assign(form, data);
260
+
261
+ return IncidentFormService.create({
262
+ data: form,
263
+ props: { isRoot: true },
264
+ });
265
+ }
266
+
267
+ async function storedForm(id: ObjectID): Promise<Record<string, unknown>> {
268
+ const rows: Array<Record<string, unknown>> = await database.query(
269
+ `SELECT * FROM "${schema}"."IncidentForm" WHERE "_id" = $1`,
270
+ [id.toString()],
271
+ );
272
+
273
+ expect(rows).toHaveLength(1);
274
+
275
+ return rows[0]!;
276
+ }
277
+
278
+ async function createSubmission(
279
+ formId: ObjectID,
280
+ data: Partial<IncidentFormSubmission> = {},
281
+ ): Promise<IncidentFormSubmission> {
282
+ const submission: IncidentFormSubmission = new IncidentFormSubmission();
283
+ submission.projectId = projectId;
284
+ submission.incidentFormId = formId;
285
+ Object.assign(submission, data);
286
+
287
+ return IncidentFormSubmissionService.create({
288
+ data: submission,
289
+ props: { isRoot: true },
290
+ });
291
+ }
292
+
293
+ async function submissionRows(): Promise<
294
+ Array<{ _id: string; incidentId: string | null }>
295
+ > {
296
+ return database.query(
297
+ `SELECT "_id", "incidentId" FROM "${schema}"."IncidentFormSubmission" ORDER BY "createdAt"`,
298
+ );
299
+ }
300
+
301
+ async function sqlState(run: () => Promise<unknown>): Promise<string> {
302
+ try {
303
+ await run();
304
+ } catch (error) {
305
+ return String(
306
+ (error as { code?: string; driverError?: { code?: string } }).code ||
307
+ (error as { driverError?: { code?: string } }).driverError?.code,
308
+ );
309
+ }
310
+ return "no error";
311
+ }
312
+
313
+ // A member of the test project with one role, who owns nothing.
314
+ function memberProps(permission: Permission): DatabaseCommonInteractionProps {
315
+ const tenantPermission: UserTenantAccessPermission = {
316
+ projectId: projectId,
317
+ _type: "UserTenantAccessPermission",
318
+ permissions: [
319
+ {
320
+ _type: "UserPermission",
321
+ permission: permission,
322
+ labelIds: [],
323
+ isBlockPermission: false,
324
+ },
325
+ ],
326
+ };
327
+
328
+ return {
329
+ tenantId: projectId,
330
+ userId: ObjectID.generate(),
331
+ userType: UserType.User,
332
+ userTenantAccessPermission: {
333
+ [projectId.toString()]: tenantPermission,
334
+ },
335
+ };
336
+ }
337
+
338
+ // An incident viewer of the test project, who owns nothing.
339
+ function viewerProps(): DatabaseCommonInteractionProps {
340
+ return memberProps(Permission.IncidentViewer);
341
+ }
342
+
343
+ describe("the migrated tables", () => {
344
+ test("a form goes with its project and outlives its severity, template and users", () => {
345
+ expect(
346
+ migratedForeignKeys
347
+ .filter((foreignKey: ForeignKeyRow): boolean => {
348
+ return foreignKey.table === "IncidentForm";
349
+ })
350
+ .map((foreignKey: ForeignKeyRow): Array<string> => {
351
+ return [
352
+ foreignKey.column,
353
+ foreignKey.referencedTable,
354
+ foreignKey.onDelete,
355
+ ];
356
+ }),
357
+ ).toEqual([
358
+ // confdeltype: c = CASCADE, n = SET NULL
359
+ ["createdByUserId", "User", "n"],
360
+ ["deletedByUserId", "User", "n"],
361
+ ["incidentSeverityId", "IncidentSeverity", "n"],
362
+ ["incidentTemplateId", "IncidentTemplate", "n"],
363
+ ["projectId", "Project", "c"],
364
+ ]);
365
+ });
366
+
367
+ test("a submission goes with its project and its form, and outlives its incident", () => {
368
+ expect(
369
+ migratedForeignKeys
370
+ .filter((foreignKey: ForeignKeyRow): boolean => {
371
+ return foreignKey.table === "IncidentFormSubmission";
372
+ })
373
+ .map((foreignKey: ForeignKeyRow): Array<string> => {
374
+ return [
375
+ foreignKey.column,
376
+ foreignKey.referencedTable,
377
+ foreignKey.onDelete,
378
+ ];
379
+ }),
380
+ ).toEqual([
381
+ ["incidentFormId", "IncidentForm", "c"],
382
+ ["incidentId", "Incident", "n"],
383
+ ["projectId", "Project", "c"],
384
+ ]);
385
+ });
386
+
387
+ test("the link key is unique and never null", async () => {
388
+ const constraints: Array<{ definition: string }> = await database.query(
389
+ `SELECT pg_get_constraintdef(c.oid) AS "definition"
390
+ FROM pg_constraint c
391
+ JOIN pg_class t ON t.oid = c.conrelid
392
+ JOIN pg_namespace n ON n.oid = t.relnamespace
393
+ WHERE n.nspname = 'public' AND t.relname = 'IncidentForm' AND c.contype = 'u'`,
394
+ );
395
+
396
+ expect(constraints).toEqual([{ definition: 'UNIQUE ("shareKey")' }]);
397
+
398
+ const columns: Array<{ is_nullable: string; data_type: string }> =
399
+ await database.query(
400
+ `SELECT is_nullable, data_type FROM information_schema.columns
401
+ WHERE table_schema = 'public' AND table_name = 'IncidentForm' AND column_name = 'shareKey'`,
402
+ );
403
+
404
+ expect(columns).toEqual([{ is_nullable: "NO", data_type: "uuid" }]);
405
+ });
406
+
407
+ test("the columns start where the models say they do", async () => {
408
+ const rows: Array<{
409
+ column_name: string;
410
+ is_nullable: string;
411
+ column_default: string | null;
412
+ }> = await database.query(
413
+ `SELECT column_name, is_nullable, column_default FROM information_schema.columns
414
+ WHERE table_schema = 'public' AND table_name = 'IncidentForm'
415
+ AND column_name IN ('isEnabled', 'allowReporterToChooseSeverity', 'isReporterDetailsRequired', 'descriptionSetting', 'incidentSeverityId', 'incidentTemplateId', 'customFieldSettings')
416
+ ORDER BY column_name`,
417
+ );
418
+
419
+ expect(rows).toEqual([
420
+ {
421
+ column_name: "allowReporterToChooseSeverity",
422
+ is_nullable: "NO",
423
+ column_default: "false",
424
+ },
425
+ {
426
+ column_name: "customFieldSettings",
427
+ is_nullable: "YES",
428
+ column_default: null,
429
+ },
430
+ {
431
+ column_name: "descriptionSetting",
432
+ is_nullable: "NO",
433
+ column_default: "'Optional'::character varying",
434
+ },
435
+ {
436
+ column_name: "incidentSeverityId",
437
+ is_nullable: "YES",
438
+ column_default: null,
439
+ },
440
+ {
441
+ column_name: "incidentTemplateId",
442
+ is_nullable: "YES",
443
+ column_default: null,
444
+ },
445
+ {
446
+ column_name: "isEnabled",
447
+ is_nullable: "NO",
448
+ column_default: "true",
449
+ },
450
+ {
451
+ column_name: "isReporterDetailsRequired",
452
+ is_nullable: "NO",
453
+ column_default: "true",
454
+ },
455
+ ]);
456
+ });
457
+
458
+ test("every existing template gets a nullable settings column with no default", async () => {
459
+ const rows: Array<{
460
+ data_type: string;
461
+ is_nullable: string;
462
+ column_default: string | null;
463
+ }> = await database.query(
464
+ `SELECT data_type, is_nullable, column_default FROM information_schema.columns
465
+ WHERE table_schema = 'public' AND table_name = 'IncidentTemplate' AND column_name = 'customFieldSettings'`,
466
+ );
467
+
468
+ expect(rows).toEqual([
469
+ { data_type: "jsonb", is_nullable: "YES", column_default: null },
470
+ ]);
471
+ });
472
+ });
473
+
474
+ describe("forms", () => {
475
+ test("a form is given its own link key, keeps its questions exactly as sent and starts with the column defaults", async () => {
476
+ const clientKey: ObjectID = ObjectID.generate();
477
+ const templateId: ObjectID = await seedTemplate();
478
+
479
+ const created: IncidentForm = await createForm({
480
+ shareKey: clientKey,
481
+ incidentTemplateId: templateId,
482
+ customFieldSettings: {
483
+ impact: "Required",
484
+ affected_location: "Optional",
485
+ customer: "Default",
486
+ },
487
+ });
488
+
489
+ const row: Record<string, unknown> = await storedForm(created.id!);
490
+
491
+ expect(ObjectID.isValidUUID(String(row["shareKey"]))).toBe(true);
492
+ expect(row["shareKey"]).not.toBe(clientKey.toString());
493
+ expect(row["customFieldSettings"]).toEqual({
494
+ impact: "Required",
495
+ affected_location: "Optional",
496
+ customer: "Default",
497
+ });
498
+ expect(row["incidentTemplateId"]).toBe(templateId.toString());
499
+ expect(row["isEnabled"]).toBe(true);
500
+ expect(row["allowReporterToChooseSeverity"]).toBe(false);
501
+ expect(row["isReporterDetailsRequired"]).toBe(true);
502
+ expect(row["descriptionSetting"]).toBe(IncidentFormFieldSetting.Optional);
503
+
504
+ // Read back through the model, the key is an ObjectID again.
505
+ const read: IncidentForm | null = await IncidentFormService.findOneById({
506
+ id: created.id!,
507
+ select: { shareKey: true, customFieldSettings: true },
508
+ props: { isRoot: true },
509
+ });
510
+
511
+ expect(read?.shareKey).toBeInstanceOf(ObjectID);
512
+ expect(read?.shareKey?.toString()).toBe(row["shareKey"]);
513
+ });
514
+
515
+ test("no two forms share a key, and a key another form holds cannot be taken", async () => {
516
+ const first: IncidentForm = await createForm();
517
+ const second: IncidentForm = await createForm();
518
+
519
+ const firstKey: string = String(
520
+ (await storedForm(first.id!))["shareKey"],
521
+ );
522
+ const secondKey: string = String(
523
+ (await storedForm(second.id!))["shareKey"],
524
+ );
525
+
526
+ expect(firstKey).not.toBe(secondKey);
527
+
528
+ await expect(
529
+ IncidentFormService.updateOneById({
530
+ id: second.id!,
531
+ data: { shareKey: new ObjectID(firstKey) },
532
+ props: { isRoot: true },
533
+ }),
534
+ ).rejects.toBeDefined();
535
+
536
+ expect((await storedForm(second.id!))["shareKey"]).toBe(secondKey);
537
+
538
+ // And the database itself refuses a duplicate, whatever writes it.
539
+ expect(
540
+ await sqlState(() => {
541
+ return database.query(
542
+ `UPDATE "${schema}"."IncidentForm" SET "shareKey" = $1 WHERE "_id" = $2`,
543
+ [firstKey, second.id!.toString()],
544
+ );
545
+ }),
546
+ ).toBe("23505");
547
+ });
548
+
549
+ test("resetting the link stores the new key, and the old one no longer finds the form", async () => {
550
+ const form: IncidentForm = await createForm();
551
+ const oldKey: string = String((await storedForm(form.id!))["shareKey"]);
552
+ const newKey: ObjectID = ObjectID.generate();
553
+
554
+ await IncidentFormService.updateOneById({
555
+ id: form.id!,
556
+ data: { shareKey: newKey },
557
+ props: { isRoot: true },
558
+ });
559
+
560
+ expect((await storedForm(form.id!))["shareKey"]).toBe(newKey.toString());
561
+ expect(
562
+ await IncidentFormService.findOneBy({
563
+ query: { shareKey: new ObjectID(oldKey) },
564
+ select: { _id: true },
565
+ props: { isRoot: true },
566
+ }),
567
+ ).toBeNull();
568
+ expect(
569
+ (
570
+ await IncidentFormService.findOneBy({
571
+ query: { shareKey: newKey },
572
+ select: { _id: true },
573
+ props: { isRoot: true },
574
+ })
575
+ )?.id?.toString(),
576
+ ).toBe(form.id!.toString());
577
+ });
578
+
579
+ test("a null key is refused by the database too", async () => {
580
+ const form: IncidentForm = await createForm();
581
+
582
+ expect(
583
+ await sqlState(() => {
584
+ return database.query(
585
+ `UPDATE "${schema}"."IncidentForm" SET "shareKey" = NULL WHERE "_id" = $1`,
586
+ [form.id!.toString()],
587
+ );
588
+ }),
589
+ ).toBe("23502");
590
+ });
591
+
592
+ test("a severity or template from another project is refused", async () => {
593
+ const foreignSeverityId: ObjectID = await seedSeverity(otherProjectId);
594
+ const foreignTemplateId: ObjectID = await seedTemplate(otherProjectId);
595
+
596
+ await expect(
597
+ createForm({ incidentSeverityId: foreignSeverityId }),
598
+ ).rejects.toBeInstanceOf(BadDataException);
599
+ await expect(
600
+ createForm({ incidentTemplateId: foreignTemplateId }),
601
+ ).rejects.toBeInstanceOf(BadDataException);
602
+
603
+ const rows: Array<{ count: string }> = await database.query(
604
+ `SELECT count(*)::text AS "count" FROM "${schema}"."IncidentForm"`,
605
+ );
606
+ expect(rows[0]!.count).toBe("0");
607
+ });
608
+
609
+ test("deleting its severity clears it, and the form stays", async () => {
610
+ const form: IncidentForm = await createForm();
611
+ const severityId: string = String(
612
+ (await storedForm(form.id!))["incidentSeverityId"],
613
+ );
614
+
615
+ await database.query(
616
+ `DELETE FROM "${schema}"."IncidentSeverity" WHERE "_id" = $1`,
617
+ [severityId],
618
+ );
619
+
620
+ expect((await storedForm(form.id!))["incidentSeverityId"]).toBeNull();
621
+ });
622
+
623
+ test("deleting its template clears it, and the form stays", async () => {
624
+ const templateId: ObjectID = await seedTemplate();
625
+ const form: IncidentForm = await createForm({
626
+ incidentTemplateId: templateId,
627
+ });
628
+
629
+ await database.query(
630
+ `DELETE FROM "${schema}"."IncidentTemplate" WHERE "_id" = $1`,
631
+ [templateId.toString()],
632
+ );
633
+
634
+ expect((await storedForm(form.id!))["incidentTemplateId"]).toBeNull();
635
+ });
636
+ });
637
+
638
+ /*
639
+ * A form asks custom fields by template key, and a field created again
640
+ * gets its old key back. Deleting a field must take it off the forms, or
641
+ * the new field would appear on every public form that asked the old one.
642
+ */
643
+ describe("deleting a custom field", () => {
644
+ async function seedField(data: {
645
+ name: string;
646
+ variableKey: string;
647
+ customFieldType?: string;
648
+ dropdownOptions?: string;
649
+ }): Promise<ObjectID> {
650
+ const id: ObjectID = ObjectID.generate();
651
+ await database.query(
652
+ `INSERT INTO "${schema}"."IncidentCustomField"
653
+ ("_id", "projectId", "name", "customFieldType", "dropdownOptions", "variableKey", "sortOrder", "version")
654
+ VALUES ($1, $2, $3, $4, $5, $6, 1, 1)`,
655
+ [
656
+ id.toString(),
657
+ projectId.toString(),
658
+ data.name,
659
+ data.customFieldType || "Text",
660
+ data.dropdownOptions || null,
661
+ data.variableKey,
662
+ ],
663
+ );
664
+ return id;
665
+ }
666
+
667
+ async function storedSettings(
668
+ table: string,
669
+ id: ObjectID,
670
+ ): Promise<{
671
+ customFieldSettings: unknown;
672
+ version: number;
673
+ updatedAt: Date;
674
+ }> {
675
+ const rows: Array<{
676
+ customFieldSettings: unknown;
677
+ version: number;
678
+ updatedAt: Date;
679
+ }> = await database.query(
680
+ `SELECT "customFieldSettings", "version", "updatedAt" FROM "${schema}"."${table}" WHERE "_id" = $1`,
681
+ [id.toString()],
682
+ );
683
+
684
+ return rows[0]!;
685
+ }
686
+
687
+ test("takes the field off every form of its project - not another project's, and no template - without touching the forms' version", async () => {
688
+ const customerId: ObjectID = await seedField({
689
+ name: "Customer",
690
+ variableKey: "customer",
691
+ });
692
+ await seedField({ name: "Impact", variableKey: "impact" });
693
+
694
+ const form: IncidentForm = await createForm({
695
+ customFieldSettings: { customer: "Optional", impact: "Required" },
696
+ });
697
+ const otherProjectsForm: IncidentForm = await createForm({
698
+ projectId: otherProjectId,
699
+ incidentSeverityId: await seedSeverity(otherProjectId),
700
+ customFieldSettings: { customer: "Required" },
701
+ });
702
+ const templateId: ObjectID = await seedTemplate();
703
+ await database.query(
704
+ `UPDATE "${schema}"."IncidentTemplate" SET "customFieldSettings" = $1::jsonb WHERE "_id" = $2`,
705
+ [JSON.stringify({ customer: "Required" }), templateId.toString()],
706
+ );
707
+
708
+ const before: { version: number; updatedAt: Date } = await storedSettings(
709
+ "IncidentForm",
710
+ form.id!,
711
+ );
712
+
713
+ const formWorkflow: ReturnType<typeof jest.fn> = jest.spyOn(
714
+ IncidentFormService,
715
+ "onTriggerWorkflow",
716
+ ) as unknown as ReturnType<typeof jest.fn>;
717
+ formWorkflow.mockClear();
718
+
719
+ await IncidentCustomFieldService.deleteOneById({
720
+ id: customerId,
721
+ props: { isRoot: true },
722
+ });
723
+
724
+ const after: {
725
+ customFieldSettings: unknown;
726
+ version: number;
727
+ updatedAt: Date;
728
+ } = await storedSettings("IncidentForm", form.id!);
729
+
730
+ expect(after.customFieldSettings).toEqual({ impact: "Required" });
731
+ expect(after.version).toBe(before.version);
732
+ expect(new Date(after.updatedAt).getTime()).toBe(
733
+ new Date(before.updatedAt).getTime(),
734
+ );
735
+ expect(formWorkflow).not.toHaveBeenCalled();
736
+
737
+ expect(
738
+ (await storedSettings("IncidentForm", otherProjectsForm.id!))
739
+ .customFieldSettings,
740
+ ).toEqual({ customer: "Required" });
741
+ expect(
742
+ (await storedSettings("IncidentTemplate", templateId))
743
+ .customFieldSettings,
744
+ ).toEqual({ customer: "Required" });
745
+
746
+ /*
747
+ * Created again, as a dropdown with options nobody meant to publish:
748
+ * it gets the old key back, and the form still does not ask it.
749
+ */
750
+ await seedField({
751
+ name: "Customer",
752
+ variableKey: "customer",
753
+ customFieldType: "Dropdown",
754
+ dropdownOptions: "Acme Corp (key account)\nGlobex (churn risk)",
755
+ });
756
+
757
+ expect(
758
+ (await storedSettings("IncidentForm", form.id!)).customFieldSettings,
759
+ ).toEqual({ impact: "Required" });
760
+ });
761
+ });
762
+
763
+ describe("submissions", () => {
764
+ test("the reporter's email is stored lowercased and read back as an Email", async () => {
765
+ const form: IncidentForm = await createForm();
766
+
767
+ const created: IncidentFormSubmission = await createSubmission(form.id!, {
768
+ reporterName: "Jane Doe",
769
+ reporterEmail: new Email("Jane.Doe@Example.COM"),
770
+ });
771
+
772
+ const read: IncidentFormSubmission | null =
773
+ await IncidentFormSubmissionService.findOneById({
774
+ id: created.id!,
775
+ select: { reporterName: true, reporterEmail: true },
776
+ props: { isRoot: true },
777
+ });
778
+
779
+ expect(read?.reporterName).toBe("Jane Doe");
780
+ expect(read?.reporterEmail).toBeInstanceOf(Email);
781
+ expect(read?.reporterEmail?.toString()).toBe("jane.doe@example.com");
782
+ });
783
+
784
+ test("deleting the incident keeps the submission, with no incident", async () => {
785
+ const form: IncidentForm = await createForm();
786
+ const incidentId: ObjectID = await seedIncident();
787
+ const submission: IncidentFormSubmission = await createSubmission(
788
+ form.id!,
789
+ { incidentId: incidentId },
790
+ );
791
+
792
+ await database.query(
793
+ `DELETE FROM "${schema}"."Incident" WHERE "_id" = $1`,
794
+ [incidentId.toString()],
795
+ );
796
+
797
+ expect(await submissionRows()).toEqual([
798
+ { _id: submission.id!.toString(), incidentId: null },
799
+ ]);
800
+ });
801
+
802
+ test("deleting the form deletes its submissions, and only its own", async () => {
803
+ const form: IncidentForm = await createForm();
804
+ const otherForm: IncidentForm = await createForm();
805
+ await createSubmission(form.id!);
806
+ await createSubmission(form.id!);
807
+ const kept: IncidentFormSubmission = await createSubmission(
808
+ otherForm.id!,
809
+ );
810
+
811
+ await IncidentFormService.deleteOneById({
812
+ id: form.id!,
813
+ props: { isRoot: true },
814
+ });
815
+
816
+ expect(
817
+ (await submissionRows()).map((row: { _id: string }): string => {
818
+ return row._id;
819
+ }),
820
+ ).toEqual([kept.id!.toString()]);
821
+ });
822
+
823
+ test("a viewer sees the submissions of incidents they can see - never of a private incident, nor of one that is gone", async () => {
824
+ const form: IncidentForm = await createForm();
825
+ const publicIncidentId: ObjectID = await seedIncident();
826
+ const privateIncidentId: ObjectID = await seedIncident({
827
+ isPrivate: true,
828
+ });
829
+
830
+ const ofPublic: IncidentFormSubmission = await createSubmission(
831
+ form.id!,
832
+ { incidentId: publicIncidentId },
833
+ );
834
+ await createSubmission(form.id!, { incidentId: privateIncidentId });
835
+ await createSubmission(form.id!);
836
+
837
+ const viewer: DatabaseCommonInteractionProps = viewerProps();
838
+
839
+ const visible: Array<IncidentFormSubmission> =
840
+ await IncidentFormSubmissionService.findBy({
841
+ query: { incidentFormId: form.id! },
842
+ select: { _id: true },
843
+ limit: 10,
844
+ skip: 0,
845
+ props: viewer,
846
+ });
847
+
848
+ expect(
849
+ visible.map((row: IncidentFormSubmission): string => {
850
+ return row._id!.toString();
851
+ }),
852
+ ).toEqual([ofPublic.id!.toString()]);
853
+
854
+ expect(
855
+ (
856
+ await IncidentFormSubmissionService.countBy({
857
+ query: { incidentFormId: form.id! },
858
+ props: viewer,
859
+ })
860
+ ).toNumber(),
861
+ ).toBe(1);
862
+
863
+ // Root, which bypasses privacy, sees all three.
864
+ expect(
865
+ await IncidentFormSubmissionService.findBy({
866
+ query: { incidentFormId: form.id! },
867
+ select: { _id: true },
868
+ limit: 10,
869
+ skip: 0,
870
+ props: { isRoot: true },
871
+ }),
872
+ ).toHaveLength(3);
873
+ });
874
+
875
+ /*
876
+ * Deleting an incident clears the submission's link (ON DELETE SET
877
+ * NULL), and nothing then records that the incident was private. The
878
+ * reporter of a private report must not become visible to the whole
879
+ * project at that moment: a submission with no incident is listed only
880
+ * for those who see every incident.
881
+ */
882
+ test("a deleted private incident's submission stays hidden from readers who could not see it", async () => {
883
+ const form: IncidentForm = await createForm();
884
+ const privateIncidentId: ObjectID = await seedIncident({
885
+ isPrivate: true,
886
+ });
887
+
888
+ const submission: IncidentFormSubmission = await createSubmission(
889
+ form.id!,
890
+ {
891
+ incidentId: privateIncidentId,
892
+ reporterName: "Alice",
893
+ reporterEmail: new Email("alice@corp.example"),
894
+ },
895
+ );
896
+
897
+ const readers: Array<DatabaseCommonInteractionProps> = [
898
+ memberProps(Permission.Viewer),
899
+ memberProps(Permission.ProjectMember),
900
+ memberProps(Permission.IncidentViewer),
901
+ memberProps(Permission.IncidentMember),
902
+ memberProps(Permission.IncidentAdmin),
903
+ memberProps(Permission.ReadIncidentFormSubmission),
904
+ ];
905
+
906
+ const listedFor: (
907
+ props: DatabaseCommonInteractionProps,
908
+ ) => Promise<Array<string>> = async (
909
+ props: DatabaseCommonInteractionProps,
910
+ ): Promise<Array<string>> => {
911
+ return (
912
+ await IncidentFormSubmissionService.findBy({
913
+ query: { incidentFormId: form.id! },
914
+ select: { _id: true, reporterName: true, reporterEmail: true },
915
+ limit: 10,
916
+ skip: 0,
917
+ props: props,
918
+ })
919
+ ).map((row: IncidentFormSubmission): string => {
920
+ return row._id!.toString();
921
+ });
922
+ };
923
+
924
+ for (const reader of readers) {
925
+ expect(await listedFor(reader)).toEqual([]);
926
+ }
927
+
928
+ await database.query(
929
+ `DELETE FROM "${schema}"."Incident" WHERE "_id" = $1`,
930
+ [privateIncidentId.toString()],
931
+ );
932
+
933
+ expect(await submissionRows()).toEqual([
934
+ { _id: submission.id!.toString(), incidentId: null },
935
+ ]);
936
+
937
+ for (const reader of readers) {
938
+ expect(await listedFor(reader)).toEqual([]);
939
+ expect(
940
+ (
941
+ await IncidentFormSubmissionService.countBy({
942
+ query: { incidentFormId: form.id! },
943
+ props: reader,
944
+ })
945
+ ).toNumber(),
946
+ ).toBe(0);
947
+ }
948
+
949
+ // Those who see every incident still see it.
950
+ expect(await listedFor(memberProps(Permission.ProjectAdmin))).toEqual([
951
+ submission.id!.toString(),
952
+ ]);
953
+ expect(await listedFor({ isRoot: true })).toEqual([
954
+ submission.id!.toString(),
955
+ ]);
956
+ });
957
+ });
958
+ });