@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
@@ -1,312 +1,687 @@
1
- import Editor from "@monaco-editor/react";
2
- import configureMonacoLoader from "./MonacoLoader";
3
- import CodeType from "../../../Types/Code/CodeType";
4
- import MarkdownUtil from "../../Utils/Markdown";
5
- import { Theme, useTheme } from "../../Utils/Theme";
6
- import React, { useEffect, useMemo, useRef, useState, } from "react";
7
- configureMonacoLoader();
1
+ import "./CodeEditor.css";
2
+ import { applyTextEdit, backspace, countLines, detectIndentUnit, getLineColumn, indent, indentLines, lineEndOf, lineStartOf, newLine, outdent, spacesIndent, toggleLineComment, typeCharacter, } from "./CodeEditorCommands";
3
+ import { escapeHtml, highlightCode } from "./CodeEditorHighlight";
4
+ import { getCodeLanguage } from "./CodeEditorLanguages";
5
+ import Icon from "../Icon/Icon";
6
+ import { checkJsonSyntax, describeJsonSyntaxError, findJsonSyntaxError, formatJson, } from "../../../Types/Code/JsonSyntax";
7
+ import { checkYamlSyntax, describeYamlSyntaxError, } from "../../../Types/Code/YamlSyntax";
8
+ import IconProp from "../../../Types/Icon/IconProp";
9
+ import React, { useEffect, useId, useLayoutEffect, useMemo, useRef, useState, } from "react";
8
10
  /*
9
- * Callers hand us `any` through Form's currentValues, so a non-string can
10
- * still reach a prop typed as string.
11
+ * These two have to match .ou-code-editor's --ou-code-line-height and
12
+ * --ou-code-padding-y in CodeEditor.css: the gutter's click target and the
13
+ * current-line band are placed with them.
11
14
  */
12
- function toEditorText(value) {
15
+ export const CODE_EDITOR_LINE_HEIGHT_PX = 20;
16
+ export const CODE_EDITOR_PADDING_Y_PX = 10;
17
+ export const CODE_EDITOR_PADDING_X_PX = 12;
18
+ // Columns a tab advances to, as `tab-size` in CodeEditor.css draws it.
19
+ const TAB_SIZE = 4;
20
+ // Characters in the hidden run the character width is measured from.
21
+ const MEASURE_LENGTH = 32;
22
+ export const CODE_EDITOR_DEFAULT_MIN_LINES = 5;
23
+ export const CODE_EDITOR_DEFAULT_MAX_HEIGHT = "min(60vh, 30rem)";
24
+ /** How long the document sits still before it is checked again. */
25
+ export const CODE_EDITOR_VALIDATION_DEBOUNCE_MS = 250;
26
+ const FALLBACK_INDENT = spacesIndent(2);
27
+ export const toEditorText = (value) => {
13
28
  if (value === undefined || value === null) {
14
29
  return "";
15
30
  }
16
31
  if (typeof value !== "string") {
17
32
  return JSON.stringify(value, null, 4);
18
33
  }
19
- return value;
20
- }
34
+ return value.replace(/\r\n?/g, "\n");
35
+ };
36
+ /*
37
+ * Through the prototype's setter, not `textarea.value =`: React watches the
38
+ * instance property to know what it last rendered, and a write through it
39
+ * would make the input event below look like no change at all.
40
+ */
41
+ const setNativeValue = (textarea, value) => {
42
+ const descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(textarea), "value");
43
+ if (descriptor === null || descriptor === void 0 ? void 0 : descriptor.set) {
44
+ descriptor.set.call(textarea, value);
45
+ }
46
+ else {
47
+ textarea.value = value;
48
+ }
49
+ };
50
+ /**
51
+ * Make `edit` in the textarea the way typing would, so it lands on the
52
+ * browser's own undo stack as one step. execCommand is deprecated but is
53
+ * still the only way to do that, in every browser; where it is missing
54
+ * (jsdom) or declines, the value is written directly and an input event
55
+ * fired, which keeps React in step at the cost of that one undo entry.
56
+ */
57
+ export const applyEditToTextarea = (textarea, edit) => {
58
+ const expected = applyTextEdit(textarea.value, edit);
59
+ if (edit.from !== edit.to || edit.insert !== "") {
60
+ textarea.setSelectionRange(edit.from, edit.to);
61
+ let applied = false;
62
+ try {
63
+ if (typeof document.execCommand === "function") {
64
+ applied =
65
+ edit.insert === ""
66
+ ? document.execCommand("delete", false)
67
+ : document.execCommand("insertText", false, edit.insert);
68
+ }
69
+ }
70
+ catch (_a) {
71
+ applied = false;
72
+ }
73
+ if (!applied || textarea.value !== expected) {
74
+ setNativeValue(textarea, expected);
75
+ textarea.dispatchEvent(new Event("input", { bubbles: true }));
76
+ }
77
+ }
78
+ textarea.setSelectionRange(edit.selectionStart, edit.selectionEnd);
79
+ };
80
+ /*
81
+ * The gutter is one run of text - "1\n2\n3..." - so a long document costs
82
+ * a handful of nodes, not one per line. Only the lines that look different
83
+ * (the current line, a line with a syntax error) are split out.
84
+ */
85
+ const buildGutter = (lineCount, marks) => {
86
+ const segments = [];
87
+ let buffer = "";
88
+ for (let line = 1; line <= lineCount; line++) {
89
+ const className = marks.get(line);
90
+ const separator = line < lineCount ? "\n" : "";
91
+ if (className) {
92
+ if (buffer) {
93
+ segments.push({ text: buffer });
94
+ }
95
+ segments.push({ text: String(line), className });
96
+ buffer = separator;
97
+ continue;
98
+ }
99
+ buffer += String(line) + separator;
100
+ }
101
+ if (buffer) {
102
+ segments.push({ text: buffer });
103
+ }
104
+ return segments;
105
+ };
106
+ const MODIFIER_KEYS = ["Shift", "Control", "Alt", "Meta"];
107
+ /*
108
+ * Heard on the way in, through aria-describedby: Tab indents here, so the way
109
+ * out has to be announced rather than discovered.
110
+ */
111
+ export const CODE_EDITOR_KEYS_HINT = "Tab inserts indentation. To move focus out of the editor, press Escape, then Tab.";
112
+ /*
113
+ * Light-theme values, one step darker than the obvious choice so the 12px
114
+ * status text clears 4.5:1 on bg-gray-50. Theme.css remaps these classes
115
+ * under html.dark.
116
+ */
117
+ const STATUS_TONE_CLASS = {
118
+ error: "text-red-700",
119
+ invalid: "text-amber-700",
120
+ valid: "text-green-700",
121
+ neutral: "text-gray-500",
122
+ };
123
+ const TOOLBAR_BUTTON_CLASS = "inline-flex shrink-0 items-center gap-1 rounded px-2 py-1 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-200 hover:text-gray-900 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500 disabled:cursor-not-allowed disabled:opacity-40";
124
+ /**
125
+ * A code editor for form fields: a native textarea over a highlighted copy
126
+ * of its text, with line numbers, auto-indentation, bracket pairing, a
127
+ * status bar that says whether JSON or YAML parses (and where it does not),
128
+ * and Format / Copy actions. It renders on the first paint, has no runtime
129
+ * to download, and edits with the browser's own caret, selection, undo and
130
+ * find - which is also what makes it work with a phone keyboard and a screen
131
+ * reader.
132
+ */
21
133
  const CodeEditor = (props) => {
22
- let className = "";
23
- const [placeholder, setPlaceholder] = useState("");
24
- const [helpText, setHelpText] = useState("");
25
- const editorRef = useRef(null);
26
- const theme = useTheme();
27
- /*
28
- * `value` is the controlled prop; `initialValue` only seeds an uncontrolled
29
- * editor. Both used to be synced from their own useEffect, and because
30
- * effects run in declaration order the `initialValue` one ran last on mount
31
- * and reset the state to "" - so a caller that passed only `value` mounted
32
- * an empty editor even though it had text to show. Seed the state on the
33
- * first render and keep the precedence in a single effect.
34
- */
35
- const [value, setValue] = useState(() => {
134
+ var _a;
135
+ const language = getCodeLanguage(props.type);
136
+ const readOnly = Boolean(props.readOnly);
137
+ const [text, setText] = useState(() => {
36
138
  var _a;
37
139
  return toEditorText((_a = props.value) !== null && _a !== void 0 ? _a : props.initialValue);
38
140
  });
141
+ // The latest text, for effects that must not re-run on every keystroke.
142
+ const textRef = useRef(text);
143
+ /*
144
+ * Checked on a timer, so a half-typed line is not judged the instant it is
145
+ * typed and a long document is not re-parsed on every keystroke.
146
+ */
147
+ const [checkedText, setCheckedText] = useState(text);
148
+ const [selection, setSelection] = useState({
149
+ start: 0,
150
+ end: 0,
151
+ active: 0,
152
+ });
153
+ const [isFocused, setIsFocused] = useState(false);
154
+ /*
155
+ * Tab indents, so it cannot also move focus - a keyboard trap unless there
156
+ * is a way out (WCAG 2.1.2). Escape releases the next Tab to the browser.
157
+ */
158
+ const [tabMovesFocus, setTabMovesFocus] = useState(false);
159
+ const tabMovesFocusRef = useRef(false);
160
+ const [copied, setCopied] = useState(false);
161
+ const copyResetTimer = useRef(null);
162
+ const textareaRef = useRef(null);
163
+ const scrollerRef = useRef(null);
164
+ const gutterRef = useRef(null);
165
+ const measureRef = useRef(null);
166
+ const instanceId = useId();
167
+ const keysHintId = `${instanceId}-code-keys`;
168
+ const statusId = `${instanceId}-code-status`;
169
+ const hintId = `${instanceId}-code-hint`;
170
+ /*
171
+ * `value` is the controlled prop; `initialValue` only seeds an editor that
172
+ * is not given one. Seeded on the first render above and kept in step in
173
+ * one effect: two effects, one per prop, ran in declaration order on mount
174
+ * and the `initialValue` one blanked an editor that was only given `value`.
175
+ */
39
176
  useEffect(() => {
40
- setValue(toEditorText(props.value === undefined ? props.initialValue : props.value));
177
+ const next = toEditorText(props.value === undefined ? props.initialValue : props.value);
178
+ if (next === textRef.current) {
179
+ return;
180
+ }
181
+ // Replaced from outside (a sample inserted, a record loaded): judge it now.
182
+ textRef.current = next;
183
+ setText(next);
184
+ setCheckedText(next);
41
185
  }, [props.value, props.initialValue]);
42
186
  useEffect(() => {
43
- if (props.placeholder) {
44
- if (props.type === CodeType.Markdown) {
45
- setHelpText(MarkdownUtil.getMarkdownCheatsheet(props.placeholder));
46
- }
47
- if (props.type === CodeType.HTML) {
48
- setHelpText(`${props.placeholder}. This is in HTML`);
49
- }
50
- if (props.type === CodeType.JavaScript) {
51
- setPlaceholder(`/* ${props.placeholder}
52
-
53
-
54
- This is in JavaScript.
55
-
56
- */`);
57
- }
58
- if (props.type === CodeType.JSON) {
59
- setHelpText(`${props.placeholder}`);
60
- }
61
- if (props.type === CodeType.CSS) {
62
- setPlaceholder(`/* ${props.placeholder}. This is in CSS. */`);
63
- }
64
- /*
65
- * Help text, never `setPlaceholder`: whatever setPlaceholder holds is
66
- * rendered into `defaultValue` below, i.e. it becomes real document
67
- * text. The JS and CSS arms above get away with it because they wrap
68
- * the hint in a comment; an unwrapped YAML hint would be content the
69
- * user can accidentally save, and the server would reject it.
70
- */
71
- if (props.type === CodeType.YAML) {
72
- setHelpText(`${props.placeholder}`);
187
+ if (!language.validator) {
188
+ return undefined;
189
+ }
190
+ const timer = setTimeout(() => {
191
+ setCheckedText(text);
192
+ }, CODE_EDITOR_VALIDATION_DEBOUNCE_MS);
193
+ return () => {
194
+ clearTimeout(timer);
195
+ };
196
+ }, [text, language.validator]);
197
+ useEffect(() => {
198
+ return () => {
199
+ if (copyResetTimer.current) {
200
+ clearTimeout(copyResetTimer.current);
73
201
  }
202
+ };
203
+ }, []);
204
+ const indentUnit = useMemo(() => {
205
+ return detectIndentUnit(text, FALLBACK_INDENT, language.allowTabs);
206
+ }, [text, language.allowTabs]);
207
+ const syntax = useMemo(() => {
208
+ if (language.validator === "json") {
209
+ return checkJsonSyntax(checkedText, { allowJSON5: props.allowJSON5 });
74
210
  }
75
- }, [props.placeholder, props.type]);
76
- if (!props.className) {
77
- className =
78
- "block w-full rounded-md border border-gray-300 bg-white py-2 pl-3 pr-3 text-sm placeholder-gray-500 focus:border-indigo-500 focus:text-gray-900 focus:placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-indigo-500 sm:text-sm";
79
- }
80
- else {
81
- className = props.className;
82
- }
83
- if (props.error) {
84
- className =
85
- "block w-full rounded-md border bg-white py-2 pl-3 pr-3 text-sm placeholder-gray-500 focus:border-red-500 focus:text-gray-900 focus:placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-red-500 sm:text-sm border-red-300 pr-10 text-red-900 placeholder-red-300 focus:border-red-500 focus:outline-none focus:ring-red-500";
86
- }
87
- const isYaml = props.type === CodeType.YAML;
211
+ if (language.validator === "yaml") {
212
+ return checkYamlSyntax(checkedText);
213
+ }
214
+ return null;
215
+ }, [checkedText, language.validator, props.allowJSON5]);
216
+ // Format rewrites only strict JSON, placeholders and all, never JSON5.
217
+ const canFormat = useMemo(() => {
218
+ return (language.canFormat &&
219
+ !readOnly &&
220
+ checkedText.trim() !== "" &&
221
+ findJsonSyntaxError(checkedText) === null);
222
+ }, [language.canFormat, readOnly, checkedText]);
223
+ const highlightedHtml = useMemo(() => {
224
+ return highlightCode(text, language.grammar, {
225
+ showTabs: language.showTabs,
226
+ });
227
+ }, [text, language.grammar, language.showTabs]);
228
+ const example = (props.example || "")
229
+ .replace(/^\s*\n/, "")
230
+ .replace(/\s+$/, "");
231
+ const ghostHtml = useMemo(() => {
232
+ if (text !== "") {
233
+ return null;
234
+ }
235
+ if (props.placeholder) {
236
+ return `<span class="ou-code-editor__placeholder">${escapeHtml(props.placeholder)}</span>`;
237
+ }
238
+ if (example) {
239
+ return `<span class="ou-code-editor__example">${highlightCode(example, language.grammar)}</span>`;
240
+ }
241
+ return null;
242
+ }, [text, props.placeholder, example, language.grammar]);
243
+ const lineCount = useMemo(() => {
244
+ return countLines(text);
245
+ }, [text]);
246
+ const cursor = getLineColumn(text, selection.active);
247
+ const selectedCharacters = Math.abs(selection.end - selection.start);
248
+ const errorLine = syntax &&
249
+ !syntax.isValid &&
250
+ syntax.line !== null &&
251
+ syntax.line <= lineCount
252
+ ? syntax.line
253
+ : null;
254
+ const showGutter = language.wrap
255
+ ? false
256
+ : props.showLineNumbers !== false;
257
+ const showActiveLine = isFocused && !readOnly && selectedCharacters === 0;
258
+ const gutterSegments = useMemo(() => {
259
+ const marks = new Map();
260
+ if (showActiveLine) {
261
+ marks.set(cursor.line, "ou-code-editor__gutter-active");
262
+ }
263
+ if (errorLine !== null) {
264
+ marks.set(errorLine, "ou-code-editor__gutter-error");
265
+ }
266
+ return buildGutter(lineCount, marks);
267
+ }, [lineCount, showActiveLine, cursor.line, errorLine]);
88
268
  /*
89
- * Monaco's real focusable control. The wrapper <div> this component returns
90
- * has no role, and ARIA forbids naming a role=generic element - so every
91
- * accessibility attribute has to land here instead.
269
+ * Keep the caret in view. The textarea never scrolls - it is exactly as
270
+ * big as its text - so the scroller around it has to, and browsers do not
271
+ * agree on doing that for a caret inside a textarea: Firefox leaves the
272
+ * end of the document off-screen after Ctrl+End, and Chromium parks a
273
+ * caret at column 1 underneath the sticky line numbers. Lines have a fixed
274
+ * height and the font is monospaced, so where the caret is is arithmetic.
275
+ * (Wrapped prose is left to the browser: a wrapped line has no fixed row.)
92
276
  */
93
- const getInputArea = (editor) => {
94
- var _a;
95
- const domNode = ((_a = editor === null || editor === void 0 ? void 0 : editor.getDomNode) === null || _a === void 0 ? void 0 : _a.call(editor)) || null;
96
- if (!domNode) {
97
- return null;
277
+ useLayoutEffect(() => {
278
+ var _a, _b;
279
+ const scroller = scrollerRef.current;
280
+ const textarea = textareaRef.current;
281
+ if (!isFocused || language.wrap || !scroller || !textarea) {
282
+ return;
283
+ }
284
+ const value = textarea.value;
285
+ const position = Math.min(selection.active, value.length);
286
+ const line = getLineColumn(value, position).line;
287
+ const top = CODE_EDITOR_PADDING_Y_PX + (line - 1) * CODE_EDITOR_LINE_HEIGHT_PX;
288
+ const bottom = top + CODE_EDITOR_LINE_HEIGHT_PX;
289
+ if (top < scroller.scrollTop) {
290
+ scroller.scrollTop = Math.max(0, top - CODE_EDITOR_PADDING_Y_PX);
291
+ }
292
+ else if (bottom > scroller.scrollTop + scroller.clientHeight) {
293
+ scroller.scrollTop =
294
+ bottom + CODE_EDITOR_PADDING_Y_PX - scroller.clientHeight;
295
+ }
296
+ const characterWidth = (((_a = measureRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().width) || 0) / MEASURE_LENGTH;
297
+ if (characterWidth <= 0) {
298
+ return;
98
299
  }
99
- return domNode.querySelector("textarea");
300
+ let columns = 0;
301
+ for (const character of value.slice(lineStartOf(value, position), position)) {
302
+ columns =
303
+ character === "\t"
304
+ ? columns + TAB_SIZE - (columns % TAB_SIZE)
305
+ : columns + 1;
306
+ }
307
+ const gutterWidth = ((_b = gutterRef.current) === null || _b === void 0 ? void 0 : _b.offsetWidth) || 0;
308
+ const margin = 2 * characterWidth;
309
+ const x = gutterWidth + CODE_EDITOR_PADDING_X_PX + columns * characterWidth;
310
+ if (x < scroller.scrollLeft + gutterWidth + CODE_EDITOR_PADDING_X_PX) {
311
+ scroller.scrollLeft = Math.max(0, x - gutterWidth - CODE_EDITOR_PADDING_X_PX - margin);
312
+ }
313
+ else if (x + margin > scroller.scrollLeft + scroller.clientWidth) {
314
+ scroller.scrollLeft = x + margin - scroller.clientWidth;
315
+ }
316
+ }, [selection, text, isFocused, language.wrap]);
317
+ const captureSelection = () => {
318
+ const textarea = textareaRef.current;
319
+ if (!textarea) {
320
+ return;
321
+ }
322
+ const start = textarea.selectionStart;
323
+ const end = textarea.selectionEnd;
324
+ const active = textarea.selectionDirection === "backward" ? start : end;
325
+ setSelection((previous) => {
326
+ if (previous.start === start &&
327
+ previous.end === end &&
328
+ previous.active === active) {
329
+ return previous;
330
+ }
331
+ return { start, end, active };
332
+ });
333
+ };
334
+ const setTabRelease = (value) => {
335
+ tabMovesFocusRef.current = value;
336
+ setTabMovesFocus(value);
100
337
  };
101
- const applyAria = (editor) => {
102
- const inputArea = getInputArea(editor);
103
- if (!inputArea) {
338
+ const runEdit = (edit) => {
339
+ const textarea = textareaRef.current;
340
+ if (!edit || !textarea) {
104
341
  return;
105
342
  }
106
- /*
107
- * aria-labelledby wins over the aria-label Monaco puts here itself
108
- * ("Editor content"), so the field's own label names the editor.
109
- */
110
- if (props.ariaLabelledby) {
111
- inputArea.setAttribute("aria-labelledby", props.ariaLabelledby);
343
+ applyEditToTextarea(textarea, edit);
344
+ captureSelection();
345
+ };
346
+ const readState = () => {
347
+ const textarea = textareaRef.current;
348
+ return {
349
+ text: textarea.value,
350
+ selectionStart: textarea.selectionStart,
351
+ selectionEnd: textarea.selectionEnd,
352
+ };
353
+ };
354
+ // Through the textarea, so Undo brings the previous document back.
355
+ const replaceDocument = (replacement) => {
356
+ const textarea = textareaRef.current;
357
+ if (!textarea || replacement === textarea.value) {
358
+ return;
112
359
  }
113
- else {
114
- inputArea.removeAttribute("aria-labelledby");
360
+ textarea.focus();
361
+ runEdit({
362
+ from: 0,
363
+ to: textarea.value.length,
364
+ insert: replacement,
365
+ selectionStart: 0,
366
+ selectionEnd: 0,
367
+ });
368
+ if (scrollerRef.current) {
369
+ scrollerRef.current.scrollTop = 0;
370
+ scrollerRef.current.scrollLeft = 0;
115
371
  }
116
- if (props.ariaDescribedby) {
117
- inputArea.setAttribute("aria-describedby", props.ariaDescribedby);
372
+ };
373
+ const handleFormat = () => {
374
+ var _a, _b;
375
+ const formatted = formatJson((_b = (_a = textareaRef.current) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : text, indentUnit.text);
376
+ if (formatted !== null) {
377
+ replaceDocument(formatted);
118
378
  }
119
- else {
120
- inputArea.removeAttribute("aria-describedby");
379
+ };
380
+ const handleCopy = () => {
381
+ var _a;
382
+ const textarea = textareaRef.current;
383
+ const content = (_a = textarea === null || textarea === void 0 ? void 0 : textarea.value) !== null && _a !== void 0 ? _a : text;
384
+ const clipboard = typeof navigator !== "undefined" ? navigator.clipboard : undefined;
385
+ if (clipboard && typeof clipboard.writeText === "function") {
386
+ void Promise.resolve(clipboard.writeText(content)).catch(() => {
387
+ /* A denied clipboard permission is not worth an error state. */
388
+ });
121
389
  }
122
- if (props.ariaInvalid) {
123
- inputArea.setAttribute("aria-invalid", "true");
390
+ else if (textarea && typeof document.execCommand === "function") {
391
+ // No async clipboard outside a secure context (plain-HTTP installs).
392
+ const { selectionStart, selectionEnd } = textarea;
393
+ textarea.focus();
394
+ textarea.select();
395
+ try {
396
+ document.execCommand("copy");
397
+ }
398
+ catch (_b) {
399
+ /* Nothing more to try. */
400
+ }
401
+ textarea.setSelectionRange(selectionStart, selectionEnd);
124
402
  }
125
403
  else {
126
- inputArea.removeAttribute("aria-invalid");
404
+ return;
127
405
  }
406
+ setCopied(true);
407
+ if (copyResetTimer.current) {
408
+ clearTimeout(copyResetTimer.current);
409
+ }
410
+ copyResetTimer.current = setTimeout(() => {
411
+ setCopied(false);
412
+ }, 2000);
128
413
  };
129
- /*
130
- * Per-model, not per-editor and emphatically not global: a literal tab is
131
- * illegal as YAML indentation, and Monaco's model defaults are four spaces
132
- * with indentation detected from the initial content - so a rule pasted in
133
- * tab-indented would keep emitting tabs the parser rejects.
134
- */
135
- const applyModelOptions = (editor) => {
136
- var _a;
137
- if (!isYaml) {
414
+ const handleKeyDown = (event) => {
415
+ // Leave composition (IME input) entirely to the browser.
416
+ if (event.nativeEvent.isComposing || event.keyCode === 229) {
138
417
  return;
139
418
  }
140
- const model = (_a = editor === null || editor === void 0 ? void 0 : editor.getModel) === null || _a === void 0 ? void 0 : _a.call(editor);
141
- if (!model || typeof model.updateOptions !== "function") {
419
+ const key = event.key;
420
+ const command = event.ctrlKey || event.metaKey;
421
+ if (key === "Escape") {
422
+ /*
423
+ * Only the first Escape is ours. A second one is left alone, so a
424
+ * dialog around the editor still closes on Escape, Escape.
425
+ */
426
+ if (!readOnly && !tabMovesFocusRef.current) {
427
+ event.preventDefault();
428
+ setTabRelease(true);
429
+ }
142
430
  return;
143
431
  }
144
- model.updateOptions({ tabSize: 2, insertSpaces: true });
145
- };
146
- /*
147
- * Markdown is prose, so it follows the caller's preference. YAML is code:
148
- * red squiggles under every key name in a Sigma rule are pure noise, so
149
- * spell check is off for it regardless of what the caller asked for.
150
- */
151
- const shouldSpellCheck = isYaml ? false : !props.disableSpellCheck;
152
- const managesSpellCheck = props.type === CodeType.Markdown || isYaml;
153
- const applySpellCheck = (editor) => {
154
- if (!editor || !managesSpellCheck) {
432
+ if (key === "Tab") {
433
+ if (readOnly || tabMovesFocusRef.current || command || event.altKey) {
434
+ return;
435
+ }
436
+ event.preventDefault();
437
+ runEdit(event.shiftKey
438
+ ? outdent(readState(), indentUnit)
439
+ : indent(readState(), indentUnit));
440
+ return;
441
+ }
442
+ if (!MODIFIER_KEYS.includes(key) && tabMovesFocusRef.current) {
443
+ setTabRelease(false);
444
+ }
445
+ if (readOnly) {
446
+ return;
447
+ }
448
+ if (key === "Enter" && !command && !event.altKey) {
449
+ event.preventDefault();
450
+ runEdit(newLine(readState(), indentUnit, language.rules));
451
+ return;
452
+ }
453
+ if (key === "Backspace" && !command && !event.altKey) {
454
+ const edit = backspace(readState(), indentUnit, language.rules);
455
+ if (edit) {
456
+ event.preventDefault();
457
+ runEdit(edit);
458
+ }
459
+ return;
460
+ }
461
+ if (command && !event.altKey && (key === "/" || event.code === "Slash")) {
462
+ const edit = toggleLineComment(readState(), language.rules);
463
+ if (edit) {
464
+ event.preventDefault();
465
+ runEdit(edit);
466
+ }
467
+ return;
468
+ }
469
+ if (command &&
470
+ !event.altKey &&
471
+ !event.shiftKey &&
472
+ (key === "]" || key === "[")) {
473
+ event.preventDefault();
474
+ runEdit(key === "]"
475
+ ? indentLines(readState(), indentUnit)
476
+ : outdent(readState(), indentUnit));
477
+ return;
478
+ }
479
+ // Shift+Alt+F, as in VS Code. By code: Alt changes the key on a Mac.
480
+ if (event.shiftKey && event.altKey && !command && event.code === "KeyF") {
481
+ if (canFormat) {
482
+ event.preventDefault();
483
+ handleFormat();
484
+ }
155
485
  return;
156
486
  }
157
- const domNode = editor.getDomNode();
158
- if (!domNode) {
487
+ /*
488
+ * A printable character. Ctrl+Alt is AltGr on Windows, which is how a
489
+ * German keyboard types a bracket, so only Ctrl or Cmd alone is a
490
+ * shortcut.
491
+ */
492
+ const isShortcut = event.metaKey || (event.ctrlKey && !event.altKey);
493
+ if (key.length === 1 && !isShortcut) {
494
+ const edit = typeCharacter(readState(), key, language.rules);
495
+ if (edit) {
496
+ event.preventDefault();
497
+ runEdit(edit);
498
+ }
499
+ }
500
+ };
501
+ // A click on a line number selects that line, as in every other editor.
502
+ const handleGutterMouseDown = (event) => {
503
+ const textarea = textareaRef.current;
504
+ if (!textarea || event.button !== 0) {
159
505
  return;
160
506
  }
161
- const textareaElement = domNode.querySelector("textarea");
162
- if (textareaElement) {
163
- textareaElement.spellcheck = shouldSpellCheck;
507
+ event.preventDefault();
508
+ const bounds = event.currentTarget.getBoundingClientRect();
509
+ const line = Math.min(lineCount, Math.max(1, Math.floor((event.clientY - bounds.top - CODE_EDITOR_PADDING_Y_PX) /
510
+ CODE_EDITOR_LINE_HEIGHT_PX) + 1));
511
+ const value = textarea.value;
512
+ let start = 0;
513
+ for (let current = 1; current < line; current++) {
514
+ start = value.indexOf("\n", start) + 1;
164
515
  }
516
+ const end = lineEndOf(value, start);
517
+ textarea.focus();
518
+ textarea.setSelectionRange(start, end < value.length ? end + 1 : end);
519
+ captureSelection();
165
520
  };
166
- // Handle spell check configuration for Monaco Editor
167
- useEffect(() => {
168
- applySpellCheck(editorRef.current);
169
- applyModelOptions(editorRef.current);
170
- // eslint-disable-next-line
171
- }, [props.disableSpellCheck, props.type]);
172
- useEffect(() => {
173
- applyAria(editorRef.current);
174
- // eslint-disable-next-line
175
- }, [props.ariaLabelledby, props.ariaDescribedby, props.ariaInvalid]);
176
- /*
177
- * Memoised: @monaco-editor/react calls editor.updateOptions() whenever this
178
- * object's identity changes, so an inline literal reconfigured the editor on
179
- * every parent re-render - which for the indentation options below would
180
- * reset them mid-keystroke.
181
- */
182
- const editorOptions = useMemo(() => {
521
+ const status = useMemo(() => {
522
+ // Only once the check has caught up: a half-typed line is not an error yet.
523
+ const settled = !language.validator || checkedText === text;
524
+ if (props.error && settled) {
525
+ return { tone: "error", icon: IconProp.Error, message: props.error };
526
+ }
527
+ if (!syntax) {
528
+ return null;
529
+ }
530
+ if (checkedText.trim() === "") {
531
+ return {
532
+ tone: "neutral",
533
+ icon: IconProp.Info,
534
+ message: "Nothing entered yet.",
535
+ };
536
+ }
537
+ // Nobody parsed it, so nothing may be claimed about it.
538
+ if (syntax.wasSkipped) {
539
+ return {
540
+ tone: "neutral",
541
+ icon: IconProp.Info,
542
+ message: "Contains template expressions — syntax not checked.",
543
+ };
544
+ }
545
+ if (syntax.isValid) {
546
+ const lines = countLines(checkedText);
547
+ return {
548
+ tone: "valid",
549
+ icon: IconProp.CheckCircle,
550
+ message: `Valid ${language.label} · ${lines} ${lines === 1 ? "line" : "lines"}`,
551
+ };
552
+ }
183
553
  return {
184
- acceptSuggestionOnCommitCharacter: false,
185
- acceptSuggestionOnEnter: "off",
186
- accessibilitySupport: "auto",
187
- fontSize: 14,
188
- automaticLayout: true,
189
- codeLens: false,
190
- colorDecorators: true,
191
- contextmenu: false,
192
- cursorBlinking: "blink",
193
- tabIndex: props.tabIndex || 0,
194
- minimap: { enabled: false },
195
- cursorStyle: "line",
196
- disableLayerHinting: false,
197
- disableMonospaceOptimizations: false,
198
- dragAndDrop: false,
199
- fixedOverflowWidgets: false,
200
- folding: true,
201
- foldingStrategy: "auto",
202
- fontLigatures: false,
203
- formatOnPaste: false,
204
- formatOnType: false,
205
- hideCursorInOverviewRuler: false,
206
- links: true,
207
- mouseWheelZoom: false,
208
- multiCursorMergeOverlapping: true,
209
- multiCursorModifier: "alt",
210
- overviewRulerBorder: true,
211
- overviewRulerLanes: 2,
212
- quickSuggestions: false,
213
- quickSuggestionsDelay: 100,
214
- readOnly: props.readOnly || false,
215
- renderControlCharacters: false,
216
- /*
217
- * Long scalars - a URL, a base64 blob, a Sigma `condition:` line - run
218
- * off the right edge, and with wordWrap off for code there is no other
219
- * way to reach them. Wrapping YAML instead is not an option: the
220
- * indentation IS the syntax, and a wrapped line reads as a deeper one.
221
- */
222
- scrollbar: {
223
- horizontal: isYaml ? "auto" : "hidden",
224
- },
225
- renderLineHighlight: "all",
226
- suggestOnTriggerCharacters: false,
227
- /*
228
- * In YAML whitespace is the syntax. Rendering it at the boundaries makes
229
- * the indentation depth countable and, more importantly, makes a literal
230
- * tab visible - tabs are illegal as YAML indentation and are otherwise
231
- * indistinguishable from spaces.
232
- */
233
- renderWhitespace: isYaml ? "boundary" : "none",
234
- revealHorizontalRightPadding: 30,
235
- roundedSelection: true,
236
- rulers: [],
237
- scrollBeyondLastColumn: 5,
238
- // Half a short editor as blank runway is wasted space in a form field.
239
- scrollBeyondLastLine: !isYaml,
240
- selectOnLineNumbers: true,
241
- /*
242
- * Every YAML parse error - ours and the server's - is reported as a
243
- * line and column, so the gutter is what makes the message actionable.
244
- */
245
- lineNumbers: props.showLineNumbers || isYaml ? "on" : "off",
246
- selectionClipboard: true,
247
- selectionHighlight: true,
248
- showFoldingControls: "mouseover",
249
- smoothScrolling: false,
250
- wordBasedSuggestions: "off",
251
- wordWrap: props.type === CodeType.Markdown ? "on" : "off",
252
- tabCompletion: "off",
253
- // The YAML chrome owns the padding, so the editor supplies its own.
254
- padding: isYaml ? { top: 10, bottom: 10 } : undefined,
255
- /*
256
- * tabSize / insertSpaces / detectIndentation deliberately do NOT belong
257
- * here. They are IGlobalEditorOptions: monaco's standalone editor pipes
258
- * whatever it is constructed with through updateConfigurationService,
259
- * which writes every registered `editor.*` key into a PROCESS-WIDE
260
- * config service - and those three are exactly the ones ModelService
261
- * reads back, pushing them onto every model on the page. Setting them
262
- * here would mean the last editor to mount dictates the indentation of
263
- * all the others. They are applied to this editor's own model instead,
264
- * in applyModelOptions below.
265
- */
554
+ tone: "invalid",
555
+ icon: IconProp.Alert,
556
+ message: language.validator === "json"
557
+ ? describeJsonSyntaxError(syntax)
558
+ : describeYamlSyntaxError(syntax),
266
559
  };
267
- }, [
268
- props.tabIndex,
269
- props.readOnly,
270
- props.showLineNumbers,
271
- props.type,
272
- isYaml,
273
- ]);
274
- return (React.createElement("div", { "data-testid": props.dataTestId, "aria-labelledby": props.ariaLabelledby, onClick: () => {
275
- if (props.onClick) {
276
- props.onClick();
277
- }
278
- if (props.onFocus) {
279
- props.onFocus();
280
- }
281
- } },
282
- helpText && (React.createElement("p", { className: "bg-gray-50 text-gray-500 p-3 mt-2 mb-2 rounded text-base text-sm" },
283
- " ",
284
- helpText,
285
- " ")),
286
- React.createElement(Editor, { theme: theme === Theme.Dark ? "vs-dark" : "light", defaultLanguage: props.type,
287
- /*
288
- * `defaultLanguage` is applied only when the model is created, so a
289
- * caller that swaps CodeType after mount keeps the old grammar.
290
- * `language` is the prop that drives setModelLanguage afterwards.
291
- */
292
- language: props.type, height: props.height || "30vh", value: value, onChange: (code) => {
293
- if (code === undefined) {
294
- code = "";
295
- }
296
- setValue(code);
297
- if (props.onBlur) {
298
- props.onBlur();
299
- }
300
- if (props.onChange) {
301
- props.onChange(code);
302
- }
303
- }, onMount: (editor, _monaco) => {
304
- editorRef.current = editor;
305
- applySpellCheck(editor);
306
- applyModelOptions(editor);
307
- applyAria(editor);
308
- }, defaultValue: value || placeholder || "", className: className, options: editorOptions }),
309
- props.error && (React.createElement("p", { className: "mt-1 text-sm text-red-400" }, props.error))));
560
+ }, [props.error, syntax, checkedText, text, language]);
561
+ const isEmpty = text === "";
562
+ const showExampleButton = Boolean(example) && isEmpty && !readOnly;
563
+ const spellCheck = language.spellCheckFollowsCaller
564
+ ? !props.disableSpellCheck
565
+ : false;
566
+ const describedBy = [
567
+ props.ariaDescribedby,
568
+ props.hint ? hintId : null,
569
+ readOnly ? null : keysHintId,
570
+ status ? statusId : null,
571
+ ]
572
+ .filter(Boolean)
573
+ .join(" ") || "";
574
+ const rootClassName = [
575
+ "ou-code-editor overflow-hidden rounded-md border bg-white shadow-sm transition-shadow",
576
+ props.error
577
+ ? "border-red-300 focus-within:border-red-500 focus-within:ring-1 focus-within:ring-red-500"
578
+ : "border-gray-300 focus-within:border-indigo-500 focus-within:ring-1 focus-within:ring-indigo-500",
579
+ language.wrap ? "ou-code-editor--wrap" : "",
580
+ readOnly ? "ou-code-editor--readonly" : "",
581
+ props.className || "",
582
+ ]
583
+ .filter(Boolean)
584
+ .join(" ");
585
+ const minHeight = ((_a = props.minLines) !== null && _a !== void 0 ? _a : CODE_EDITOR_DEFAULT_MIN_LINES) *
586
+ CODE_EDITOR_LINE_HEIGHT_PX +
587
+ 2 * CODE_EDITOR_PADDING_Y_PX;
588
+ const scrollerStyle = props.height
589
+ ? { height: props.height }
590
+ : { maxHeight: props.maxHeight || CODE_EDITOR_DEFAULT_MAX_HEIGHT };
591
+ return (React.createElement("div", { className: rootClassName, "data-testid": props.dataTestId, "data-code-type": props.type, onClick: props.onClick },
592
+ React.createElement("div", { className: "flex items-center justify-between gap-3 border-b border-gray-200 bg-gray-50 py-1 pl-3 pr-1.5" },
593
+ React.createElement("div", { className: "flex min-w-0 items-center gap-2" },
594
+ React.createElement("span", { "data-testid": "code-editor-language", className: "inline-flex shrink-0 items-center rounded border border-indigo-100 bg-indigo-50 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-indigo-700" }, language.label),
595
+ readOnly && (React.createElement("span", { "data-testid": "code-editor-read-only", className: "inline-flex shrink-0 items-center gap-1 text-xs text-gray-500" },
596
+ React.createElement(Icon, { icon: IconProp.Lock, className: "h-3 w-3" }),
597
+ "Read-only")),
598
+ props.hint && (React.createElement("span", { id: hintId, "data-testid": "code-editor-hint", className: "truncate text-xs text-gray-500" }, props.hint))),
599
+ React.createElement("div", { className: "flex shrink-0 items-center gap-0.5" },
600
+ showExampleButton && (React.createElement("button", { type: "button", "data-testid": "code-editor-example-button", className: TOOLBAR_BUTTON_CLASS, onClick: () => {
601
+ replaceDocument(example);
602
+ } },
603
+ React.createElement(Icon, { icon: IconProp.Code, className: "h-3.5 w-3.5" }),
604
+ "Insert example")),
605
+ language.canFormat && !readOnly && (React.createElement("button", { type: "button", "data-testid": "code-editor-format-button", title: canFormat
606
+ ? "Format the document (Shift+Alt+F)"
607
+ : "Format is available once the document is valid JSON", disabled: !canFormat, className: TOOLBAR_BUTTON_CLASS, onClick: handleFormat },
608
+ React.createElement(Icon, { icon: IconProp.Indent, className: "h-3.5 w-3.5" }),
609
+ "Format")),
610
+ React.createElement("button", { type: "button", "data-testid": "code-editor-copy-button", "aria-label": copied
611
+ ? `${language.label} copied to clipboard`
612
+ : `Copy ${language.label} to clipboard`, disabled: isEmpty, className: TOOLBAR_BUTTON_CLASS, onClick: handleCopy },
613
+ React.createElement(Icon, { icon: copied ? IconProp.Check : IconProp.Copy, className: "h-3.5 w-3.5" }),
614
+ copied ? "Copied" : "Copy"))),
615
+ React.createElement("div", { ref: scrollerRef, "data-testid": "code-editor-scroller", className: "ou-code-editor__scroller", style: scrollerStyle },
616
+ React.createElement("div", { className: "ou-code-editor__content" },
617
+ showGutter && (React.createElement("div", { ref: gutterRef, "aria-hidden": "true", "data-testid": "code-editor-gutter", className: "ou-code-editor__gutter", style: {
618
+ minWidth: `calc(${String(lineCount).length + 1}ch + 22px)`,
619
+ }, onMouseDown: handleGutterMouseDown }, gutterSegments.map((segment, index) => {
620
+ return segment.className ? (React.createElement("span", { key: index, className: segment.className }, segment.text)) : (React.createElement(React.Fragment, { key: index }, segment.text));
621
+ }))),
622
+ React.createElement("div", { className: "ou-code-editor__code", style: { minHeight } },
623
+ React.createElement("span", { ref: measureRef, "aria-hidden": "true", className: "ou-code-editor__measure" }, "0".repeat(MEASURE_LENGTH)),
624
+ showActiveLine && !language.wrap && (React.createElement("div", { "aria-hidden": "true", "data-testid": "code-editor-active-line", className: "ou-code-editor__active-line", style: {
625
+ top: CODE_EDITOR_PADDING_Y_PX +
626
+ (cursor.line - 1) * CODE_EDITOR_LINE_HEIGHT_PX,
627
+ } })),
628
+ React.createElement("div", { "aria-hidden": "true", "data-testid": "code-editor-highlight", className: "ou-code-editor__layer ou-code-editor__highlight", dangerouslySetInnerHTML: {
629
+ /*
630
+ * The trailing newline gives a document that ends in one the
631
+ * empty last line the textarea shows; a final line break on
632
+ * its own draws nothing.
633
+ */
634
+ __html: (ghostHtml !== null && ghostHtml !== void 0 ? ghostHtml : highlightedHtml) + "\n",
635
+ } }),
636
+ React.createElement("textarea", { ref: textareaRef, id: props.id, "data-testid": "code-editor-input", className: "ou-code-editor__layer ou-code-editor__input", value: text, readOnly: readOnly, tabIndex: props.tabIndex, placeholder: props.placeholder, wrap: language.wrap ? "soft" : "off", spellCheck: spellCheck, autoCapitalize: "off", autoComplete: "off", autoCorrect: "off", "data-gramm": "false", "data-gramm_editor": "false", "data-enable-grammarly": "false", "aria-label": props.ariaLabelledby || props.id
637
+ ? undefined
638
+ : `${language.label} editor`, "aria-labelledby": props.ariaLabelledby, "aria-describedby": describedBy || undefined, "aria-invalid": props.ariaInvalid || props.error ? true : undefined, onChange: (event) => {
639
+ const next = event.target.value;
640
+ textRef.current = next;
641
+ setText(next);
642
+ captureSelection();
643
+ if (props.onChange) {
644
+ props.onChange(next);
645
+ }
646
+ }, onKeyDown: handleKeyDown, onSelect: captureSelection, onKeyUp: captureSelection, onMouseUp: captureSelection, onFocus: () => {
647
+ setIsFocused(true);
648
+ setTabRelease(false);
649
+ captureSelection();
650
+ if (props.onFocus) {
651
+ props.onFocus();
652
+ }
653
+ }, onBlur: () => {
654
+ setIsFocused(false);
655
+ setTabRelease(false);
656
+ if (props.onBlur) {
657
+ props.onBlur();
658
+ }
659
+ }, onScroll: (event) => {
660
+ /*
661
+ * The textarea is always exactly as big as its text, and the
662
+ * scroller around it does the scrolling. Should it ever scroll
663
+ * itself, its glyphs would slide off the colours under them.
664
+ */
665
+ const target = event.currentTarget;
666
+ if (target.scrollTop !== 0 || target.scrollLeft !== 0) {
667
+ target.scrollTop = 0;
668
+ target.scrollLeft = 0;
669
+ }
670
+ } })))),
671
+ React.createElement("div", { className: "flex items-center justify-between gap-3 border-t border-gray-200 bg-gray-50 px-3 py-1 text-xs" },
672
+ React.createElement("div", { id: statusId, "data-testid": "code-editor-status", role: "status", "aria-live": "polite", className: `flex min-w-0 items-center gap-1.5 ${status ? STATUS_TONE_CLASS[status.tone] : "text-gray-500"}` }, status && (React.createElement(React.Fragment, null,
673
+ React.createElement(Icon, { icon: status.icon, className: "h-3.5 w-3.5 shrink-0" }),
674
+ React.createElement("span", { className: "min-w-0 break-words" }, status.message)))),
675
+ React.createElement("div", { "data-testid": "code-editor-cursor", className: "flex shrink-0 items-center gap-2 tabular-nums text-gray-500" },
676
+ tabMovesFocus && isFocused && (React.createElement("span", { "data-testid": "code-editor-tab-released", className: "rounded border border-gray-200 bg-white px-1.5 text-gray-600" }, "Tab moves focus")),
677
+ React.createElement("span", null,
678
+ "Ln ",
679
+ cursor.line,
680
+ ", Col ",
681
+ cursor.column,
682
+ selectedCharacters > 0 ? ` (${selectedCharacters} selected)` : ""))),
683
+ !readOnly && (React.createElement("span", { id: keysHintId, className: "sr-only" }, CODE_EDITOR_KEYS_HINT)),
684
+ React.createElement("span", { role: "status", "aria-live": "polite", className: "sr-only" }, copied ? `${language.label} copied to clipboard` : "")));
310
685
  };
311
686
  export default CodeEditor;
312
687
  //# sourceMappingURL=CodeEditor.js.map