@oneuptime/common 14.0.10 → 14.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (837) hide show
  1. package/Models/DatabaseModels/AIConversation.ts +127 -1
  2. package/Models/DatabaseModels/CephCluster.ts +12 -0
  3. package/Models/DatabaseModels/CloudResource.ts +12 -0
  4. package/Models/DatabaseModels/DatabaseServer.ts +12 -0
  5. package/Models/DatabaseModels/DockerHost.ts +12 -0
  6. package/Models/DatabaseModels/DockerSwarmCluster.ts +12 -0
  7. package/Models/DatabaseModels/GlobalOidc.ts +0 -4
  8. package/Models/DatabaseModels/GlobalOidcProject.ts +0 -4
  9. package/Models/DatabaseModels/GlobalSso.ts +0 -4
  10. package/Models/DatabaseModels/GlobalSsoProject.ts +0 -4
  11. package/Models/DatabaseModels/Host.ts +12 -0
  12. package/Models/DatabaseModels/IncidentForm.ts +594 -0
  13. package/Models/DatabaseModels/IncidentFormSubmission.ts +283 -0
  14. package/Models/DatabaseModels/IncidentTemplate.ts +59 -0
  15. package/Models/DatabaseModels/Index.ts +14 -0
  16. package/Models/DatabaseModels/IoTFleet.ts +12 -0
  17. package/Models/DatabaseModels/KubernetesCluster.ts +12 -0
  18. package/Models/DatabaseModels/MessageQueue.ts +1102 -0
  19. package/Models/DatabaseModels/MessageQueueLabelRule.ts +553 -0
  20. package/Models/DatabaseModels/MessageQueueOwnerRule.ts +633 -0
  21. package/Models/DatabaseModels/MessageQueueOwnerTeam.ts +491 -0
  22. package/Models/DatabaseModels/MessageQueueOwnerUser.ts +490 -0
  23. package/Models/DatabaseModels/PodmanHost.ts +12 -0
  24. package/Models/DatabaseModels/Project.ts +59 -0
  25. package/Models/DatabaseModels/ProjectOidc.ts +0 -4
  26. package/Models/DatabaseModels/ProjectSso.ts +0 -4
  27. package/Models/DatabaseModels/ProxmoxCluster.ts +12 -0
  28. package/Models/DatabaseModels/RumApplication.ts +12 -0
  29. package/Models/DatabaseModels/ServerlessFunction.ts +12 -0
  30. package/Models/DatabaseModels/Service.ts +12 -0
  31. package/Models/DatabaseModels/StatusPageOidc.ts +0 -4
  32. package/Models/DatabaseModels/StatusPageSso.ts +0 -4
  33. package/Models/DatabaseModels/TeamComplianceSetting.ts +47 -2
  34. package/Models/DatabaseModels/VMwareVCenter.ts +12 -0
  35. package/Server/API/AIChatAPI.ts +13 -114
  36. package/Server/API/AIInvestigationAPI.ts +3 -3
  37. package/Server/API/AIInvestigationConversationAPI.ts +266 -0
  38. package/Server/API/IncidentFormAPI.ts +376 -0
  39. package/Server/API/ProjectOIDC.ts +16 -25
  40. package/Server/API/ProjectSSO.ts +16 -24
  41. package/Server/API/StatusPageAPI.ts +42 -77
  42. package/Server/Enterprise/EnterpriseEdition.ts +93 -28
  43. package/Server/Enterprise/EnterpriseFeature.ts +25 -3
  44. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +1 -1
  45. package/Server/Enterprise/EnterpriseServerModule.ts +4 -1
  46. package/Server/EnvironmentConfig.ts +1 -1
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.ts +129 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.ts +52 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.ts +75 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.ts +477 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  52. package/Server/Middleware/IncidentFormRateLimit.ts +847 -0
  53. package/Server/Middleware/UserAuthorization.ts +16 -38
  54. package/Server/Services/AIService.ts +10 -13
  55. package/Server/Services/IncidentCustomFieldService.ts +112 -2
  56. package/Server/Services/IncidentEpisodeMemberService.ts +24 -4
  57. package/Server/Services/IncidentEpisodeService.ts +10 -1
  58. package/Server/Services/IncidentFormService.ts +1566 -0
  59. package/Server/Services/IncidentFormSubmissionService.ts +97 -0
  60. package/Server/Services/IncidentGroupingEngineService.ts +45 -8
  61. package/Server/Services/IncidentService.ts +123 -5
  62. package/Server/Services/IncidentTemplateService.ts +22 -0
  63. package/Server/Services/Index.ts +14 -0
  64. package/Server/Services/MessageQueueLabelRuleEngineService.ts +321 -0
  65. package/Server/Services/MessageQueueLabelRuleService.ts +14 -0
  66. package/Server/Services/MessageQueueOwnerRuleEngineService.ts +412 -0
  67. package/Server/Services/MessageQueueOwnerRuleService.ts +14 -0
  68. package/Server/Services/MessageQueueOwnerTeamService.ts +62 -0
  69. package/Server/Services/MessageQueueOwnerUserService.ts +62 -0
  70. package/Server/Services/MessageQueueService.ts +1463 -0
  71. package/Server/Services/OpenTelemetryIngestService.ts +37 -4
  72. package/Server/Services/ProjectService.ts +0 -59
  73. package/Server/Services/StatusPagePrivateUserService.ts +1 -4
  74. package/Server/Services/StatusPageService.ts +1 -51
  75. package/Server/Services/TeamComplianceSettingService.ts +163 -42
  76. package/Server/Services/UserNotificationRuleService.ts +8 -1
  77. package/Server/Services/WorkspaceNotificationSummaryService.ts +12 -3
  78. package/Server/Types/Database/Permissions/CreatePermission.ts +17 -3
  79. package/Server/Types/Database/Permissions/EditionPermission.ts +140 -38
  80. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +16 -0
  81. package/Server/Types/Database/Permissions/TablePermission.ts +3 -3
  82. package/Server/Types/Database/Permissions/UpdatePermission.ts +20 -6
  83. package/Server/Utils/AI/Chat/AgentContextCompactor.ts +200 -0
  84. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +307 -48
  85. package/Server/Utils/AI/Chat/ChatRunCancellation.ts +156 -0
  86. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +78 -18
  87. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  88. package/Server/Utils/AI/Chat/ToolOutputPager.ts +322 -0
  89. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +88 -30
  90. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +13 -1
  91. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +0 -32
  92. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +27 -25
  93. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +7 -1
  94. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +34 -14
  95. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +69 -24
  96. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +9 -0
  97. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +53 -10
  98. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +27 -10
  99. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +27 -10
  100. package/Server/Utils/AI/SRE/InvestigationQueue.ts +16 -19
  101. package/Server/Utils/AI/SRE/InvestigationThread.ts +646 -0
  102. package/Server/Utils/AI/SRE/InvestigationThreadService.ts +715 -0
  103. package/Server/Utils/AI/Toolbox/Serializer.ts +10 -3
  104. package/Server/Utils/EditionEnforcement.ts +19 -202
  105. package/Server/Utils/LLM/LLMService.ts +259 -63
  106. package/Server/Utils/RelaxedScimTeamLocksReport.ts +245 -0
  107. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  108. package/Server/Utils/SameOriginRequest.ts +203 -0
  109. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  110. package/Server/Utils/Telemetry/EntityRegistry.ts +4 -1
  111. package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +1402 -0
  112. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +4 -1
  113. package/Server/Utils/VendorAssets.ts +3 -3
  114. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +3 -1
  115. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +3 -1
  116. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +10 -1
  117. package/Tests/App/Accounts/IncidentFormPage.test.tsx +2036 -0
  118. package/Tests/App/Accounts/IncidentFormServerMessages.test.ts +119 -0
  119. package/Tests/App/Accounts/IncidentFormUtils.test.ts +1157 -0
  120. package/Tests/App/Accounts/LoginPasskey.test.tsx +6 -4
  121. package/Tests/App/Accounts/LoginSso.test.tsx +724 -0
  122. package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +338 -0
  123. package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +331 -0
  124. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +47 -33
  125. package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +1021 -0
  126. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +876 -78
  127. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +20 -3
  128. package/Tests/App/Dashboard/CephProxmoxVMwareDocumentationCards.test.tsx +359 -0
  129. package/Tests/App/Dashboard/CephSetupGuide.test.ts +961 -0
  130. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +381 -95
  131. package/Tests/App/Dashboard/CloudSetupGuide.test.ts +1463 -0
  132. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +174 -12
  133. package/Tests/App/Dashboard/ContainerSetupGuideCards.test.tsx +345 -0
  134. package/Tests/App/Dashboard/CoreListEmptyStates.test.tsx +501 -0
  135. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +0 -1
  136. package/Tests/App/Dashboard/DatabaseDocumentationCard.test.tsx +400 -0
  137. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +5 -0
  138. package/Tests/App/Dashboard/DatabaseSetupGuide.test.ts +1869 -0
  139. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +44 -0
  140. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +50 -9
  141. package/Tests/App/Dashboard/DockerSetupGuide.test.ts +899 -0
  142. package/Tests/App/Dashboard/DockerSwarmSetupGuide.test.ts +964 -0
  143. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +141 -7
  144. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +52 -39
  145. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +7 -1
  146. package/Tests/App/Dashboard/GettingStartedTaskRoutes.test.tsx +331 -0
  147. package/Tests/App/Dashboard/HomeOverviewStatsFirstRun.test.tsx +925 -0
  148. package/Tests/App/Dashboard/HostDocumentationCard.test.tsx +225 -0
  149. package/Tests/App/Dashboard/HostSetupGuide.test.ts +1183 -0
  150. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +69 -45
  151. package/Tests/App/Dashboard/IncidentCreateTemplateCustomFieldSettings.test.tsx +745 -0
  152. package/Tests/App/Dashboard/IncidentCreateTemplateOwners.test.tsx +414 -0
  153. package/Tests/App/Dashboard/IncidentCustomFieldCreateSettingsForm.test.ts +1042 -0
  154. package/Tests/App/Dashboard/IncidentCustomFieldSettingsCard.test.tsx +1816 -0
  155. package/Tests/App/Dashboard/IncidentFormPlan.test.ts +89 -0
  156. package/Tests/App/Dashboard/IncidentFormShareLinkCard.test.tsx +846 -0
  157. package/Tests/App/Dashboard/IncidentFormsPages.test.tsx +1324 -0
  158. package/Tests/App/Dashboard/IncidentTemplateCustomFieldSettings.test.tsx +630 -0
  159. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +13 -0
  160. package/Tests/App/Dashboard/IncomingEmailMonitorLinkVerifyHint.test.tsx +104 -0
  161. package/Tests/App/Dashboard/InvestigationConversation.test.tsx +1107 -0
  162. package/Tests/App/Dashboard/InvestigationConversationData.test.ts +546 -0
  163. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +170 -5
  164. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +207 -2
  165. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +729 -34
  166. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +9 -21
  167. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +274 -37
  168. package/Tests/App/Dashboard/InvestigationStatusBadge.test.tsx +130 -0
  169. package/Tests/App/Dashboard/IoTDocumentationCard.test.tsx +218 -0
  170. package/Tests/App/Dashboard/IoTSetupGuide.test.ts +1124 -0
  171. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +20 -6
  172. package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +107 -83
  173. package/Tests/App/Dashboard/KubernetesSetupGuide.test.ts +787 -0
  174. package/Tests/App/Dashboard/MessageQueueBreadcrumbs.test.tsx +228 -0
  175. package/Tests/App/Dashboard/MessageQueueBrokerHealth.test.tsx +1538 -0
  176. package/Tests/App/Dashboard/MessageQueueBrokerHealthMetricChart.test.tsx +969 -0
  177. package/Tests/App/Dashboard/MessageQueueBrokerHealthReads.test.ts +889 -0
  178. package/Tests/App/Dashboard/MessageQueueBrokerMetricsReach.test.ts +236 -0
  179. package/Tests/App/Dashboard/MessageQueueDocumentationCard.test.tsx +479 -0
  180. package/Tests/App/Dashboard/MessageQueueListPages.test.tsx +1232 -0
  181. package/Tests/App/Dashboard/MessageQueueMetricDescriptions.test.ts +244 -0
  182. package/Tests/App/Dashboard/MessageQueueMonitorLink.test.ts +952 -0
  183. package/Tests/App/Dashboard/MessageQueueMonitorLinkMonitorCreate.test.tsx +859 -0
  184. package/Tests/App/Dashboard/MessageQueueOverview.test.tsx +1773 -0
  185. package/Tests/App/Dashboard/MessageQueueOverviewPresentation.test.ts +196 -0
  186. package/Tests/App/Dashboard/MessageQueuePresentation.test.ts +799 -0
  187. package/Tests/App/Dashboard/MessageQueueProducersConsumers.test.tsx +680 -0
  188. package/Tests/App/Dashboard/MessageQueueRoutes.test.tsx +383 -0
  189. package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +278 -0
  190. package/Tests/App/Dashboard/MessageQueueSetupGuide.test.ts +2778 -0
  191. package/Tests/App/Dashboard/MessageQueueSideMenus.test.tsx +273 -0
  192. package/Tests/App/Dashboard/MessageQueueSpanPopulations.test.ts +930 -0
  193. package/Tests/App/Dashboard/MessageQueueSpanStore.ts +351 -0
  194. package/Tests/App/Dashboard/MessageQueueTelemetryScope.test.ts +375 -0
  195. package/Tests/App/Dashboard/MessageQueueTelemetryScopeTabs.test.tsx +668 -0
  196. package/Tests/App/Dashboard/MessageQueueViewPages.test.tsx +685 -0
  197. package/Tests/App/Dashboard/MonitorAndHomeNotOperationalMenus.test.tsx +342 -0
  198. package/Tests/App/Dashboard/MonitorCreateFirstRunDefaults.test.tsx +623 -0
  199. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +442 -0
  200. package/Tests/App/Dashboard/MonitorLogsPageViewSummary.test.tsx +814 -0
  201. package/Tests/App/Dashboard/MonitorSetupCardBodies.test.tsx +246 -0
  202. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +8 -0
  203. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +27 -12
  204. package/Tests/App/Dashboard/PlanGatedPage.test.tsx +292 -0
  205. package/Tests/App/Dashboard/PodmanSetupGuide.test.ts +948 -0
  206. package/Tests/App/Dashboard/ProductOrientation.test.tsx +5 -4
  207. package/Tests/App/Dashboard/ProductSettingsSectionCollapsed.test.tsx +266 -0
  208. package/Tests/App/Dashboard/ProxmoxSetupGuide.test.ts +1318 -0
  209. package/Tests/App/Dashboard/ResourceAiAgentAttentionServerParity.test.ts +555 -0
  210. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +298 -9
  211. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +453 -0
  212. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +16 -0
  213. package/Tests/App/Dashboard/ResourceConnectionGuideCard.test.tsx +444 -0
  214. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsInfra.test.tsx +798 -0
  215. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsPlatforms.test.tsx +717 -0
  216. package/Tests/App/Dashboard/ResourceConnectionGuides.test.ts +981 -0
  217. package/Tests/App/Dashboard/ResourceConnectionState.test.ts +132 -0
  218. package/Tests/App/Dashboard/RumDocumentationCard.test.tsx +293 -0
  219. package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +467 -0
  220. package/Tests/App/Dashboard/RumSetupGuide.test.ts +758 -0
  221. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +25 -0
  222. package/Tests/App/Dashboard/ServerlessDocumentationCard.test.tsx +254 -0
  223. package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1074 -0
  224. package/Tests/App/Dashboard/SetupGuide.test.ts +246 -0
  225. package/Tests/App/Dashboard/SetupGuideCard.test.tsx +756 -0
  226. package/Tests/App/Dashboard/SloListSideMenu.test.tsx +120 -0
  227. package/Tests/App/Dashboard/SsoPages.test.tsx +833 -0
  228. package/Tests/App/Dashboard/TelemetryDocumentation.test.tsx +253 -0
  229. package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +730 -0
  230. package/Tests/App/Dashboard/VMwareSetupGuide.test.ts +1033 -0
  231. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +87 -7
  232. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +28 -9
  233. package/Tests/Models/DatabaseModels/IncidentFormModel.test.ts +1250 -0
  234. package/Tests/Models/DatabaseModels/MessageQueueModels.test.ts +1983 -0
  235. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  236. package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +190 -14
  237. package/Tests/Models/IncidentTemplateCustomFieldSettingsColumn.test.ts +291 -0
  238. package/Tests/Server/API/AIInvestigationConversationAPI.test.ts +412 -0
  239. package/Tests/Server/API/GlobalConfigLicense.test.ts +38 -9
  240. package/Tests/Server/API/IncidentFormAPI.test.ts +942 -0
  241. package/Tests/Server/API/IncidentFormPublicRoutes.test.ts +1653 -0
  242. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -1
  243. package/Tests/Server/API/{SsoProviderListingsEdition.test.ts → SsoProviderListings.test.ts} +164 -110
  244. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +76 -54
  245. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +125 -42
  246. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +36 -10
  247. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +51 -9
  248. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +13 -8
  249. package/Tests/Server/Enterprise/SsoInCommunityEdition.test.ts +540 -0
  250. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  251. package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +438 -0
  252. package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleNotificationChannelsMigration.test.ts +255 -0
  253. package/Tests/Server/Infrastructure/Postgres/MessageQueueTablesMigration.test.ts +637 -0
  254. package/Tests/Server/Middleware/IncidentFormRateLimit.test.ts +1630 -0
  255. package/Tests/Server/Middleware/UserAuthorization.test.ts +16 -17
  256. package/Tests/Server/Middleware/UserAuthorizationSsoEnforcement.test.ts +544 -0
  257. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +37 -8
  258. package/Tests/Server/Services/IncidentCreatedFeedTitle.test.ts +212 -0
  259. package/Tests/Server/Services/IncidentCustomFieldDeleteFormQuestions.test.ts +297 -0
  260. package/Tests/Server/Services/IncidentFormOwnersCreatedNotification.test.ts +497 -0
  261. package/Tests/Server/Services/IncidentFormPostgres.test.ts +958 -0
  262. package/Tests/Server/Services/IncidentFormPublicForm.test.ts +1260 -0
  263. package/Tests/Server/Services/IncidentFormPublicSubmission.test.ts +2520 -0
  264. package/Tests/Server/Services/IncidentFormRegistration.test.ts +159 -0
  265. package/Tests/Server/Services/IncidentFormService.test.ts +663 -0
  266. package/Tests/Server/Services/IncidentFormSubmissionService.test.ts +430 -0
  267. package/Tests/Server/Services/IncidentFormSubmissionTemplateBranch.test.ts +473 -0
  268. package/Tests/Server/Services/IncidentGroupingTemplateSubstitution.test.ts +81 -0
  269. package/Tests/Server/Services/IncidentTemplateCustomFieldSettings.test.ts +262 -0
  270. package/Tests/Server/Services/IncidentTemplateOwnersOnDeclare.test.ts +566 -0
  271. package/Tests/Server/Services/IncidentTitleMarkdownSinks.test.ts +640 -0
  272. package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +3 -3
  273. package/Tests/Server/Services/MessageQueueOwnerServices.test.ts +440 -0
  274. package/Tests/Server/Services/MessageQueueRegistries.test.ts +577 -0
  275. package/Tests/Server/Services/MessageQueueRuleEngines.test.ts +900 -0
  276. package/Tests/Server/Services/MessageQueueService.test.ts +2210 -0
  277. package/Tests/Server/Services/MessageQueueSqlPostgres.test.ts +1271 -0
  278. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
  279. package/Tests/Server/Services/OpenTelemetryRetentionOverrideEdition.test.ts +474 -0
  280. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +21 -0
  281. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +3 -0
  282. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +0 -1
  283. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +56 -6
  284. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -1
  285. package/Tests/Server/Services/SsoRequirementReads.test.ts +454 -0
  286. package/Tests/Server/Services/SsoRequirementWrites.test.ts +529 -0
  287. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  288. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +107 -89
  289. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +1068 -176
  290. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +1962 -200
  291. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +654 -297
  292. package/Tests/Server/Types/Database/Permissions/RetentionOverrideColumns.test.ts +784 -0
  293. package/Tests/Server/Types/Database/Permissions/SsoScalePlanGate.test.ts +418 -0
  294. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +0 -1
  295. package/Tests/Server/Utils/AI/AIInvestigationEngineRunLimits.test.ts +136 -0
  296. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +15 -14
  297. package/Tests/Server/Utils/AI/AgentContextCompactor.test.ts +351 -0
  298. package/Tests/Server/Utils/AI/ChatAgentRunnerSharedThread.test.ts +842 -0
  299. package/Tests/Server/Utils/AI/ChatRunCancellation.test.ts +195 -0
  300. package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +10 -57
  301. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +20 -24
  302. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +7 -30
  303. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +225 -29
  304. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +266 -25
  305. package/Tests/Server/Utils/AI/InvestigationThread.test.ts +580 -0
  306. package/Tests/Server/Utils/AI/InvestigationThreadService.test.ts +801 -0
  307. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +525 -43
  308. package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +4 -2
  309. package/Tests/Server/Utils/AI/LLMServiceUnreachableProvider.test.ts +435 -0
  310. package/Tests/Server/Utils/AI/ObservabilityAssistantLimits.test.ts +462 -0
  311. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +14 -25
  312. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +2 -0
  313. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +297 -15
  314. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +10 -6
  315. package/Tests/Server/Utils/AI/ToolOutputPager.test.ts +382 -0
  316. package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +23 -4
  317. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +25 -6
  318. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +14 -3
  319. package/Tests/Server/Utils/EditionEnforcement.test.ts +107 -147
  320. package/Tests/Server/Utils/{CommunityEditionSsoReport.test.ts → RelaxedScimTeamLocksReport.test.ts} +212 -208
  321. package/Tests/Server/Utils/SameOriginRequest.test.ts +372 -0
  322. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +20 -0
  323. package/Tests/Server/Utils/Telemetry/MessageQueueDiscovery.test.ts +2590 -0
  324. package/Tests/Server/Utils/Telemetry/MessageQueueSpanQueryTwin.ts +246 -0
  325. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +23 -0
  326. package/Tests/Types/AI/AIAgentRunLimits.test.ts +255 -0
  327. package/Tests/Types/Code/JsonSyntax.test.ts +1300 -0
  328. package/Tests/Types/CustomField/CustomFieldCreateSettings.test.ts +1113 -0
  329. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +91 -0
  330. package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +30 -0
  331. package/Tests/Types/Incident/IncidentFormIpAllowlist.test.ts +227 -0
  332. package/Tests/Types/Incident/IncidentFormPublic.test.ts +1916 -0
  333. package/Tests/Types/MessageQueue/MessageQueueEntityKey.test.ts +916 -0
  334. package/Tests/Types/MessageQueue/MessageQueueIdentity.test.ts +567 -0
  335. package/Tests/Types/MessageQueue/MessageQueueManualIdentity.test.ts +686 -0
  336. package/Tests/Types/MessageQueue/MessageQueueMetricCatalog.test.ts +1726 -0
  337. package/Tests/Types/MessageQueue/MessageQueueMetricResolution.test.ts +1758 -0
  338. package/Tests/Types/MessageQueue/MessagingInstrumentationFixtures.test.ts +4686 -0
  339. package/Tests/Types/MessageQueue/MessagingSystem.test.ts +840 -0
  340. package/Tests/Types/MessageQueue/MessagingTelemetryFixtures.ts +3287 -0
  341. package/Tests/Types/MessageQueue/MessagingTelemetryResolver.test.ts +2966 -0
  342. package/Tests/Types/Monitor/MessageQueueAlertTemplates.test.ts +5401 -0
  343. package/Tests/Types/Monitor/MetricEngineFold.ts +154 -0
  344. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +5 -3
  345. package/Tests/Types/Team/ComplianceRule.test.ts +588 -37
  346. package/Tests/Types/Team/TeamComplianceStatus.test.ts +64 -11
  347. package/Tests/Types/XML.test.ts +51 -0
  348. package/Tests/UI/Components/CodeEditor/CodeEditor.test.tsx +2362 -0
  349. package/Tests/UI/Components/CodeEditor/CodeEditorCommands.test.ts +810 -0
  350. package/Tests/UI/Components/CodeEditor/CodeEditorHighlight.test.ts +338 -0
  351. package/Tests/UI/Components/CodeEditor/CodeEditorLanguages.test.ts +222 -0
  352. package/Tests/UI/Components/CodeEditor/CodeEditorStyles.test.ts +807 -0
  353. package/Tests/UI/Components/CodeEditor/NoMonaco.test.ts +245 -0
  354. package/Tests/UI/Components/CodeEditor/YamlEditor.test.tsx +729 -0
  355. package/Tests/UI/Components/CopyTextButton.test.tsx +76 -0
  356. package/Tests/UI/Components/EditionLabelLapseCopy.ts +51 -14
  357. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +131 -23
  358. package/Tests/UI/Components/ErrorMessageAction.test.tsx +142 -0
  359. package/Tests/UI/Components/FacetSidebarInScope.test.tsx +459 -0
  360. package/Tests/UI/Components/FacetValuesInScope.test.ts +270 -0
  361. package/Tests/UI/Components/Forms/FormFieldCodeEditors.test.tsx +294 -0
  362. package/Tests/UI/Components/Forms/FormFieldMarkdown.test.tsx +126 -0
  363. package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +22 -75
  364. package/Tests/UI/Components/Forms/ModelFormOnBeforeCreateMiscData.test.tsx +254 -0
  365. package/Tests/UI/Components/Icon.test.tsx +32 -0
  366. package/Tests/UI/Components/Input.test.tsx +31 -0
  367. package/Tests/UI/Components/LockedFilterChipScope.test.tsx +501 -0
  368. package/Tests/UI/Components/MarkdownConverters.test.ts +253 -1
  369. package/Tests/UI/Components/MarkdownEditor.test.tsx +2785 -2
  370. package/Tests/UI/Components/MarkdownEditorHistory.test.ts +243 -0
  371. package/Tests/UI/Components/MarkdownListEditing.test.ts +1118 -0
  372. package/Tests/UI/Components/MarkdownPaste.test.ts +1180 -0
  373. package/Tests/UI/Components/MarkdownViewerCopy.test.tsx +466 -0
  374. package/Tests/UI/Components/MarkdownVisualEditing.test.ts +1089 -0
  375. package/Tests/UI/Components/ModelTable/BaseModelTableEmptyStateAction.test.tsx +623 -0
  376. package/Tests/UI/Components/ResetObjectID.test.tsx +282 -0
  377. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  378. package/Tests/UI/Components/Table/EmptyTableMessage.test.ts +439 -0
  379. package/Tests/UI/Components/Table/TableEmptyState.test.tsx +352 -0
  380. package/Tests/UI/Components/TableRowMobileTitles.test.tsx +78 -0
  381. package/Tests/UI/Components/TextArea.test.tsx +19 -0
  382. package/Tests/UI/Components/Workflow/ModelColumnEditor.render.test.tsx +12 -29
  383. package/Tests/UI/Components/fixtures/MarkdownPasteFixtures.ts +460 -0
  384. package/Tests/UI/EsbuildConfig.test.ts +115 -39
  385. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +4 -4
  386. package/Tests/UI/Monitor/MonitorLogSummaryRender.test.tsx +377 -0
  387. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +81 -1
  388. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +17 -0
  389. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  390. package/Tests/Utils/Markdown/DashboardMarkdownRenderer.ts +81 -0
  391. package/Tests/Utils/Markdown/UntrustedMarkdown.test.ts +1339 -0
  392. package/Tests/Utils/Monitor/MonitorLogSummaryUtil.test.ts +862 -0
  393. package/Types/AI/AIAgentRunLimits.ts +146 -0
  394. package/Types/Code/CodeType.ts +2 -0
  395. package/Types/Code/JsonSyntax.ts +923 -0
  396. package/Types/CustomField/CustomFieldCreateSettings.ts +549 -0
  397. package/Types/CustomField/CustomFieldMappingCatalog.ts +77 -0
  398. package/Types/CustomField/CustomFieldValueValidator.ts +10 -7
  399. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +1 -1
  400. package/Types/Icon/IconProp.ts +2 -0
  401. package/Types/Incident/IncidentFormIpAllowlist.ts +206 -0
  402. package/Types/Incident/IncidentFormPublic.ts +1145 -0
  403. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +10 -3
  404. package/Types/MessageQueue/MessageQueueIdentity.ts +256 -0
  405. package/Types/MessageQueue/MessageQueueManualIdentity.ts +325 -0
  406. package/Types/MessageQueue/MessageQueueMetricCatalog.ts +1357 -0
  407. package/Types/MessageQueue/MessagingSystem.ts +518 -0
  408. package/Types/MessageQueue/MessagingTelemetryResolver.ts +2311 -0
  409. package/Types/Monitor/MessageQueueAlertTemplates.ts +2128 -0
  410. package/Types/Permission.ts +310 -0
  411. package/Types/ResourceAiAgent/ResourceAiAccess.ts +10 -4
  412. package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
  413. package/Types/Rules/RuleRun.ts +4 -0
  414. package/Types/Team/ComplianceNotificationChannel.ts +4 -3
  415. package/Types/Team/ComplianceRule.ts +71 -18
  416. package/Types/Team/ComplianceRuleType.ts +2 -2
  417. package/Types/Team/TeamComplianceStatus.ts +6 -2
  418. package/Types/Telemetry/EntityType.ts +16 -0
  419. package/Types/Telemetry/LockedFilterDetail.ts +22 -0
  420. package/Types/XML.ts +26 -0
  421. package/UI/Components/CodeEditor/CodeEditor.css +379 -0
  422. package/UI/Components/CodeEditor/CodeEditor.tsx +1128 -294
  423. package/UI/Components/CodeEditor/CodeEditorCommands.ts +774 -0
  424. package/UI/Components/CodeEditor/CodeEditorHighlight.ts +106 -0
  425. package/UI/Components/CodeEditor/CodeEditorLanguages.ts +164 -0
  426. package/UI/Components/CodeEditor/YamlEditor.tsx +28 -326
  427. package/UI/Components/CopyTextButton/CopyTextButton.tsx +5 -1
  428. package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +6 -25
  429. package/UI/Components/EditionLabel/EditionLabel.tsx +14 -13
  430. package/UI/Components/ErrorMessage/ErrorMessage.tsx +11 -1
  431. package/UI/Components/Forms/Fields/FormField.tsx +8 -0
  432. package/UI/Components/Forms/Types/Field.ts +8 -0
  433. package/UI/Components/Icon/Icon.tsx +18 -0
  434. package/UI/Components/Input/Input.tsx +11 -4
  435. package/UI/Components/LogsViewer/LogsViewer.tsx +4 -0
  436. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +21 -3
  437. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  438. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +877 -79
  439. package/UI/Components/Markdown.tsx/MarkdownEditorHistory.ts +284 -0
  440. package/UI/Components/Markdown.tsx/MarkdownListEditing.ts +1362 -0
  441. package/UI/Components/Markdown.tsx/MarkdownPaste.ts +1326 -0
  442. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +106 -10
  443. package/UI/Components/Markdown.tsx/MarkdownVisualEditing.ts +1032 -0
  444. package/UI/Components/ModelTable/BaseModelTable.tsx +85 -7
  445. package/UI/Components/ResetObjectID/ResetObjectID.tsx +35 -9
  446. package/UI/Components/Table/EmptyTableMessage.ts +81 -0
  447. package/UI/Components/Table/Table.tsx +50 -21
  448. package/UI/Components/Table/TableRow.tsx +9 -1
  449. package/UI/Components/TelemetryViewer/FacetVisibility.ts +97 -2
  450. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +13 -0
  451. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +214 -7
  452. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +21 -3
  453. package/UI/Components/TextArea/TextArea.tsx +9 -2
  454. package/UI/Components/Workflow/ModelFieldPicker.tsx +10 -12
  455. package/UI/Styles/Theme.css +8 -0
  456. package/UI/esbuild-config.js +2 -32
  457. package/Utils/LabelRuleImportExport.ts +2 -0
  458. package/Utils/Markdown/UntrustedMarkdown.ts +1513 -0
  459. package/Utils/Monitor/IncomingEmailMonitorRequestUtil.ts +41 -0
  460. package/Utils/Monitor/MonitorLogSummaryUtil.ts +212 -0
  461. package/Utils/Telemetry/EntityKey.ts +48 -0
  462. package/build/dist/Models/DatabaseModels/AIConversation.js +125 -1
  463. package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
  464. package/build/dist/Models/DatabaseModels/CephCluster.js +12 -0
  465. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  466. package/build/dist/Models/DatabaseModels/CloudResource.js +12 -0
  467. package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
  468. package/build/dist/Models/DatabaseModels/DatabaseServer.js +12 -0
  469. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  470. package/build/dist/Models/DatabaseModels/DockerHost.js +12 -0
  471. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  472. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +12 -0
  473. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  474. package/build/dist/Models/DatabaseModels/GlobalOidc.js +0 -4
  475. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  476. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +0 -4
  477. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
  478. package/build/dist/Models/DatabaseModels/GlobalSso.js +0 -4
  479. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  480. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +0 -4
  481. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
  482. package/build/dist/Models/DatabaseModels/Host.js +12 -0
  483. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  484. package/build/dist/Models/DatabaseModels/IncidentForm.js +605 -0
  485. package/build/dist/Models/DatabaseModels/IncidentForm.js.map +1 -0
  486. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js +299 -0
  487. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js.map +1 -0
  488. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +60 -0
  489. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  490. package/build/dist/Models/DatabaseModels/Index.js +14 -0
  491. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  492. package/build/dist/Models/DatabaseModels/IoTFleet.js +12 -0
  493. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
  494. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +12 -0
  495. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  496. package/build/dist/Models/DatabaseModels/MessageQueue.js +1106 -0
  497. package/build/dist/Models/DatabaseModels/MessageQueue.js.map +1 -0
  498. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js +562 -0
  499. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js.map +1 -0
  500. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js +643 -0
  501. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js.map +1 -0
  502. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js +506 -0
  503. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js.map +1 -0
  504. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js +505 -0
  505. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js.map +1 -0
  506. package/build/dist/Models/DatabaseModels/PodmanHost.js +12 -0
  507. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  508. package/build/dist/Models/DatabaseModels/Project.js +61 -0
  509. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  510. package/build/dist/Models/DatabaseModels/ProjectOidc.js +0 -4
  511. package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
  512. package/build/dist/Models/DatabaseModels/ProjectSso.js +0 -4
  513. package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
  514. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +12 -0
  515. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  516. package/build/dist/Models/DatabaseModels/RumApplication.js +12 -0
  517. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  518. package/build/dist/Models/DatabaseModels/ServerlessFunction.js +12 -0
  519. package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
  520. package/build/dist/Models/DatabaseModels/Service.js +12 -0
  521. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  522. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +0 -4
  523. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  524. package/build/dist/Models/DatabaseModels/StatusPageSso.js +0 -4
  525. package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
  526. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +49 -3
  527. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  528. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +12 -0
  529. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  530. package/build/dist/Server/API/AIChatAPI.js +9 -103
  531. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  532. package/build/dist/Server/API/AIInvestigationAPI.js +3 -3
  533. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  534. package/build/dist/Server/API/AIInvestigationConversationAPI.js +162 -0
  535. package/build/dist/Server/API/AIInvestigationConversationAPI.js.map +1 -0
  536. package/build/dist/Server/API/IncidentFormAPI.js +245 -0
  537. package/build/dist/Server/API/IncidentFormAPI.js.map +1 -0
  538. package/build/dist/Server/API/ProjectOIDC.js +16 -24
  539. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  540. package/build/dist/Server/API/ProjectSSO.js +16 -24
  541. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  542. package/build/dist/Server/API/StatusPageAPI.js +42 -75
  543. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  544. package/build/dist/Server/Enterprise/EnterpriseEdition.js +79 -25
  545. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -1
  546. package/build/dist/Server/Enterprise/EnterpriseFeature.js +24 -3
  547. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -1
  548. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +1 -1
  549. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -1
  550. package/build/dist/Server/EnvironmentConfig.js +1 -1
  551. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js +63 -0
  552. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js.map +1 -0
  553. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js +41 -0
  554. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js.map +1 -0
  555. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js +40 -0
  556. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js.map +1 -0
  557. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js +183 -0
  558. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js.map +1 -0
  559. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  560. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  561. package/build/dist/Server/Middleware/IncidentFormRateLimit.js +559 -0
  562. package/build/dist/Server/Middleware/IncidentFormRateLimit.js.map +1 -0
  563. package/build/dist/Server/Middleware/UserAuthorization.js +11 -30
  564. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  565. package/build/dist/Server/Services/AIService.js +10 -13
  566. package/build/dist/Server/Services/AIService.js.map +1 -1
  567. package/build/dist/Server/Services/IncidentCustomFieldService.js +83 -0
  568. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  569. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
  570. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  571. package/build/dist/Server/Services/IncidentEpisodeService.js +10 -1
  572. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  573. package/build/dist/Server/Services/IncidentFormService.js +1202 -0
  574. package/build/dist/Server/Services/IncidentFormService.js.map +1 -0
  575. package/build/dist/Server/Services/IncidentFormSubmissionService.js +91 -0
  576. package/build/dist/Server/Services/IncidentFormSubmissionService.js.map +1 -0
  577. package/build/dist/Server/Services/IncidentGroupingEngineService.js +20 -8
  578. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  579. package/build/dist/Server/Services/IncidentService.js +106 -4
  580. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  581. package/build/dist/Server/Services/IncidentTemplateService.js +18 -0
  582. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  583. package/build/dist/Server/Services/Index.js +14 -0
  584. package/build/dist/Server/Services/Index.js.map +1 -1
  585. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js +262 -0
  586. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js.map +1 -0
  587. package/build/dist/Server/Services/MessageQueueLabelRuleService.js +13 -0
  588. package/build/dist/Server/Services/MessageQueueLabelRuleService.js.map +1 -0
  589. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js +334 -0
  590. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js.map +1 -0
  591. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js +13 -0
  592. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js.map +1 -0
  593. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js +62 -0
  594. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js.map +1 -0
  595. package/build/dist/Server/Services/MessageQueueOwnerUserService.js +62 -0
  596. package/build/dist/Server/Services/MessageQueueOwnerUserService.js.map +1 -0
  597. package/build/dist/Server/Services/MessageQueueService.js +1140 -0
  598. package/build/dist/Server/Services/MessageQueueService.js.map +1 -0
  599. package/build/dist/Server/Services/OpenTelemetryIngestService.js +25 -4
  600. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  601. package/build/dist/Server/Services/ProjectService.js +0 -54
  602. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  603. package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -4
  604. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  605. package/build/dist/Server/Services/StatusPageService.js +0 -46
  606. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  607. package/build/dist/Server/Services/TeamComplianceSettingService.js +120 -31
  608. package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
  609. package/build/dist/Server/Services/UserNotificationRuleService.js +8 -1
  610. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  611. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +12 -3
  612. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
  613. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +6 -3
  614. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  615. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +109 -37
  616. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  617. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +16 -0
  618. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  619. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +3 -3
  620. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +9 -6
  621. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  622. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js +128 -0
  623. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js.map +1 -0
  624. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +192 -50
  625. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  626. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js +133 -0
  627. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js.map +1 -0
  628. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +53 -13
  629. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  630. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  631. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js +206 -0
  632. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js.map +1 -0
  633. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +53 -26
  634. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
  635. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +4 -2
  636. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
  637. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +1 -29
  638. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  639. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +24 -24
  640. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  641. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +7 -2
  642. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  643. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +29 -14
  644. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  645. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +38 -14
  646. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -1
  647. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +2 -0
  648. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -1
  649. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +40 -10
  650. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  651. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +19 -7
  652. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  653. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +19 -7
  654. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  655. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +15 -18
  656. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  657. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js +412 -0
  658. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js.map +1 -0
  659. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js +495 -0
  660. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js.map +1 -0
  661. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +10 -3
  662. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -1
  663. package/build/dist/Server/Utils/EditionEnforcement.js +20 -158
  664. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -1
  665. package/build/dist/Server/Utils/LLM/LLMService.js +193 -54
  666. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  667. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js +160 -0
  668. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js.map +1 -0
  669. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  670. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  671. package/build/dist/Server/Utils/SameOriginRequest.js +151 -0
  672. package/build/dist/Server/Utils/SameOriginRequest.js.map +1 -0
  673. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  674. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  675. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -1
  676. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  677. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +1015 -0
  678. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -0
  679. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +4 -1
  680. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  681. package/build/dist/Server/Utils/VendorAssets.js +3 -3
  682. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +3 -1
  683. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  684. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +3 -1
  685. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  686. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +10 -1
  687. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  688. package/build/dist/Types/AI/AIAgentRunLimits.js +91 -0
  689. package/build/dist/Types/AI/AIAgentRunLimits.js.map +1 -0
  690. package/build/dist/Types/Code/CodeType.js +2 -0
  691. package/build/dist/Types/Code/CodeType.js.map +1 -1
  692. package/build/dist/Types/Code/JsonSyntax.js +604 -0
  693. package/build/dist/Types/Code/JsonSyntax.js.map +1 -0
  694. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js +310 -0
  695. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js.map +1 -0
  696. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +38 -0
  697. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -1
  698. package/build/dist/Types/CustomField/CustomFieldValueValidator.js +10 -7
  699. package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -1
  700. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +1 -1
  701. package/build/dist/Types/Icon/IconProp.js +2 -0
  702. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  703. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js +119 -0
  704. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js.map +1 -0
  705. package/build/dist/Types/Incident/IncidentFormPublic.js +678 -0
  706. package/build/dist/Types/Incident/IncidentFormPublic.js.map +1 -0
  707. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +10 -3
  708. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
  709. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js +184 -0
  710. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js.map +1 -0
  711. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js +190 -0
  712. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js.map +1 -0
  713. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js +1057 -0
  714. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js.map +1 -0
  715. package/build/dist/Types/MessageQueue/MessagingSystem.js +394 -0
  716. package/build/dist/Types/MessageQueue/MessagingSystem.js.map +1 -0
  717. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js +1768 -0
  718. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js.map +1 -0
  719. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js +1207 -0
  720. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js.map +1 -0
  721. package/build/dist/Types/Permission.js +274 -0
  722. package/build/dist/Types/Permission.js.map +1 -1
  723. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +10 -4
  724. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -1
  725. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +12 -0
  726. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  727. package/build/dist/Types/Rules/RuleRun.js +4 -0
  728. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  729. package/build/dist/Types/Team/ComplianceNotificationChannel.js +4 -3
  730. package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -1
  731. package/build/dist/Types/Team/ComplianceRule.js +48 -14
  732. package/build/dist/Types/Team/ComplianceRule.js.map +1 -1
  733. package/build/dist/Types/Team/ComplianceRuleType.js +2 -2
  734. package/build/dist/Types/Telemetry/EntityType.js +16 -0
  735. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  736. package/build/dist/Types/XML.js +23 -0
  737. package/build/dist/Types/XML.js.map +1 -1
  738. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +641 -266
  739. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  740. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js +464 -0
  741. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js.map +1 -0
  742. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js +69 -0
  743. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js.map +1 -0
  744. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js +108 -0
  745. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js.map +1 -0
  746. package/build/dist/UI/Components/CodeEditor/YamlEditor.js +14 -186
  747. package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -1
  748. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
  749. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
  750. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +5 -14
  751. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -1
  752. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +14 -13
  753. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  754. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +1 -1
  755. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  756. package/build/dist/UI/Components/Forms/Fields/FormField.js +8 -3
  757. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  758. package/build/dist/UI/Components/Icon/Icon.js +8 -0
  759. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  760. package/build/dist/UI/Components/Input/Input.js +11 -3
  761. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  762. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +2 -1
  763. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  764. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +14 -4
  765. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  766. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  767. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  768. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +710 -65
  769. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  770. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js +238 -0
  771. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js.map +1 -0
  772. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js +1028 -0
  773. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js.map +1 -0
  774. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js +1088 -0
  775. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js.map +1 -0
  776. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +70 -10
  777. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  778. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js +887 -0
  779. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js.map +1 -0
  780. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +57 -6
  781. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  782. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +7 -5
  783. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
  784. package/build/dist/UI/Components/Table/EmptyTableMessage.js +51 -0
  785. package/build/dist/UI/Components/Table/EmptyTableMessage.js.map +1 -0
  786. package/build/dist/UI/Components/Table/Table.js +30 -11
  787. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  788. package/build/dist/UI/Components/Table/TableRow.js +9 -2
  789. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  790. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +63 -1
  791. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -1
  792. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +4 -2
  793. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  794. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +91 -10
  795. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
  796. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -4
  797. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  798. package/build/dist/UI/Components/TextArea/TextArea.js +9 -3
  799. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  800. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js +1 -2
  801. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js.map +1 -1
  802. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  803. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  804. package/build/dist/Utils/Markdown/UntrustedMarkdown.js +988 -0
  805. package/build/dist/Utils/Markdown/UntrustedMarkdown.js.map +1 -0
  806. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js +34 -0
  807. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js.map +1 -0
  808. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js +148 -0
  809. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js.map +1 -0
  810. package/build/dist/Utils/Telemetry/EntityKey.js +36 -0
  811. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  812. package/package.json +1 -3
  813. package/Server/Utils/CommunityEditionSsoReport.ts +0 -361
  814. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +0 -616
  815. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +0 -217
  816. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +0 -271
  817. package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +0 -215
  818. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +0 -784
  819. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +0 -518
  820. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +0 -419
  821. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +0 -769
  822. package/Tests/UI/Components/CodeEditor.test.tsx +0 -638
  823. package/Tests/UI/Components/MonacoLoader.test.ts +0 -67
  824. package/Tests/UI/Components/MonacoRuntime.test.ts +0 -121
  825. package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +0 -329
  826. package/Tests/UI/Components/YamlEditor.test.tsx +0 -847
  827. package/UI/Components/CodeEditor/MonacoLoader.ts +0 -36
  828. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -319
  829. package/UI/Components/Telemetry/TelemetryRetentionConfigSummary.tsx +0 -223
  830. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +0 -223
  831. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +0 -1
  832. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +0 -34
  833. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +0 -1
  834. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +0 -171
  835. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +0 -1
  836. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js +0 -119
  837. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js.map +0 -1
@@ -0,0 +1,1463 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import yaml from "js-yaml";
5
+ import {
6
+ CLOUD_PLATFORM_OPTIONS,
7
+ DEFAULT_CLOUD_DOC_PLATFORM,
8
+ getCloudSetupGuide,
9
+ resolveCloudPlatform,
10
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/Cloud/CloudSetupGuide";
11
+ import {
12
+ SETUP_GUIDE_API_KEY_PLACEHOLDER,
13
+ SETUP_GUIDE_URL_PLACEHOLDER,
14
+ SetupGuideContent,
15
+ SetupGuideOption,
16
+ SetupGuideOptionGroup,
17
+ SetupGuideStep,
18
+ SetupGuideStepVariant,
19
+ SetupGuideTopic,
20
+ getSetupGuideCodeBlocks,
21
+ getSetupGuideMarkdown,
22
+ groupSetupGuideOptions,
23
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/SetupGuide/SetupGuide";
24
+ import {
25
+ CLOUD_PROVIDER_LABELS,
26
+ CloudProvider,
27
+ MANAGED_CLOUD_PLATFORMS,
28
+ ManagedCloudPlatform,
29
+ ManagedCloudPlatformDescriptor,
30
+ buildCloudEnvironmentName,
31
+ } from "../../../Types/Cloud/CloudPlatform";
32
+ import { CLOUD_INSTANCE_IDENTITY_ATTRIBUTES } from "../../../Utils/Telemetry/CloudInstanceIdentity";
33
+
34
+ /*
35
+ * The managed cloud guide asks where the app runs, then shows only that
36
+ * platform's steps. These tests pin, for every platform in the registry:
37
+ *
38
+ * - the picker is the registry, grouped by provider, opening on ECS for
39
+ * anything it does not know;
40
+ * - the token goes into the platform's secret store first, as the bare
41
+ * token for a collector and as the whole header for an SDK;
42
+ * - the reader's endpoint and key reach every command, and a placeholder
43
+ * never reaches a shell unquoted;
44
+ * - the sidecar and SDK-direct tabs exist exactly where the platform has
45
+ * both shapes, and each platform shows only its own instructions;
46
+ * - every collector configuration is valid YAML that only uses what it
47
+ * defines, and every detector switch, hand-set attribute and console
48
+ * path matches the platform's docs page;
49
+ * - the Instances line agrees with the order ingest reads identities in.
50
+ */
51
+
52
+ const REPO_ROOT: string = path.resolve(__dirname, "../../../../..");
53
+ const DOCS_CONTENT: string = path.join(
54
+ REPO_ROOT,
55
+ "packages/App/FeatureSet/Docs/Content/en",
56
+ );
57
+
58
+ const ONEUPTIME_URL: string = "https://oneuptime.example.com";
59
+ const ONEUPTIME_HOST: string = "oneuptime.example.com";
60
+ const KEY: string = "tik_secret_123";
61
+ const CLOUD_TROUBLESHOOTING_URL: string =
62
+ "/docs/telemetry/cloud-troubleshooting";
63
+
64
+ const SIDECAR: string = "Sidecar collector";
65
+ const SDK: string = "SDK direct";
66
+ const VERIFY: string = "Verify the connection";
67
+
68
+ const PICK_KEY_NOTE: string = `Pick an ingestion key in step 1 to fill in \`${SETUP_GUIDE_API_KEY_PLACEHOLDER}\`.`;
69
+
70
+ // The example account and region each provider's guide uses.
71
+ const EXAMPLE_REGIONS: Readonly<Record<CloudProvider, string>> = {
72
+ [CloudProvider.AWS]: "us-east-1",
73
+ [CloudProvider.GCP]: "us-central1",
74
+ [CloudProvider.Azure]: "eastus",
75
+ };
76
+
77
+ const EXAMPLE_ACCOUNTS: Readonly<Record<CloudProvider, string>> = {
78
+ [CloudProvider.AWS]: "123456789012",
79
+ [CloudProvider.GCP]: "my-project",
80
+ [CloudProvider.Azure]: "00000000-0000-0000-0000-000000000000",
81
+ };
82
+
83
+ // Markdown a plain-text summary or description must not carry.
84
+ const MARKDOWN_CHARACTERS: RegExp = /[`*[\]]/;
85
+
86
+ interface PlatformExpectation {
87
+ steps: Array<string>;
88
+ // Tab labels, in order, of every step that has tabs; empty for none.
89
+ shapes: Array<string>;
90
+ // The command or setting that stores the token, on the first step.
91
+ secretStore: string;
92
+ // Text only this platform's guide may contain.
93
+ exclusive: Array<string>;
94
+ advanced: Array<string>;
95
+ troubleshooting: Array<string>;
96
+ }
97
+
98
+ const EXPECTED: Readonly<Record<ManagedCloudPlatform, PlatformExpectation>> = {
99
+ [ManagedCloudPlatform.AwsEcs]: {
100
+ steps: [
101
+ "Store the token in Secrets Manager",
102
+ "Update the task definition",
103
+ VERIFY,
104
+ ],
105
+ shapes: [SIDECAR, SDK],
106
+ secretStore: "aws secretsmanager create-secret",
107
+ exclusive: [
108
+ "awsecscontainermetrics",
109
+ "detectors: [env, ecs]",
110
+ "assignPublicIp=ENABLED",
111
+ "Amazon Elastic Container Service",
112
+ "aws.ecs.task.arn",
113
+ ],
114
+ advanced: [
115
+ "Networking and permissions",
116
+ "How the environment is identified",
117
+ "What the environment shows",
118
+ ],
119
+ troubleshooting: [
120
+ 'Task stuck in PENDING with "unable to pull secrets"',
121
+ "Exports are refused with 401",
122
+ "CPU and Memory tiles stay empty",
123
+ "The environment does not appear",
124
+ ],
125
+ },
126
+ [ManagedCloudPlatform.AwsElasticBeanstalk]: {
127
+ steps: [
128
+ "Store the token in Secrets Manager",
129
+ "Set the environment properties",
130
+ "Run a collector on each instance",
131
+ VERIFY,
132
+ ],
133
+ shapes: [],
134
+ secretStore: "aws secretsmanager create-secret",
135
+ exclusive: [
136
+ "detectors: [env, elastic_beanstalk, ec2]",
137
+ ".platform/hooks/postdeploy/",
138
+ "Elastic Beanstalk",
139
+ "/var/elasticbeanstalk/xray/environment.conf",
140
+ ],
141
+ advanced: [
142
+ "Networking and permissions",
143
+ "Skip the collector (Node.js)",
144
+ "How the environment is identified",
145
+ "What the environment shows",
146
+ ],
147
+ troubleshooting: [
148
+ "Instances show up under Hosts instead",
149
+ "Every instance shares one row under Instances",
150
+ "The environment does not appear",
151
+ ],
152
+ },
153
+ [ManagedCloudPlatform.AwsAppRunner]: {
154
+ steps: [
155
+ "Store the token in Secrets Manager",
156
+ "Configure the App Runner service",
157
+ VERIFY,
158
+ ],
159
+ shapes: [],
160
+ secretStore: "aws secretsmanager create-secret",
161
+ exclusive: [
162
+ "App Runner",
163
+ "cloud.platform=aws_app_runner",
164
+ "--name oneuptime/otlp-headers",
165
+ ],
166
+ advanced: [
167
+ "Networking and permissions",
168
+ "How the environment is identified",
169
+ "What the environment shows",
170
+ ],
171
+ troubleshooting: [
172
+ "Exports are refused with 401",
173
+ "The environment does not appear",
174
+ ],
175
+ },
176
+ [ManagedCloudPlatform.GcpCloudRun]: {
177
+ steps: [
178
+ "Store the token in Secret Manager",
179
+ "Configure the Cloud Run service",
180
+ VERIFY,
181
+ ],
182
+ shapes: [SDK, SIDECAR],
183
+ secretStore: "gcloud secrets create",
184
+ exclusive: [
185
+ "gcloud run services update",
186
+ "detectors: [env, gcp]",
187
+ "run.googleapis.com/container-dependencies",
188
+ "health_check",
189
+ "oneuptime-ingestion-token",
190
+ ],
191
+ advanced: [
192
+ "Networking and permissions",
193
+ "How the environment is identified",
194
+ "What the environment shows",
195
+ ],
196
+ troubleshooting: [
197
+ 'Revision fails with "Permission denied on secret"',
198
+ "Exports are refused with 401",
199
+ "The environment does not appear",
200
+ ],
201
+ },
202
+ [ManagedCloudPlatform.GcpAppEngine]: {
203
+ steps: [
204
+ "Store the token in Secret Manager",
205
+ "Set the variables in app.yaml",
206
+ VERIFY,
207
+ ],
208
+ shapes: [],
209
+ secretStore: "gcloud secrets create",
210
+ exclusive: [
211
+ "app.yaml",
212
+ "gcloud app deploy",
213
+ "GAE_SERVICE",
214
+ "@appspot.gserviceaccount.com",
215
+ ],
216
+ advanced: [
217
+ "Networking and permissions",
218
+ "How the environment is identified",
219
+ "What the environment shows",
220
+ ],
221
+ troubleshooting: ["The environment does not appear"],
222
+ },
223
+ [ManagedCloudPlatform.AzureContainerApps]: {
224
+ steps: [
225
+ "Store the token as a Container Apps secret",
226
+ "Configure the container app",
227
+ VERIFY,
228
+ ],
229
+ shapes: [SDK, SIDECAR],
230
+ secretStore: "az containerapp secret set",
231
+ exclusive: [
232
+ "az containerapp update",
233
+ "detectors: [env, azurecontainerapps]",
234
+ "CONTAINER_APP_REPLICA_NAME",
235
+ "az containerapp env telemetry otlp add",
236
+ "secretref:oneuptime-otlp-headers",
237
+ ],
238
+ advanced: [
239
+ "Networking and permissions",
240
+ "Use the environment's managed OpenTelemetry agent",
241
+ "How the environment is identified",
242
+ "What the environment shows",
243
+ ],
244
+ troubleshooting: [
245
+ "Exports are refused with 401",
246
+ "The environment does not appear",
247
+ ],
248
+ },
249
+ [ManagedCloudPlatform.AzureContainerInstances]: {
250
+ steps: ["Create the container group", VERIFY],
251
+ shapes: [],
252
+ secretStore: "--secure-environment-variables",
253
+ exclusive: [
254
+ "az container create",
255
+ "Mark as secure: Yes",
256
+ "Container Instances",
257
+ ],
258
+ advanced: [
259
+ "Networking and permissions",
260
+ "Run a sidecar collector",
261
+ "How the environment is identified",
262
+ "What the environment shows",
263
+ ],
264
+ troubleshooting: [
265
+ "A changed variable has no effect",
266
+ "The environment does not appear",
267
+ ],
268
+ },
269
+ [ManagedCloudPlatform.AzureAppService]: {
270
+ steps: [
271
+ "Store the token in Key Vault",
272
+ "Set the application settings",
273
+ VERIFY,
274
+ ],
275
+ shapes: [],
276
+ secretStore: "Key Vault Secrets User",
277
+ exclusive: [
278
+ "@Microsoft.KeyVault(",
279
+ "WEBSITE_INSTANCE_ID",
280
+ "deployment slot setting",
281
+ "App Services",
282
+ ],
283
+ advanced: [
284
+ "Networking and permissions",
285
+ "How the environment is identified",
286
+ "What the environment shows",
287
+ ],
288
+ troubleshooting: [
289
+ "Exports are refused with 401",
290
+ "The environment key has an empty account segment",
291
+ "The environment does not appear",
292
+ ],
293
+ },
294
+ };
295
+
296
+ const PLATFORMS: Array<ManagedCloudPlatform> = MANAGED_CLOUD_PLATFORMS.map(
297
+ (descriptor: ManagedCloudPlatformDescriptor): ManagedCloudPlatform => {
298
+ return descriptor.platform;
299
+ },
300
+ );
301
+
302
+ const descriptorOf: (
303
+ platform: ManagedCloudPlatform,
304
+ ) => ManagedCloudPlatformDescriptor = (
305
+ platform: ManagedCloudPlatform,
306
+ ): ManagedCloudPlatformDescriptor => {
307
+ return MANAGED_CLOUD_PLATFORMS.find(
308
+ (descriptor: ManagedCloudPlatformDescriptor): boolean => {
309
+ return descriptor.platform === platform;
310
+ },
311
+ )!;
312
+ };
313
+
314
+ const guideFor: (
315
+ platform: ManagedCloudPlatform,
316
+ overrides?: { oneuptimeUrl?: string; apiKey?: string },
317
+ ) => SetupGuideContent = (
318
+ platform: ManagedCloudPlatform,
319
+ overrides?: { oneuptimeUrl?: string; apiKey?: string },
320
+ ): SetupGuideContent => {
321
+ return getCloudSetupGuide({
322
+ oneuptimeUrl: overrides?.oneuptimeUrl ?? ONEUPTIME_URL,
323
+ apiKey: overrides?.apiKey ?? KEY,
324
+ platform: platform,
325
+ });
326
+ };
327
+
328
+ // Everything a step shows: its own markdown and every tab.
329
+ const stepText: (step: SetupGuideStep) => string = (
330
+ step: SetupGuideStep,
331
+ ): string => {
332
+ return [
333
+ step.markdown || "",
334
+ ...(step.variants || []).map((variant: SetupGuideStepVariant): string => {
335
+ return variant.markdown;
336
+ }),
337
+ ].join("\n\n");
338
+ };
339
+
340
+ const variantOf: (step: SetupGuideStep, label: string) => string = (
341
+ step: SetupGuideStep,
342
+ label: string,
343
+ ): string => {
344
+ const variant: SetupGuideStepVariant | undefined = (step.variants || []).find(
345
+ (candidate: SetupGuideStepVariant): boolean => {
346
+ return candidate.label === label;
347
+ },
348
+ );
349
+ if (!variant) {
350
+ throw new Error(`Step "${step.title}" has no "${label}" tab`);
351
+ }
352
+ return variant.markdown;
353
+ };
354
+
355
+ const titlesOf: (
356
+ topics: Array<SetupGuideTopic> | undefined,
357
+ ) => Array<string> = (
358
+ topics: Array<SetupGuideTopic> | undefined,
359
+ ): Array<string> => {
360
+ return (topics || []).map((topic: SetupGuideTopic): string => {
361
+ return topic.title;
362
+ });
363
+ };
364
+
365
+ const topicOf: (
366
+ topics: Array<SetupGuideTopic> | undefined,
367
+ title: string,
368
+ ) => SetupGuideTopic = (
369
+ topics: Array<SetupGuideTopic> | undefined,
370
+ title: string,
371
+ ): SetupGuideTopic => {
372
+ const topic: SetupGuideTopic | undefined = (topics || []).find(
373
+ (candidate: SetupGuideTopic): boolean => {
374
+ return candidate.title === title;
375
+ },
376
+ );
377
+ if (!topic) {
378
+ throw new Error(`No topic titled "${title}"`);
379
+ }
380
+ return topic;
381
+ };
382
+
383
+ interface FencedBlock {
384
+ language: string;
385
+ body: string;
386
+ }
387
+
388
+ const fencedBlocks: (markdown: string) => Array<FencedBlock> = (
389
+ markdown: string,
390
+ ): Array<FencedBlock> => {
391
+ return Array.from(markdown.matchAll(/```([^\n]*)\n([\s\S]*?)```/g)).map(
392
+ (match: RegExpMatchArray): FencedBlock => {
393
+ return { language: match[1] || "", body: match[2] || "" };
394
+ },
395
+ );
396
+ };
397
+
398
+ // The collector configurations: YAML blocks that export to OneUptime.
399
+ const collectorConfigsOf: (markdown: string) => Array<string> = (
400
+ markdown: string,
401
+ ): Array<string> => {
402
+ return fencedBlocks(markdown)
403
+ .filter((block: FencedBlock): boolean => {
404
+ return (
405
+ block.language === "yaml" && block.body.includes("otlphttp/oneuptime")
406
+ );
407
+ })
408
+ .map((block: FencedBlock): string => {
409
+ return block.body;
410
+ });
411
+ };
412
+
413
+ // Shell blocks that run a command, as opposed to lists of variables to set.
414
+ const COMMAND_START: RegExp = /^(aws|az|curl|gcloud|printf)\b/;
415
+
416
+ const commandBlocksOf: (markdown: string) => Array<string> = (
417
+ markdown: string,
418
+ ): Array<string> => {
419
+ return fencedBlocks(markdown)
420
+ .filter((block: FencedBlock): boolean => {
421
+ return (
422
+ block.language === "bash" && COMMAND_START.test(block.body.trimStart())
423
+ );
424
+ })
425
+ .map((block: FencedBlock): string => {
426
+ return block.body;
427
+ });
428
+ };
429
+
430
+ // What the shell sees outside quotes, with comment lines dropped.
431
+ const unquotedShellText: (command: string) => string = (
432
+ command: string,
433
+ ): string => {
434
+ return command
435
+ .split("\n")
436
+ .filter((line: string): boolean => {
437
+ return !line.trimStart().startsWith("#");
438
+ })
439
+ .join("\n")
440
+ .replace(/'[^']*'/g, "")
441
+ .replace(/"[^"]*"/g, "");
442
+ };
443
+
444
+ const docsFileFor: (url: string) => string = (url: string): string => {
445
+ return path.join(DOCS_CONTENT, `${url.replace(/^\/docs\//, "")}.md`);
446
+ };
447
+
448
+ const docsPageOf: (platform: ManagedCloudPlatform) => string = (
449
+ platform: ManagedCloudPlatform,
450
+ ): string => {
451
+ return fs.readFileSync(docsFileFor(descriptorOf(platform).docsUrl), "utf8");
452
+ };
453
+
454
+ type YamlMap = Record<string, unknown>;
455
+
456
+ const asMap: (value: unknown) => YamlMap = (value: unknown): YamlMap => {
457
+ expect(typeof value === "object" && value !== null).toBe(true);
458
+ return value as YamlMap;
459
+ };
460
+
461
+ describe("the platform picker", () => {
462
+ test("offers exactly the registry's platforms, in registry order", () => {
463
+ expect(
464
+ CLOUD_PLATFORM_OPTIONS.map(
465
+ (option: SetupGuideOption<ManagedCloudPlatform>): string => {
466
+ return option.key;
467
+ },
468
+ ),
469
+ ).toEqual(PLATFORMS);
470
+ expect(new Set(PLATFORMS)).toEqual(
471
+ new Set(Object.values(ManagedCloudPlatform)),
472
+ );
473
+ });
474
+
475
+ test("labels each platform with its product name, one-line description and provider", () => {
476
+ for (const descriptor of MANAGED_CLOUD_PLATFORMS) {
477
+ const option: SetupGuideOption<ManagedCloudPlatform> | undefined =
478
+ CLOUD_PLATFORM_OPTIONS.find(
479
+ (candidate: SetupGuideOption<ManagedCloudPlatform>): boolean => {
480
+ return candidate.key === descriptor.platform;
481
+ },
482
+ );
483
+ expect(option).toEqual({
484
+ key: descriptor.platform,
485
+ label: descriptor.productName,
486
+ description: descriptor.description,
487
+ group: CLOUD_PROVIDER_LABELS[descriptor.provider],
488
+ });
489
+ expect(option?.description).not.toContain("\n");
490
+ expect(option?.badge).toBeUndefined();
491
+ }
492
+ });
493
+
494
+ test("groups the platforms by provider: AWS, Google Cloud, Azure", () => {
495
+ const groups: Array<SetupGuideOptionGroup<ManagedCloudPlatform>> =
496
+ groupSetupGuideOptions(CLOUD_PLATFORM_OPTIONS);
497
+
498
+ expect(
499
+ groups.map(
500
+ (group: SetupGuideOptionGroup<ManagedCloudPlatform>): unknown => {
501
+ return group.label;
502
+ },
503
+ ),
504
+ ).toEqual([
505
+ CLOUD_PROVIDER_LABELS[CloudProvider.AWS],
506
+ CLOUD_PROVIDER_LABELS[CloudProvider.GCP],
507
+ CLOUD_PROVIDER_LABELS[CloudProvider.Azure],
508
+ ]);
509
+
510
+ for (const group of groups) {
511
+ const provider: CloudProvider = (
512
+ Object.keys(CLOUD_PROVIDER_LABELS) as Array<CloudProvider>
513
+ ).find((candidate: CloudProvider): boolean => {
514
+ return CLOUD_PROVIDER_LABELS[candidate] === group.label;
515
+ })!;
516
+ expect(
517
+ group.options.map(
518
+ (option: SetupGuideOption<ManagedCloudPlatform>): string => {
519
+ return option.key;
520
+ },
521
+ ),
522
+ ).toEqual(
523
+ MANAGED_CLOUD_PLATFORMS.filter(
524
+ (descriptor: ManagedCloudPlatformDescriptor): boolean => {
525
+ return descriptor.provider === provider;
526
+ },
527
+ ).map((descriptor: ManagedCloudPlatformDescriptor): string => {
528
+ return descriptor.platform;
529
+ }),
530
+ );
531
+ }
532
+ });
533
+
534
+ test("opens on AWS ECS, which is also the first option the card falls back to", () => {
535
+ expect(DEFAULT_CLOUD_DOC_PLATFORM).toBe(ManagedCloudPlatform.AwsEcs);
536
+ expect(CLOUD_PLATFORM_OPTIONS[0]?.key).toBe(DEFAULT_CLOUD_DOC_PLATFORM);
537
+ });
538
+
539
+ test("resolves every registry platform to itself", () => {
540
+ for (const platform of PLATFORMS) {
541
+ expect(resolveCloudPlatform(platform)).toBe(platform);
542
+ }
543
+ });
544
+
545
+ test("resolves an unknown, virtual-machine or missing platform to ECS", () => {
546
+ for (const value of [
547
+ undefined,
548
+ null,
549
+ "",
550
+ "aws_ec2",
551
+ "gcp_compute_engine",
552
+ "aws_lambda",
553
+ "kubernetes",
554
+ "AWS_ECS",
555
+ "constructor",
556
+ ]) {
557
+ expect(resolveCloudPlatform(value)).toBe(DEFAULT_CLOUD_DOC_PLATFORM);
558
+ }
559
+ });
560
+
561
+ test("an unknown platform gets the ECS guide rather than an error", () => {
562
+ expect(
563
+ getCloudSetupGuide({
564
+ oneuptimeUrl: ONEUPTIME_URL,
565
+ apiKey: KEY,
566
+ platform: "aws_ec2" as ManagedCloudPlatform,
567
+ }),
568
+ ).toEqual(guideFor(ManagedCloudPlatform.AwsEcs));
569
+ });
570
+
571
+ test("every platform has a guide of its own", () => {
572
+ const guides: Set<string> = new Set<string>(
573
+ PLATFORMS.map((platform: ManagedCloudPlatform): string => {
574
+ return getSetupGuideMarkdown(guideFor(platform));
575
+ }),
576
+ );
577
+ expect(guides.size).toBe(PLATFORMS.length);
578
+ });
579
+ });
580
+
581
+ describe.each(PLATFORMS)("the %s guide", (platform: ManagedCloudPlatform) => {
582
+ const descriptor: ManagedCloudPlatformDescriptor = descriptorOf(platform);
583
+ const expected: PlatformExpectation = EXPECTED[platform];
584
+ const guide: SetupGuideContent = guideFor(platform);
585
+ const markdown: string = getSetupGuideMarkdown(guide);
586
+ const code: string = getSetupGuideCodeBlocks(guide).join("\n");
587
+
588
+ test("stores the token, configures the platform, then verifies", () => {
589
+ expect(
590
+ guide.steps.map((step: SetupGuideStep): string => {
591
+ return step.title;
592
+ }),
593
+ ).toEqual(expected.steps);
594
+ expect(guide.steps.length).toBeGreaterThanOrEqual(2);
595
+ expect(guide.steps.length).toBeLessThanOrEqual(4);
596
+ });
597
+
598
+ test("every step has a one-line plain-text description", () => {
599
+ for (const step of guide.steps) {
600
+ expect(step.description).toBeTruthy();
601
+ expect(step.description).not.toContain("\n");
602
+ expect(step.description).not.toMatch(MARKDOWN_CHARACTERS);
603
+ }
604
+ });
605
+
606
+ test("step 1 shows the OTLP endpoint and asks for a Server key kept as a secret", () => {
607
+ expect(guide.keyStep?.endpointLabel).toBe("OTLP Endpoint");
608
+ expect(guide.keyStep?.endpointValue).toBe(`${ONEUPTIME_URL}/otlp`);
609
+ expect(guide.keyStep?.description).toContain("Server key");
610
+ expect(guide.keyStep?.description).toContain("secret");
611
+ expect(guide.keyStep?.description).toContain("plain environment variable");
612
+ // Rendered as plain text under the step title.
613
+ expect(guide.keyStep?.description).not.toMatch(MARKDOWN_CHARACTERS);
614
+ });
615
+
616
+ test("names the exact cloud.platform value and the environment it creates", () => {
617
+ const example: string = buildCloudEnvironmentName({
618
+ platform: platform,
619
+ region: EXAMPLE_REGIONS[descriptor.provider],
620
+ accountId: EXAMPLE_ACCOUNTS[descriptor.provider],
621
+ });
622
+ expect(guide.intro).toContain(`\`cloud.platform=${platform}\``);
623
+ expect(guide.intro).toContain(`_${example}_`);
624
+ });
625
+
626
+ test("lists what to have ready, one line each", () => {
627
+ expect((guide.prerequisites || []).length).toBeGreaterThanOrEqual(2);
628
+ expect((guide.prerequisites || []).length).toBeLessThanOrEqual(4);
629
+ for (const line of guide.prerequisites || []) {
630
+ expect(line).not.toContain("\n");
631
+ }
632
+ expect((guide.prerequisites || []).join("\n")).toContain(
633
+ "OpenTelemetry SDK that exports OTLP",
634
+ );
635
+ });
636
+
637
+ test("carries the reader's endpoint and key into the snippets", () => {
638
+ expect(code).toContain(`${ONEUPTIME_URL}/otlp`);
639
+ expect(code).toContain(KEY);
640
+ expect(code).toContain("x-oneuptime-token");
641
+ expect(markdown).not.toContain(SETUP_GUIDE_API_KEY_PLACEHOLDER);
642
+ expect(markdown).not.toContain(SETUP_GUIDE_URL_PLACEHOLDER);
643
+ expect(markdown).not.toContain("YOUR_TELEMETRY_INGESTION_TOKEN");
644
+ expect(markdown).not.toContain(PICK_KEY_NOTE);
645
+ });
646
+
647
+ test("stores the token in the platform's secret store in the first step", () => {
648
+ const first: string = stepText(guide.steps[0]!);
649
+ expect(first).toContain(expected.secretStore);
650
+ expect(first).toContain(KEY);
651
+ });
652
+
653
+ test("verifies the token with /otlp/v1/validate, then points at the environment list", () => {
654
+ const verify: SetupGuideStep = guide.steps[guide.steps.length - 1]!;
655
+ expect(verify.title).toBe(VERIFY);
656
+ expect(verify.markdown).toContain(
657
+ `curl -i ${ONEUPTIME_URL}/otlp/v1/validate \\\n -H "x-oneuptime-token: ${KEY}"`,
658
+ );
659
+ expect(verify.markdown).toContain('`"valid": true`');
660
+ expect(verify.markdown).toContain("`401`");
661
+ expect(verify.markdown).toContain("**Cloud → All Environments**");
662
+ });
663
+
664
+ test("has the sidecar and SDK-direct tabs exactly where the platform has both shapes", () => {
665
+ const tabbed: Array<SetupGuideStep> = guide.steps.filter(
666
+ (step: SetupGuideStep): boolean => {
667
+ return (step.variants || []).length > 0;
668
+ },
669
+ );
670
+
671
+ if (expected.shapes.length === 0) {
672
+ expect(tabbed).toEqual([]);
673
+ return;
674
+ }
675
+
676
+ // The secret and the configuration both depend on the shape.
677
+ expect(
678
+ tabbed.map((step: SetupGuideStep): string => {
679
+ return step.title;
680
+ }),
681
+ ).toEqual(expected.steps.slice(0, 2));
682
+
683
+ for (const step of tabbed) {
684
+ expect(
685
+ (step.variants || []).map((variant: SetupGuideStepVariant): string => {
686
+ return variant.label;
687
+ }),
688
+ ).toEqual(expected.shapes);
689
+ }
690
+
691
+ // The intro explains the tabs in the order they appear.
692
+ const intro: string = guide.intro || "";
693
+ expect(intro).toContain("picking one switches every step");
694
+ expect(intro.indexOf(`**${expected.shapes[0]}**`)).toBeGreaterThan(-1);
695
+ expect(intro.indexOf(`**${expected.shapes[0]}**`)).toBeLessThan(
696
+ intro.indexOf(`**${expected.shapes[1]}**`),
697
+ );
698
+ });
699
+
700
+ test("shows only this platform's instructions", () => {
701
+ for (const text of expected.exclusive) {
702
+ expect({ platform, text, present: markdown.includes(text) }).toEqual({
703
+ platform,
704
+ text,
705
+ present: true,
706
+ });
707
+ }
708
+
709
+ for (const other of PLATFORMS) {
710
+ if (other === platform) {
711
+ continue;
712
+ }
713
+ for (const text of EXPECTED[other].exclusive) {
714
+ expect({
715
+ platform,
716
+ from: other,
717
+ text,
718
+ present: markdown.includes(text),
719
+ }).toEqual({ platform, from: other, text, present: false });
720
+ }
721
+ }
722
+ });
723
+
724
+ test("folds networking, identification and what the environment shows under Advanced", () => {
725
+ expect(titlesOf(guide.advanced)).toEqual(expected.advanced);
726
+
727
+ const networking: SetupGuideTopic = topicOf(
728
+ guide.advanced,
729
+ "Networking and permissions",
730
+ );
731
+ expect(networking.markdown).toContain(`\`${ONEUPTIME_HOST}\``);
732
+ expect(networking.markdown).toContain("443");
733
+
734
+ // Networking is reference, not a first-run step.
735
+ for (const step of guide.steps) {
736
+ expect(step.title).not.toMatch(/network/i);
737
+ }
738
+ });
739
+
740
+ test("every Advanced topic has a plain one-line summary", () => {
741
+ for (const topic of guide.advanced || []) {
742
+ expect(topic.summary).toBeTruthy();
743
+ expect(topic.summary).not.toContain("\n");
744
+ expect(topic.summary).not.toMatch(MARKDOWN_CHARACTERS);
745
+ expect(topic.markdown.trim().length).toBeGreaterThan(0);
746
+ }
747
+ });
748
+
749
+ test("says which attribute names an instance, in the order ingest reads them", () => {
750
+ const shows: string = topicOf(
751
+ guide.advanced,
752
+ "What the environment shows",
753
+ ).markdown;
754
+ const instances: string =
755
+ shows.split("\n").find((line: string): boolean => {
756
+ return line.startsWith("- **Instances**");
757
+ }) || "";
758
+ const attribute: string = `\`${descriptor.instanceAttribute}\``;
759
+ const serviceInstanceId: string = "`service.instance.id`";
760
+
761
+ expect(instances).toContain(attribute);
762
+
763
+ const platformFirst: boolean =
764
+ CLOUD_INSTANCE_IDENTITY_ATTRIBUTES.indexOf(descriptor.instanceAttribute) <
765
+ CLOUD_INSTANCE_IDENTITY_ATTRIBUTES.indexOf("service.instance.id");
766
+
767
+ if (platformFirst) {
768
+ expect(instances.indexOf(attribute)).toBeLessThan(
769
+ instances.indexOf(serviceInstanceId),
770
+ );
771
+ } else {
772
+ /*
773
+ * service.instance.id is read first on these platforms, so it is
774
+ * never "only when the platform sets none" — the line either puts it
775
+ * first or says the collector drops it.
776
+ */
777
+ expect(instances).not.toContain("when the platform sets none");
778
+ expect(
779
+ instances.indexOf(serviceInstanceId) < instances.indexOf(attribute) ||
780
+ instances.includes("dropped"),
781
+ ).toBe(true);
782
+ }
783
+ });
784
+
785
+ test("troubleshooting is titled by symptom and ends at the shared troubleshooting page", () => {
786
+ expect(titlesOf(guide.troubleshooting)).toEqual(expected.troubleshooting);
787
+
788
+ const last: SetupGuideTopic = (guide.troubleshooting || [])[
789
+ (guide.troubleshooting || []).length - 1
790
+ ]!;
791
+ expect(last.markdown).toContain(`](${CLOUD_TROUBLESHOOTING_URL})`);
792
+ expect(last.markdown).toContain(`\`cloud.platform=${platform}\``);
793
+ });
794
+
795
+ test("links to the platform's docs page and the troubleshooting page", () => {
796
+ expect(guide.links).toEqual([
797
+ {
798
+ title: `${descriptor.productName} documentation`,
799
+ url: descriptor.docsUrl,
800
+ },
801
+ { title: "Cloud troubleshooting", url: CLOUD_TROUBLESHOOTING_URL },
802
+ ]);
803
+ });
804
+
805
+ test("every /docs link it makes is a page on disk", () => {
806
+ const targets: Array<string> = [
807
+ ...(guide.links || []).map((link: { url: string }): string => {
808
+ return link.url;
809
+ }),
810
+ ...Array.from(
811
+ markdown.matchAll(/\]\((\/docs\/[^)#]+)(?:#[^)]*)?\)/g),
812
+ ).map((match: RegExpMatchArray): string => {
813
+ return match[1]!;
814
+ }),
815
+ ];
816
+ expect(targets.length).toBeGreaterThan(0);
817
+ for (const target of targets) {
818
+ expect({ target, exists: fs.existsSync(docsFileFor(target)) }).toEqual({
819
+ target,
820
+ exists: true,
821
+ });
822
+ }
823
+ });
824
+
825
+ test("closes every code fence", () => {
826
+ const fences: number = markdown
827
+ .split("\n")
828
+ .filter((line: string): boolean => {
829
+ return line.trimStart().startsWith("```");
830
+ }).length;
831
+ expect(fences % 2).toBe(0);
832
+ expect(fences).toBeGreaterThan(0);
833
+ });
834
+ });
835
+
836
+ describe("the two shapes", () => {
837
+ const SHAPED: Array<ManagedCloudPlatform> = PLATFORMS.filter(
838
+ (platform: ManagedCloudPlatform): boolean => {
839
+ return EXPECTED[platform].shapes.length > 0;
840
+ },
841
+ );
842
+
843
+ test("are offered on ECS, Cloud Run and Container Apps", () => {
844
+ expect(SHAPED).toEqual([
845
+ ManagedCloudPlatform.AwsEcs,
846
+ ManagedCloudPlatform.GcpCloudRun,
847
+ ManagedCloudPlatform.AzureContainerApps,
848
+ ]);
849
+ });
850
+
851
+ test.each(SHAPED)(
852
+ "%s: the collector's secret is the bare token, the SDK's the whole header",
853
+ (platform: ManagedCloudPlatform) => {
854
+ const secret: SetupGuideStep = guideFor(platform).steps[0]!;
855
+ const sidecar: string = variantOf(secret, SIDECAR);
856
+ const sdk: string = variantOf(secret, SDK);
857
+
858
+ expect(sidecar).toContain(KEY);
859
+ expect(sidecar).not.toContain(`x-oneuptime-token=${KEY}`);
860
+ expect(sdk).toContain(`x-oneuptime-token=${KEY}`);
861
+ },
862
+ );
863
+
864
+ test.each(SHAPED)(
865
+ "%s: the sidecar tab points the app at localhost and carries the collector configuration",
866
+ (platform: ManagedCloudPlatform) => {
867
+ const configure: SetupGuideStep = guideFor(platform).steps[1]!;
868
+ const sidecar: string = variantOf(configure, SIDECAR);
869
+
870
+ expect(sidecar).toContain(
871
+ "OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318",
872
+ );
873
+ expect(sidecar).toContain("--config=env:OTEL_COLLECTOR_CONFIG");
874
+ expect(sidecar).toContain("otel/opentelemetry-collector-contrib:latest");
875
+ expect(sidecar).toContain("ONEUPTIME_TOKEN");
876
+ expect(collectorConfigsOf(sidecar)).toHaveLength(1);
877
+ // The app never sees the token: only the collector holds it.
878
+ expect(sidecar).not.toContain(`x-oneuptime-token=${KEY}`);
879
+ },
880
+ );
881
+
882
+ test.each(SHAPED)(
883
+ "%s: the SDK-direct tab exports straight to OneUptime with the header from the secret",
884
+ (platform: ManagedCloudPlatform) => {
885
+ const configure: SetupGuideStep = guideFor(platform).steps[1]!;
886
+ const sdk: string = variantOf(configure, SDK);
887
+
888
+ expect(sdk).toContain(
889
+ `OTEL_EXPORTER_OTLP_ENDPOINT=${ONEUPTIME_URL}/otlp`,
890
+ );
891
+ expect(sdk).toContain("OTEL_EXPORTER_OTLP_HEADERS");
892
+ expect(sdk).toContain("OTEL_NODE_RESOURCE_DETECTORS=");
893
+ expect(collectorConfigsOf(sdk)).toEqual([]);
894
+ expect(sdk).not.toContain("localhost:4318");
895
+ },
896
+ );
897
+
898
+ test("ECS: the sidecar ships per-task CPU / memory, which SDK direct cannot", () => {
899
+ const guide: SetupGuideContent = guideFor(ManagedCloudPlatform.AwsEcs);
900
+ const configure: SetupGuideStep = guide.steps[1]!;
901
+
902
+ expect(variantOf(configure, SIDECAR)).toContain("awsecscontainermetrics");
903
+ expect(variantOf(configure, SDK)).not.toContain("awsecscontainermetrics");
904
+ expect(
905
+ topicOf(guide.advanced, "What the environment shows").markdown,
906
+ ).toContain("SDK direct ships no container metrics");
907
+ expect(guide.intro).toContain("Most teams end up here.");
908
+ });
909
+
910
+ test("ECS: both tabs remind the execution role to read the secret", () => {
911
+ const secret: SetupGuideStep = guideFor(ManagedCloudPlatform.AwsEcs)
912
+ .steps[0]!;
913
+ for (const label of [SIDECAR, SDK]) {
914
+ const tab: string = variantOf(secret, label);
915
+ expect(tab).toContain("secretsmanager:GetSecretValue");
916
+ expect(tab).toContain("`kms:Decrypt`");
917
+ expect(tab).toContain("`unable to pull secrets`");
918
+ }
919
+ });
920
+
921
+ test("the SDK-direct tabs turn on the platform's detector in every language", () => {
922
+ const ecs: string = variantOf(
923
+ guideFor(ManagedCloudPlatform.AwsEcs).steps[1]!,
924
+ SDK,
925
+ );
926
+ for (const text of [
927
+ "OTEL_NODE_RESOURCE_DETECTORS=env,host,os,aws",
928
+ "OTEL_EXPERIMENTAL_RESOURCE_DETECTORS=aws_ecs",
929
+ "opentelemetry-sdk-extension-aws",
930
+ "-Dotel.resource.providers.aws.enabled=true",
931
+ "go.opentelemetry.io/contrib/detectors/aws/ecs",
932
+ "AddAWSECSDetector()",
933
+ ]) {
934
+ expect(ecs).toContain(text);
935
+ }
936
+
937
+ const run: string = variantOf(
938
+ guideFor(ManagedCloudPlatform.GcpCloudRun).steps[1]!,
939
+ SDK,
940
+ );
941
+ for (const text of [
942
+ "OTEL_NODE_RESOURCE_DETECTORS=env,host,os,gcp",
943
+ "OTEL_EXPERIMENTAL_RESOURCE_DETECTORS=gcp_resource_detector",
944
+ "opentelemetry-resourcedetector-gcp",
945
+ "-Dotel.resource.providers.gcp.enabled=true",
946
+ "go.opentelemetry.io/contrib/detectors/gcp",
947
+ "AddGcpDetector()",
948
+ ]) {
949
+ expect(run).toContain(text);
950
+ }
951
+
952
+ const aca: string = variantOf(
953
+ guideFor(ManagedCloudPlatform.AzureContainerApps).steps[1]!,
954
+ SDK,
955
+ );
956
+ for (const text of [
957
+ "OTEL_NODE_RESOURCE_DETECTORS=env,host,os",
958
+ "AddAzureContainerAppsDetector()",
959
+ "CONTAINER_APP_REPLICA_NAME",
960
+ ]) {
961
+ expect(aca).toContain(text);
962
+ }
963
+ });
964
+
965
+ test("Cloud Run: the CLI keeps the detector list whole with the ^@^ separator", () => {
966
+ const sdk: string = variantOf(
967
+ guideFor(ManagedCloudPlatform.GcpCloudRun).steps[1]!,
968
+ SDK,
969
+ );
970
+ expect(sdk).toContain(
971
+ `--set-env-vars "^@^OTEL_SERVICE_NAME=checkout-api@OTEL_EXPORTER_OTLP_ENDPOINT=${ONEUPTIME_URL}/otlp@OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf@OTEL_NODE_RESOURCE_DETECTORS=env,host,os,gcp"`,
972
+ );
973
+ expect(sdk).toContain(
974
+ '--set-secrets "OTEL_EXPORTER_OTLP_HEADERS=oneuptime-otlp-headers:latest"',
975
+ );
976
+ });
977
+
978
+ test("Container Apps: the sidecar sets region and subscription for the collector's env detector", () => {
979
+ const sidecar: string = variantOf(
980
+ guideFor(ManagedCloudPlatform.AzureContainerApps).steps[1]!,
981
+ SIDECAR,
982
+ );
983
+ expect(sidecar).toContain(
984
+ "OTEL_RESOURCE_ATTRIBUTES=cloud.provider=azure,cloud.platform=azure_container_apps,cloud.region=eastus,cloud.account.id=00000000-0000-0000-0000-000000000000",
985
+ );
986
+ expect(sidecar).toContain("secretRef");
987
+ expect(sidecar).toContain("--yaml checkout-api.yaml");
988
+ });
989
+ });
990
+
991
+ describe("the collector configurations", () => {
992
+ const configs: Array<{ platform: ManagedCloudPlatform; body: string }> =
993
+ PLATFORMS.flatMap(
994
+ (
995
+ platform: ManagedCloudPlatform,
996
+ ): Array<{ platform: ManagedCloudPlatform; body: string }> => {
997
+ return collectorConfigsOf(
998
+ getSetupGuideMarkdown(guideFor(platform)),
999
+ ).map(
1000
+ (body: string): { platform: ManagedCloudPlatform; body: string } => {
1001
+ return { platform, body };
1002
+ },
1003
+ );
1004
+ },
1005
+ );
1006
+
1007
+ test("are found on the platforms that run a collector (harness guard)", () => {
1008
+ expect(
1009
+ Array.from(
1010
+ new Set(
1011
+ configs.map(
1012
+ (config: {
1013
+ platform: ManagedCloudPlatform;
1014
+ body: string;
1015
+ }): string => {
1016
+ return config.platform;
1017
+ },
1018
+ ),
1019
+ ),
1020
+ ),
1021
+ ).toEqual([
1022
+ ManagedCloudPlatform.AwsEcs,
1023
+ ManagedCloudPlatform.AwsElasticBeanstalk,
1024
+ ManagedCloudPlatform.GcpCloudRun,
1025
+ ManagedCloudPlatform.AzureContainerApps,
1026
+ ]);
1027
+ });
1028
+
1029
+ test.each(configs)(
1030
+ "$platform: valid YAML whose pipelines only use what it defines",
1031
+ (config: { platform: ManagedCloudPlatform; body: string }) => {
1032
+ const parsed: YamlMap = asMap(yaml.load(config.body));
1033
+ const receivers: YamlMap = asMap(parsed["receivers"]);
1034
+ const processors: YamlMap = asMap(parsed["processors"]);
1035
+ const exporters: YamlMap = asMap(parsed["exporters"]);
1036
+ const service: YamlMap = asMap(parsed["service"]);
1037
+ const pipelines: YamlMap = asMap(service["pipelines"]);
1038
+
1039
+ expect(Object.keys(pipelines).sort()).toEqual([
1040
+ "logs",
1041
+ "metrics",
1042
+ "traces",
1043
+ ]);
1044
+ // The one exporter every pipeline names is the one the config defines.
1045
+ expect(Object.keys(exporters)).toEqual(["otlphttp/oneuptime"]);
1046
+
1047
+ for (const [name, value] of Object.entries(pipelines)) {
1048
+ const pipeline: YamlMap = asMap(value);
1049
+ const pipelineProcessors: Array<string> = pipeline[
1050
+ "processors"
1051
+ ] as Array<string>;
1052
+
1053
+ for (const receiver of pipeline["receivers"] as Array<string>) {
1054
+ expect({ name, receiver, defined: receiver in receivers }).toEqual({
1055
+ name,
1056
+ receiver,
1057
+ defined: true,
1058
+ });
1059
+ }
1060
+ for (const processor of pipelineProcessors) {
1061
+ expect({ name, processor, defined: processor in processors }).toEqual(
1062
+ { name, processor, defined: true },
1063
+ );
1064
+ }
1065
+ expect(pipeline["exporters"]).toEqual(["otlphttp/oneuptime"]);
1066
+
1067
+ // cloud.* is stamped first and batching happens last, everywhere.
1068
+ expect(pipelineProcessors[0]).toBe("resourcedetection");
1069
+ expect(pipelineProcessors[pipelineProcessors.length - 1]).toBe("batch");
1070
+ }
1071
+
1072
+ for (const extension of (service["extensions"] as Array<string>) || []) {
1073
+ expect(asMap(parsed["extensions"])).toHaveProperty(extension);
1074
+ }
1075
+
1076
+ expect(asMap(receivers["otlp"])).toEqual({
1077
+ protocols: {
1078
+ http: { endpoint: "0.0.0.0:4318" },
1079
+ grpc: { endpoint: "0.0.0.0:4317" },
1080
+ },
1081
+ });
1082
+ },
1083
+ );
1084
+
1085
+ test.each(configs)(
1086
+ "$platform: exports to the reader's OTLP endpoint with the token from the environment",
1087
+ (config: { platform: ManagedCloudPlatform; body: string }) => {
1088
+ const parsed: YamlMap = asMap(yaml.load(config.body));
1089
+ const exporter: YamlMap = asMap(
1090
+ asMap(parsed["exporters"])["otlphttp/oneuptime"],
1091
+ );
1092
+
1093
+ expect(exporter).toEqual({
1094
+ endpoint: `${ONEUPTIME_URL}/otlp`,
1095
+ headers: { "x-oneuptime-token": "${env:ONEUPTIME_TOKEN}" },
1096
+ });
1097
+ // The default protobuf encoding: no JSON encoder, no JSON Content-Type.
1098
+ expect(config.body).not.toMatch(/encoding\s*:/);
1099
+ expect(config.body).not.toMatch(/content-type/i);
1100
+ // The token is never written into the configuration itself.
1101
+ expect(config.body).not.toContain(KEY);
1102
+ },
1103
+ );
1104
+
1105
+ const configOf: (platform: ManagedCloudPlatform) => YamlMap = (
1106
+ platform: ManagedCloudPlatform,
1107
+ ): YamlMap => {
1108
+ const config: { platform: ManagedCloudPlatform; body: string } | undefined =
1109
+ configs.find(
1110
+ (candidate: {
1111
+ platform: ManagedCloudPlatform;
1112
+ body: string;
1113
+ }): boolean => {
1114
+ return candidate.platform === platform;
1115
+ },
1116
+ );
1117
+ return asMap(yaml.load(config!.body));
1118
+ };
1119
+
1120
+ const resourcedetectionOf: (platform: ManagedCloudPlatform) => YamlMap = (
1121
+ platform: ManagedCloudPlatform,
1122
+ ): YamlMap => {
1123
+ return asMap(asMap(configOf(platform)["processors"])["resourcedetection"]);
1124
+ };
1125
+
1126
+ test("ECS: the ecs detector, and the container-metrics receiver in the metrics pipeline", () => {
1127
+ const config: YamlMap = configOf(ManagedCloudPlatform.AwsEcs);
1128
+ expect(
1129
+ resourcedetectionOf(ManagedCloudPlatform.AwsEcs)["detectors"],
1130
+ ).toEqual(["env", "ecs"]);
1131
+ expect(asMap(config["receivers"])["awsecscontainermetrics"]).toEqual({
1132
+ collection_interval: "20s",
1133
+ });
1134
+ const pipelines: YamlMap = asMap(asMap(config["service"])["pipelines"]);
1135
+ expect(asMap(pipelines["metrics"])["receivers"]).toEqual([
1136
+ "otlp",
1137
+ "awsecscontainermetrics",
1138
+ ]);
1139
+ });
1140
+
1141
+ test("Cloud Run: the gcp detector, and a health check for the startup probe on 13133", () => {
1142
+ const config: YamlMap = configOf(ManagedCloudPlatform.GcpCloudRun);
1143
+ expect(
1144
+ resourcedetectionOf(ManagedCloudPlatform.GcpCloudRun)["detectors"],
1145
+ ).toEqual(["env", "gcp"]);
1146
+ expect(asMap(config["extensions"])["health_check"]).toEqual({
1147
+ endpoint: "0.0.0.0:13133",
1148
+ });
1149
+ expect(asMap(config["service"])["extensions"]).toEqual(["health_check"]);
1150
+
1151
+ const sidecar: string = variantOf(
1152
+ guideFor(ManagedCloudPlatform.GcpCloudRun).steps[1]!,
1153
+ SIDECAR,
1154
+ );
1155
+ expect(sidecar).toContain("startup probe HTTP `/` port `13133`");
1156
+ });
1157
+
1158
+ test("Container Apps: env plus azurecontainerapps, keeping the application's service.name", () => {
1159
+ const detection: YamlMap = resourcedetectionOf(
1160
+ ManagedCloudPlatform.AzureContainerApps,
1161
+ );
1162
+ expect(detection["detectors"]).toEqual(["env", "azurecontainerapps"]);
1163
+ expect(detection["override"]).toBe(false);
1164
+ });
1165
+
1166
+ test("Beanstalk: elastic_beanstalk ahead of ec2, and the deployment-level service.instance.id dropped", () => {
1167
+ const config: YamlMap = configOf(ManagedCloudPlatform.AwsElasticBeanstalk);
1168
+ expect(
1169
+ resourcedetectionOf(ManagedCloudPlatform.AwsElasticBeanstalk)[
1170
+ "detectors"
1171
+ ],
1172
+ ).toEqual(["env", "elastic_beanstalk", "ec2"]);
1173
+ expect(asMap(config["processors"])["resource"]).toEqual({
1174
+ attributes: [{ key: "service.instance.id", action: "delete" }],
1175
+ });
1176
+
1177
+ const pipelines: YamlMap = asMap(asMap(config["service"])["pipelines"]);
1178
+ for (const pipeline of Object.values(pipelines)) {
1179
+ expect(asMap(pipeline)["processors"]).toEqual([
1180
+ "resourcedetection",
1181
+ "resource",
1182
+ "batch",
1183
+ ]);
1184
+ }
1185
+ });
1186
+ });
1187
+
1188
+ describe("against the platform's docs page", () => {
1189
+ /*
1190
+ * The in-app guide is the condensed version of the docs page it links
1191
+ * to. Where the two name the same switch, attribute line or console path,
1192
+ * they must say the same thing, or one of them is wrong.
1193
+ */
1194
+ const DETECTOR_SETTINGS: Array<RegExp> = [
1195
+ /detectors: \[[^\]]*\]/g,
1196
+ /OTEL_NODE_RESOURCE_DETECTORS(?:=|: )[a-z,]+/g,
1197
+ /OTEL_EXPERIMENTAL_RESOURCE_DETECTORS=[a-z_]+/g,
1198
+ /-Dotel\.resource\.providers\.[a-z]+\.enabled=true/g,
1199
+ /go\.opentelemetry\.io\/contrib\/detectors\/[a-z/]+/g,
1200
+ /OpenTelemetry\.Resources\.[A-Za-z]+/g,
1201
+ /opentelemetry-(?:sdk-extension|resourcedetector)-[a-z]+/g,
1202
+ /Add[A-Za-z]+Detector\(\)/g,
1203
+ ];
1204
+
1205
+ test.each(PLATFORMS)(
1206
+ "%s: every resource detector setting the guide names is on the docs page",
1207
+ (platform: ManagedCloudPlatform) => {
1208
+ const markdown: string = getSetupGuideMarkdown(guideFor(platform));
1209
+ const page: string = docsPageOf(platform);
1210
+ const found: Array<string> = DETECTOR_SETTINGS.flatMap(
1211
+ (pattern: RegExp): Array<string> => {
1212
+ return Array.from(markdown.matchAll(pattern)).map(
1213
+ (match: RegExpMatchArray): string => {
1214
+ return match[0];
1215
+ },
1216
+ );
1217
+ },
1218
+ );
1219
+
1220
+ expect(found.length).toBeGreaterThan(0);
1221
+ for (const setting of found) {
1222
+ expect({ platform, setting, onPage: page.includes(setting) }).toEqual({
1223
+ platform,
1224
+ setting,
1225
+ onPage: true,
1226
+ });
1227
+ }
1228
+ },
1229
+ );
1230
+
1231
+ test.each(PLATFORMS)(
1232
+ "%s: attributes set by hand are the docs page's, and name only this platform",
1233
+ (platform: ManagedCloudPlatform) => {
1234
+ const page: string = docsPageOf(platform);
1235
+ const values: Array<string> = getSetupGuideCodeBlocks(
1236
+ guideFor(platform),
1237
+ ).flatMap((block: string): Array<string> => {
1238
+ return Array.from(
1239
+ block.matchAll(/OTEL_RESOURCE_ATTRIBUTES=([^"\s]+)/g),
1240
+ ).map((match: RegExpMatchArray): string => {
1241
+ return match[1]!;
1242
+ });
1243
+ });
1244
+
1245
+ for (const value of values) {
1246
+ expect({ platform, value, onPage: page.includes(value) }).toEqual({
1247
+ platform,
1248
+ value,
1249
+ onPage: true,
1250
+ });
1251
+ for (const [, named] of value.matchAll(/cloud\.platform=([a-z_]+)/g)) {
1252
+ expect(named).toBe(platform);
1253
+ }
1254
+ }
1255
+ },
1256
+ );
1257
+
1258
+ test("the platforms with no detector set their attributes by hand (harness guard)", () => {
1259
+ for (const platform of [
1260
+ ManagedCloudPlatform.AwsAppRunner,
1261
+ ManagedCloudPlatform.AzureContainerInstances,
1262
+ ManagedCloudPlatform.AzureContainerApps,
1263
+ ManagedCloudPlatform.AzureAppService,
1264
+ ]) {
1265
+ expect(getSetupGuideCodeBlocks(guideFor(platform)).join("\n")).toContain(
1266
+ "OTEL_RESOURCE_ATTRIBUTES=",
1267
+ );
1268
+ }
1269
+ });
1270
+
1271
+ const CONSOLE_PATH: RegExp =
1272
+ /\*\*(?:AWS Console|Google Cloud console|Azure portal) → [^*]+\*\*/g;
1273
+
1274
+ const consolePathsOf: (platform: ManagedCloudPlatform) => Array<string> = (
1275
+ platform: ManagedCloudPlatform,
1276
+ ): Array<string> => {
1277
+ return Array.from(
1278
+ getSetupGuideMarkdown(guideFor(platform)).matchAll(CONSOLE_PATH),
1279
+ ).map((match: RegExpMatchArray): string => {
1280
+ return match[0];
1281
+ });
1282
+ };
1283
+
1284
+ test.each(PLATFORMS)(
1285
+ "%s: the console paths are the docs page's",
1286
+ (platform: ManagedCloudPlatform) => {
1287
+ const page: string = docsPageOf(platform);
1288
+ for (const consolePath of consolePathsOf(platform)) {
1289
+ expect({
1290
+ platform,
1291
+ consolePath,
1292
+ onPage: page.includes(consolePath),
1293
+ }).toEqual({ platform, consolePath, onPage: true });
1294
+ }
1295
+ },
1296
+ );
1297
+
1298
+ test("every platform with a console walks it from the console's home (harness guard)", () => {
1299
+ const withoutConsole: Array<ManagedCloudPlatform> = PLATFORMS.filter(
1300
+ (platform: ManagedCloudPlatform): boolean => {
1301
+ return consolePathsOf(platform).length === 0;
1302
+ },
1303
+ );
1304
+ // App Engine's settings live in app.yaml, not in a console form.
1305
+ expect(withoutConsole).toEqual([ManagedCloudPlatform.GcpAppEngine]);
1306
+ });
1307
+ });
1308
+
1309
+ describe("before a key is picked", () => {
1310
+ test.each(PLATFORMS)(
1311
+ "%s: the first step shows the placeholder and says where to pick a key",
1312
+ (platform: ManagedCloudPlatform) => {
1313
+ const guide: SetupGuideContent = guideFor(platform, {
1314
+ apiKey: SETUP_GUIDE_API_KEY_PLACEHOLDER,
1315
+ });
1316
+ const first: string = stepText(guide.steps[0]!);
1317
+
1318
+ expect(first).toContain(PICK_KEY_NOTE);
1319
+ expect(first).toContain(SETUP_GUIDE_API_KEY_PLACEHOLDER);
1320
+ // Once, on the step that stores the token.
1321
+ expect(getSetupGuideMarkdown(guide).split(PICK_KEY_NOTE).length - 1).toBe(
1322
+ 1,
1323
+ );
1324
+ },
1325
+ );
1326
+
1327
+ test.each(PLATFORMS)(
1328
+ "%s: no command hands a placeholder to the shell unquoted",
1329
+ (platform: ManagedCloudPlatform) => {
1330
+ const guide: SetupGuideContent = guideFor(platform, {
1331
+ oneuptimeUrl: SETUP_GUIDE_URL_PLACEHOLDER,
1332
+ apiKey: SETUP_GUIDE_API_KEY_PLACEHOLDER,
1333
+ });
1334
+ const commands: Array<string> = commandBlocksOf(
1335
+ getSetupGuideMarkdown(guide),
1336
+ );
1337
+
1338
+ expect(commands.length).toBeGreaterThan(0);
1339
+ for (const command of commands) {
1340
+ expect({
1341
+ platform,
1342
+ command,
1343
+ unquoted: unquotedShellText(command),
1344
+ }).toEqual({
1345
+ platform,
1346
+ command,
1347
+ unquoted: expect.not.stringContaining("<YOUR_"),
1348
+ });
1349
+ }
1350
+ },
1351
+ );
1352
+
1353
+ test("the placeholder URL keeps the /otlp path and the host-only snippets", () => {
1354
+ const aca: string = getSetupGuideMarkdown(
1355
+ guideFor(ManagedCloudPlatform.AzureContainerApps, {
1356
+ oneuptimeUrl: SETUP_GUIDE_URL_PLACEHOLDER,
1357
+ }),
1358
+ );
1359
+ expect(aca).toContain(`${SETUP_GUIDE_URL_PLACEHOLDER}/otlp`);
1360
+ expect(aca).toContain(`--endpoint '${SETUP_GUIDE_URL_PLACEHOLDER}:443'`);
1361
+ expect(aca).toContain(`\`${SETUP_GUIDE_URL_PLACEHOLDER}\``);
1362
+ });
1363
+ });
1364
+
1365
+ /*
1366
+ * Facts the guide carried before it moved to the picker layout, pinned by
1367
+ * the old CloudDocumentationMarkdown.test.ts, kept where they now live.
1368
+ */
1369
+ describe("the platform facts the guide has always carried", () => {
1370
+ test("ECS: Secrets Manager, the sidecar's command and token, the detector and egress", () => {
1371
+ const ecs: string = getSetupGuideMarkdown(
1372
+ guideFor(ManagedCloudPlatform.AwsEcs),
1373
+ );
1374
+ expect(ecs).toContain("secretsmanager:GetSecretValue");
1375
+ expect(ecs).toContain("--config=env:OTEL_COLLECTOR_CONFIG");
1376
+ expect(ecs).toContain("${env:ONEUPTIME_TOKEN}");
1377
+ expect(ecs).toContain("http://localhost:4318");
1378
+ expect(ecs).toContain("assignPublicIp=ENABLED");
1379
+ expect(ecs).toContain(`TCP 443 to \`${ONEUPTIME_HOST}\``);
1380
+ expect(ecs).toContain("OTEL_NODE_RESOURCE_DETECTORS=env,host,os,aws");
1381
+ });
1382
+
1383
+ test("Cloud Run: secretAccessor, container dependencies, Cloud NAT and the Serverless overlap", () => {
1384
+ const run: string = getSetupGuideMarkdown(
1385
+ guideFor(ManagedCloudPlatform.GcpCloudRun),
1386
+ );
1387
+ expect(run).toContain("roles/secretmanager.secretAccessor");
1388
+ expect(run).toContain("`Permission denied on secret`");
1389
+ expect(run).toContain("run.googleapis.com/container-dependencies");
1390
+ expect(run).toContain("**Cloud NAT**");
1391
+ expect(run).toContain("**Serverless Functions**");
1392
+ expect(run).toContain("`faas.name`");
1393
+ });
1394
+
1395
+ test("Container Apps: secrets, secretref, the replica name, hand-set attributes and the gRPC agent", () => {
1396
+ const aca: string = getSetupGuideMarkdown(
1397
+ guideFor(ManagedCloudPlatform.AzureContainerApps),
1398
+ );
1399
+ expect(aca).toContain("az containerapp secret set");
1400
+ expect(aca).toContain("--set-env-vars");
1401
+ expect(aca).toContain("secretref:");
1402
+ expect(aca).toContain("CONTAINER_APP_REPLICA_NAME");
1403
+ expect(aca).toContain("override: false");
1404
+ expect(aca).toContain("`azure.container_app.instance.id`");
1405
+ expect(aca).toContain(
1406
+ "cloud.provider=azure,cloud.platform=azure_container_apps,cloud.region=",
1407
+ );
1408
+ // The managed agent is gRPC-only, so it targets the host on 443, not /otlp.
1409
+ expect(aca).toContain(`--endpoint ${ONEUPTIME_HOST}:443`);
1410
+ expect(aca).toContain("`azure.container_apps`");
1411
+ });
1412
+
1413
+ test("Beanstalk, App Runner, App Engine, App Service and Container Instances keep their platform notes", () => {
1414
+ const beanstalk: string = getSetupGuideMarkdown(
1415
+ guideFor(ManagedCloudPlatform.AwsElasticBeanstalk),
1416
+ );
1417
+ expect(beanstalk).toContain("keep `elastic_beanstalk` ahead of `ec2`");
1418
+ expect(beanstalk).toContain("`docker_stats` receiver");
1419
+
1420
+ const appRunner: string = getSetupGuideMarkdown(
1421
+ guideFor(ManagedCloudPlatform.AwsAppRunner),
1422
+ );
1423
+ expect(appRunner).toContain("not the access role that pulls the image");
1424
+ expect(appRunner).toContain("**Outgoing network traffic: Custom VPC**");
1425
+
1426
+ const appEngine: string = getSetupGuideMarkdown(
1427
+ guideFor(ManagedCloudPlatform.GcpAppEngine),
1428
+ );
1429
+ expect(appEngine).toContain("runtime: nodejs22");
1430
+ expect(appEngine).toContain("do not commit the real value");
1431
+ expect(appEngine).toContain("Flexible environment instances");
1432
+
1433
+ const appService: string = getSetupGuideMarkdown(
1434
+ guideFor(ManagedCloudPlatform.AzureAppService),
1435
+ );
1436
+ expect(appService).toContain("**system-assigned managed identity**");
1437
+ expect(appService).toContain("`azure.app_service`");
1438
+ expect(appService).toContain("**Route All**");
1439
+
1440
+ const aci: string = getSetupGuideMarkdown(
1441
+ guideFor(ManagedCloudPlatform.AzureContainerInstances),
1442
+ );
1443
+ expect(aci).toContain("fixed at creation");
1444
+ expect(aci).toContain("`detectors: [env]`");
1445
+ });
1446
+ });
1447
+
1448
+ describe("the host in the networking and managed-agent snippets", () => {
1449
+ test("is the OneUptime host without its scheme", () => {
1450
+ const ecs: SetupGuideContent = guideFor(ManagedCloudPlatform.AwsEcs);
1451
+ expect(
1452
+ topicOf(ecs.advanced, "Networking and permissions").markdown,
1453
+ ).toContain(`TCP 443 to \`${ONEUPTIME_HOST}\``);
1454
+
1455
+ const agent: string = topicOf(
1456
+ guideFor(ManagedCloudPlatform.AzureContainerApps).advanced,
1457
+ "Use the environment's managed OpenTelemetry agent",
1458
+ ).markdown;
1459
+ expect(agent).toContain(`--endpoint ${ONEUPTIME_HOST}:443`);
1460
+ expect(agent).toContain(`--headers "x-oneuptime-token=${KEY}"`);
1461
+ expect(agent).toContain("**gRPC only**");
1462
+ });
1463
+ });