@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,1183 @@
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
+ DEFAULT_HOST_INSTALL_METHOD,
7
+ HOST_INSTALL_METHODS,
8
+ HostInstallMethod,
9
+ NATIVE_LINUX_INSTALL_METHODS,
10
+ getHostCollectorConfig,
11
+ getHostSetupGuide,
12
+ resolveHostInstallMethod,
13
+ } from "../../../../App/FeatureSet/Dashboard/src/Pages/Host/Utils/DocumentationMarkdown";
14
+ import { MIN_OTELCOL_CONTRIB_VERSION } from "../../../../App/FeatureSet/Dashboard/src/Pages/Host/Utils/SystemdUnits";
15
+ import {
16
+ KUBERNETES_AGENT_HELM_RELEASE,
17
+ getKubernetesSetupGuide,
18
+ } from "../../../../App/FeatureSet/Dashboard/src/Pages/Kubernetes/Utils/DocumentationMarkdown";
19
+ import {
20
+ SETUP_GUIDE_API_KEY_PLACEHOLDER,
21
+ SETUP_GUIDE_URL_PLACEHOLDER,
22
+ SetupGuideContent,
23
+ SetupGuideOption,
24
+ SetupGuideStep,
25
+ SetupGuideTopic,
26
+ getSetupGuideCodeBlocks,
27
+ getSetupGuideMarkdown,
28
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/SetupGuide/SetupGuide";
29
+ import ExceptionCode from "../../../Types/Exception/ExceptionCode";
30
+
31
+ /*
32
+ * The host guide asks how the OpenTelemetry Collector gets onto the host,
33
+ * then shows only that method's steps: save the shared config.yaml, install
34
+ * and start the collector, check the host appears. These tests pin, for
35
+ * every method:
36
+ *
37
+ * - that the config and every command carry the reader's URL and key;
38
+ * - that a method shows its own commands and none of another method's —
39
+ * the systemd receiver only on native Linux installs (a containerised
40
+ * collector cannot reach the host's D-Bus), PowerShell only on Windows;
41
+ * - that the setup options stay out of the first-run steps;
42
+ * - that what the guide says about host discovery, key refusals and the
43
+ * receivers' versions is what ingest and the docs site actually say.
44
+ */
45
+
46
+ type YamlMap = Record<string, any>;
47
+
48
+ const REPO_ROOT: string = path.resolve(__dirname, "../../../../..");
49
+
50
+ const readRepoFile: (relativePath: string) => string = (
51
+ relativePath: string,
52
+ ): string => {
53
+ return fs.readFileSync(path.join(REPO_ROOT, relativePath), "utf8");
54
+ };
55
+
56
+ const squash: (text: string) => string = (text: string): string => {
57
+ return text.replace(/\s+/g, " ");
58
+ };
59
+
60
+ const HOST_DOCS_PAGE: string =
61
+ "packages/App/FeatureSet/Docs/Content/en/telemetry/host-otel-collector.md";
62
+
63
+ const URL: string = "https://oneuptime.example.com";
64
+ const KEY: string = "tik_secret_123";
65
+
66
+ const METHOD_KEYS: Array<HostInstallMethod> = HOST_INSTALL_METHODS.map(
67
+ (option: SetupGuideOption<HostInstallMethod>): HostInstallMethod => {
68
+ return option.key;
69
+ },
70
+ );
71
+
72
+ const NATIVE_LINUX: Array<HostInstallMethod> = [
73
+ "linux-deb",
74
+ "linux-rpm",
75
+ "linux-tarball",
76
+ ];
77
+
78
+ /*
79
+ * Every method except Kubernetes puts a collector on the host, running the
80
+ * shared config.yaml. Kubernetes installs the Kubernetes agent instead (see
81
+ * "the Kubernetes option" below).
82
+ */
83
+ type HostCollectorMethod = Exclude<HostInstallMethod, "kubernetes">;
84
+
85
+ const CONFIG_FILE_METHODS: Array<HostCollectorMethod> = METHOD_KEYS.filter(
86
+ (method: HostInstallMethod): method is HostCollectorMethod => {
87
+ return method !== "kubernetes";
88
+ },
89
+ );
90
+
91
+ const WINDOWS_INSTALL_DIR: string = "C:\\Program Files\\otelcol-contrib";
92
+
93
+ const guideFor: (
94
+ method: HostInstallMethod,
95
+ overrides?: { apiKey?: string; oneuptimeUrl?: string },
96
+ ) => SetupGuideContent = (
97
+ method: HostInstallMethod,
98
+ overrides?: { apiKey?: string; oneuptimeUrl?: string },
99
+ ): SetupGuideContent => {
100
+ return getHostSetupGuide({
101
+ oneuptimeUrl: overrides?.oneuptimeUrl ?? URL,
102
+ apiKey: overrides?.apiKey ?? KEY,
103
+ method: method,
104
+ });
105
+ };
106
+
107
+ const markdownOf: (method: HostInstallMethod) => string = (
108
+ method: HostInstallMethod,
109
+ ): string => {
110
+ return getSetupGuideMarkdown(guideFor(method));
111
+ };
112
+
113
+ const stepTitled: (
114
+ guide: SetupGuideContent,
115
+ title: string,
116
+ ) => SetupGuideStep = (
117
+ guide: SetupGuideContent,
118
+ title: string,
119
+ ): SetupGuideStep => {
120
+ const step: SetupGuideStep | undefined = guide.steps.find(
121
+ (candidate: SetupGuideStep): boolean => {
122
+ return candidate.title === title;
123
+ },
124
+ );
125
+ if (!step) {
126
+ throw new Error(`No step titled "${title}"`);
127
+ }
128
+ return step;
129
+ };
130
+
131
+ const topicTitles: (
132
+ topics: Array<SetupGuideTopic> | undefined,
133
+ ) => Array<string> = (
134
+ topics: Array<SetupGuideTopic> | undefined,
135
+ ): Array<string> => {
136
+ return (topics || []).map((topic: SetupGuideTopic): string => {
137
+ return topic.title;
138
+ });
139
+ };
140
+
141
+ const topicTitled: (
142
+ topics: Array<SetupGuideTopic> | undefined,
143
+ title: string,
144
+ ) => SetupGuideTopic | undefined = (
145
+ topics: Array<SetupGuideTopic> | undefined,
146
+ title: string,
147
+ ): SetupGuideTopic | undefined => {
148
+ return (topics || []).find((topic: SetupGuideTopic): boolean => {
149
+ return topic.title === title;
150
+ });
151
+ };
152
+
153
+ // The bodies of every fenced block of one language, in reading order.
154
+ const codeBlocksOf: (markdown: string, language: string) => Array<string> = (
155
+ markdown: string,
156
+ language: string,
157
+ ): Array<string> => {
158
+ return Array.from(
159
+ markdown.matchAll(
160
+ new RegExp(`\`\`\`${language}\\n([\\s\\S]*?)\`\`\``, "g"),
161
+ ),
162
+ ).map((match: RegExpMatchArray): string => {
163
+ return match[1] || "";
164
+ });
165
+ };
166
+
167
+ // The config the guide asks the reader to save, parsed.
168
+ const savedConfigOf: (guide: SetupGuideContent) => YamlMap = (
169
+ guide: SetupGuideContent,
170
+ ): YamlMap => {
171
+ const step: SetupGuideStep = stepTitled(guide, "Save the collector config");
172
+ const blocks: Array<string> = codeBlocksOf(step.markdown || "", "yaml");
173
+ expect(blocks).toHaveLength(1);
174
+ return yaml.load(blocks[0]!) as YamlMap;
175
+ };
176
+
177
+ /*
178
+ * Commands only one method runs. A method's guide must carry its own and
179
+ * none of the others' — that is what the picker is for.
180
+ */
181
+ const METHOD_SIGNATURES: Record<HostCollectorMethod, Array<string>> = {
182
+ docker: ["docker run -d", "--pid host", "HOST_PROC=/hostfs/proc"],
183
+ "linux-deb": [
184
+ "dpkg --print-architecture",
185
+ "sudo dpkg -i /tmp/otelcol-contrib.deb",
186
+ ],
187
+ "linux-rpm": ["sudo rpm -Uvh /tmp/otelcol-contrib.rpm"],
188
+ "linux-tarball": [
189
+ "sudo tar -xzf /tmp/otelcol.tar.gz -C /opt/otelcol-contrib",
190
+ "/etc/systemd/system/otelcol-contrib.service",
191
+ ],
192
+ macos: [
193
+ "_darwin_",
194
+ "sudo launchctl load -w /Library/LaunchDaemons/com.oneuptime.otelcol-contrib.plist",
195
+ ],
196
+ windows: ["sc.exe --% create", "Invoke-WebRequest", "Get-CimInstance"],
197
+ };
198
+
199
+ describe("the install method picker", () => {
200
+ test("offers the seven install methods, Docker first", () => {
201
+ expect(METHOD_KEYS).toEqual([
202
+ "docker",
203
+ "linux-deb",
204
+ "linux-rpm",
205
+ "linux-tarball",
206
+ "macos",
207
+ "windows",
208
+ "kubernetes",
209
+ ]);
210
+ expect(DEFAULT_HOST_INSTALL_METHOD).toBe("docker");
211
+ });
212
+
213
+ test("labels each method the way people know it", () => {
214
+ expect(
215
+ HOST_INSTALL_METHODS.map(
216
+ (option: SetupGuideOption<HostInstallMethod>): string => {
217
+ return option.label;
218
+ },
219
+ ),
220
+ ).toEqual([
221
+ "Docker",
222
+ "Debian / Ubuntu",
223
+ "RHEL / Fedora",
224
+ "Linux Tarball",
225
+ "macOS",
226
+ "Windows",
227
+ "Kubernetes",
228
+ ]);
229
+ });
230
+
231
+ test("every method has a one-line description", () => {
232
+ for (const option of HOST_INSTALL_METHODS) {
233
+ expect((option.description || "").length).toBeGreaterThan(0);
234
+ expect(option.description).not.toContain("\n");
235
+ }
236
+ });
237
+
238
+ test("the macOS option no longer promises Homebrew", () => {
239
+ const macos: SetupGuideOption<HostInstallMethod> | undefined =
240
+ HOST_INSTALL_METHODS.find(
241
+ (option: SetupGuideOption<HostInstallMethod>): boolean => {
242
+ return option.key === "macos";
243
+ },
244
+ );
245
+ expect(macos?.description).toContain("launchd");
246
+ expect(macos?.description).not.toMatch(/brew/i);
247
+ });
248
+
249
+ test("an unknown or missing method resolves to Docker", () => {
250
+ for (const value of [undefined, null, "", "freebsd", "Windows"]) {
251
+ expect(resolveHostInstallMethod(value)).toBe("docker");
252
+ }
253
+ for (const method of METHOD_KEYS) {
254
+ expect(resolveHostInstallMethod(method)).toBe(method);
255
+ }
256
+ });
257
+
258
+ test("the native Linux installs are the three systemd-managed ones", () => {
259
+ expect([...NATIVE_LINUX_INSTALL_METHODS]).toEqual(NATIVE_LINUX);
260
+ });
261
+ });
262
+
263
+ describe.each(CONFIG_FILE_METHODS)(
264
+ "the %s guide",
265
+ (method: HostCollectorMethod) => {
266
+ const guide: SetupGuideContent = guideFor(method);
267
+ const markdown: string = getSetupGuideMarkdown(guide);
268
+
269
+ test("step 1 shows the OTLP endpoint the config exports to", () => {
270
+ expect(guide.keyStep?.endpointLabel).toBe("OTLP Endpoint");
271
+ expect(guide.keyStep?.endpointValue).toBe(`${URL}/otlp`);
272
+ // Rendered as plain text next to the key picker.
273
+ expect(guide.keyStep?.description).toBeTruthy();
274
+ expect(guide.keyStep?.description).not.toMatch(/[`*[\]]/);
275
+ });
276
+
277
+ test("is a few short steps after the key: config, install, verify", () => {
278
+ const titles: Array<string> = guide.steps.map(
279
+ (step: SetupGuideStep): string => {
280
+ return step.title;
281
+ },
282
+ );
283
+
284
+ expect(titles).toHaveLength(3);
285
+ expect(titles[0]).toBe("Save the collector config");
286
+ expect(titles[1]).toMatch(/collector/);
287
+ expect(titles[2]).toBe("Check the host appears");
288
+ });
289
+
290
+ test("every step has a one-sentence plain-text description", () => {
291
+ for (const step of guide.steps) {
292
+ expect(step.description).toBeTruthy();
293
+ expect(step.description).not.toMatch(/[`*[\]]/);
294
+ expect(step.description).not.toContain("\n");
295
+ expect(step.description).toMatch(/\.$/);
296
+ }
297
+ });
298
+
299
+ test("the prerequisites are two to four one-liners", () => {
300
+ const prerequisites: Array<string> = guide.prerequisites || [];
301
+ expect(prerequisites.length).toBeGreaterThanOrEqual(2);
302
+ expect(prerequisites.length).toBeLessThanOrEqual(4);
303
+ for (const line of prerequisites) {
304
+ expect(line).not.toContain("\n");
305
+ }
306
+ expect(prerequisites.join("\n")).toMatch(/Network access/);
307
+ });
308
+
309
+ test("the URL and key reach the config the collector runs", () => {
310
+ const config: YamlMap = savedConfigOf(guide);
311
+ const exporter: YamlMap = config["exporters"]["otlphttp/oneuptime"];
312
+ expect(exporter["endpoint"]).toBe(`${URL}/otlp`);
313
+ expect(exporter["headers"]["x-oneuptime-token"]).toBe(KEY);
314
+ });
315
+
316
+ test("shows its own commands and none of another method's", () => {
317
+ for (const signature of METHOD_SIGNATURES[method]) {
318
+ expect(markdown).toContain(signature);
319
+ }
320
+ for (const other of CONFIG_FILE_METHODS) {
321
+ if (other === method) {
322
+ continue;
323
+ }
324
+ for (const signature of METHOD_SIGNATURES[other]) {
325
+ expect({
326
+ other,
327
+ signature,
328
+ present: markdown.includes(signature),
329
+ }).toEqual({ other, signature, present: false });
330
+ }
331
+ }
332
+ });
333
+
334
+ test("keeps the optional setup out of the first-run steps", () => {
335
+ const steps: string = guide.steps
336
+ .map((step: SetupGuideStep): string => {
337
+ return `${step.markdown || ""}${step.description || ""}`;
338
+ })
339
+ .join("\n");
340
+
341
+ for (const advanced of [
342
+ "resource/oneuptime-hardware",
343
+ "resource/oneuptime-labels",
344
+ "windows_service:",
345
+ "systemd:",
346
+ "include_services",
347
+ "Win32_BIOS",
348
+ ]) {
349
+ expect(steps).not.toContain(advanced);
350
+ }
351
+ });
352
+
353
+ test("the systemd receiver is offered on native Linux installs only", () => {
354
+ const isNative: boolean = NATIVE_LINUX.includes(method);
355
+ expect(
356
+ topicTitles(guide.advanced).includes("Enable the Systemd Units tab"),
357
+ ).toBe(isNative);
358
+ expect(markdown.includes("receivers: [hostmetrics, systemd]")).toBe(
359
+ isNative,
360
+ );
361
+ expect(markdown.includes("journalctl")).toBe(isNative);
362
+ });
363
+
364
+ test("Windows-only content stays on Windows", () => {
365
+ const isWindows: boolean = method === "windows";
366
+ expect(markdown.includes("```powershell")).toBe(isWindows);
367
+ expect(markdown.includes("windows_service")).toBe(isWindows);
368
+ expect(markdown.includes("Win32_BIOS")).toBe(isWindows);
369
+ expect(
370
+ topicTitles(guide.advanced).includes("Enable the Windows Services tab"),
371
+ ).toBe(isWindows);
372
+ });
373
+
374
+ test("the config-editing topics are offered wherever there is a config file", () => {
375
+ const titles: Array<string> = topicTitles(guide.advanced);
376
+ for (const title of [
377
+ "Record the serial number, make, model and firmware version",
378
+ "Tag the host with project labels",
379
+ "What gets reported",
380
+ ]) {
381
+ expect(titles.includes(title)).toBe(true);
382
+ }
383
+ });
384
+
385
+ test("has three to eight Advanced topics", () => {
386
+ const count: number = (guide.advanced || []).length;
387
+ expect(count).toBeGreaterThanOrEqual(3);
388
+ expect(count).toBeLessThanOrEqual(8);
389
+ });
390
+
391
+ test("every Advanced topic has a plain one-line summary", () => {
392
+ for (const topic of guide.advanced || []) {
393
+ expect(topic.summary).toBeTruthy();
394
+ // Summaries render as plain text, so no markdown.
395
+ expect(topic.summary).not.toMatch(/[`*[\]]/);
396
+ expect(topic.summary).not.toContain("\n");
397
+ }
398
+ });
399
+
400
+ test("troubleshooting is titled by symptom and matches the method", () => {
401
+ const titles: Array<string> = topicTitles(guide.troubleshooting);
402
+ expect(titles.length).toBeGreaterThan(0);
403
+ expect(titles[0]).toBe("The host does not appear in Hosts");
404
+ expect(
405
+ titles.includes("Metrics describe the container instead of the host"),
406
+ ).toBe(method === "docker");
407
+ expect(titles.includes("The Systemd Units tab stays empty")).toBe(
408
+ NATIVE_LINUX.includes(method),
409
+ );
410
+ expect(titles.includes("The Windows service does not start")).toBe(
411
+ method === "windows",
412
+ );
413
+ expect(
414
+ titles.includes("The Services tab still lists every service"),
415
+ ).toBe(method === "windows");
416
+ });
417
+
418
+ test("the troubleshooting explains key refusals and names the OTLP endpoint", () => {
419
+ const trouble: string = (guide.troubleshooting || [])
420
+ .map((topic: SetupGuideTopic): string => {
421
+ return topic.markdown;
422
+ })
423
+ .join("\n");
424
+ expect(trouble).toContain("`401`");
425
+ expect(trouble).toContain("`422`");
426
+ expect(trouble).toContain(`${URL}/otlp`);
427
+ });
428
+
429
+ test("links to documentation that exists", () => {
430
+ const links: Array<string> = (guide.links || []).map(
431
+ (link: { title: string; url: string }): string => {
432
+ return link.url;
433
+ },
434
+ );
435
+ expect(links[0]).toBe("/docs/telemetry/host-otel-collector");
436
+ expect(links.includes("/docs/telemetry/kubernetes-agent")).toBe(false);
437
+ expect(links.length).toBeLessThanOrEqual(2);
438
+ for (const url of links) {
439
+ expect(
440
+ fs.existsSync(
441
+ path.join(
442
+ REPO_ROOT,
443
+ "packages/App/FeatureSet/Docs/Content/en",
444
+ `${url.replace(/^\/docs\//, "")}.md`,
445
+ ),
446
+ ),
447
+ ).toBe(true);
448
+ }
449
+ });
450
+
451
+ test("every code fence is closed", () => {
452
+ expect((markdown.match(/```/g) || []).length % 2).toBe(0);
453
+ expect(getSetupGuideCodeBlocks(guide).length).toBeGreaterThan(1);
454
+ });
455
+
456
+ test("never tells anyone the collector has to run as root", () => {
457
+ /*
458
+ * The same false claims SystemdUnitsPageWiring.test.ts keeps out of the
459
+ * docs page: the systemd receiver only makes read-only D-Bus calls.
460
+ */
461
+ for (const claim of [
462
+ /runs as root/i,
463
+ /(has to|must|needs to|need to) run as root/i,
464
+ /root, which is what lets/i,
465
+ ]) {
466
+ expect(markdown).not.toMatch(claim);
467
+ }
468
+ });
469
+ },
470
+ );
471
+
472
+ describe("the shared collector config", () => {
473
+ const config: YamlMap = yaml.load(
474
+ getHostCollectorConfig({ oneuptimeUrl: URL, apiKey: KEY }),
475
+ ) as YamlMap;
476
+
477
+ test("every method with a config file saves exactly this config", () => {
478
+ const expected: string = getHostCollectorConfig({
479
+ oneuptimeUrl: URL,
480
+ apiKey: KEY,
481
+ });
482
+ for (const method of CONFIG_FILE_METHODS) {
483
+ const step: SetupGuideStep = stepTitled(
484
+ guideFor(method),
485
+ "Save the collector config",
486
+ );
487
+ expect(codeBlocksOf(step.markdown || "", "yaml")).toEqual([
488
+ `${expected}\n`,
489
+ ]);
490
+ }
491
+ });
492
+
493
+ test("scrapes host and per-process metrics every 30 seconds", () => {
494
+ const hostmetrics: YamlMap = config["receivers"]["hostmetrics"];
495
+ expect(hostmetrics["collection_interval"]).toBe("30s");
496
+ expect(Object.keys(hostmetrics["scrapers"]).sort()).toEqual(
497
+ [
498
+ "cpu",
499
+ "disk",
500
+ "filesystem",
501
+ "load",
502
+ "memory",
503
+ "network",
504
+ "paging",
505
+ "process",
506
+ "processes",
507
+ ].sort(),
508
+ );
509
+ });
510
+
511
+ test("turns on the logical CPU count the Hosts list caches", () => {
512
+ expect(
513
+ config["receivers"]["hostmetrics"]["scrapers"]["cpu"]["metrics"][
514
+ "system.cpu.logical.count"
515
+ ]["enabled"],
516
+ ).toBe(true);
517
+ });
518
+
519
+ test("detects every attribute the host record and Inventory item read", () => {
520
+ const detection: YamlMap = config["processors"]["resourcedetection"];
521
+ expect(detection["detectors"]).toEqual(["system", "env"]);
522
+ expect(detection["system"]["hostname_sources"]).toEqual(["os"]);
523
+
524
+ const attributes: YamlMap = detection["system"]["resource_attributes"];
525
+ for (const key of [
526
+ "host.name",
527
+ "host.id",
528
+ "host.arch",
529
+ "host.ip",
530
+ "host.mac",
531
+ "os.type",
532
+ "os.description",
533
+ "os.version",
534
+ ]) {
535
+ expect({ key, enabled: attributes[key]?.["enabled"] }).toEqual({
536
+ key,
537
+ enabled: true,
538
+ });
539
+ }
540
+ });
541
+
542
+ test("runs one metrics pipeline through resourcedetection to OneUptime", () => {
543
+ expect(config["service"]["pipelines"]).toEqual({
544
+ metrics: {
545
+ receivers: ["hostmetrics"],
546
+ processors: ["resourcedetection", "batch"],
547
+ exporters: ["otlphttp/oneuptime"],
548
+ },
549
+ });
550
+ });
551
+
552
+ test("matches what the docs site tells people editing the generated config", () => {
553
+ /*
554
+ * host-otel-collector.md warns that the dashboard's config names its
555
+ * processors and exporter differently from the page's own examples. If
556
+ * the config changes, that warning becomes the wrong advice.
557
+ */
558
+ const doc: string = squash(readRepoFile(HOST_DOCS_PAGE));
559
+ expect(doc).toContain(
560
+ "its processors are `resourcedetection` and `batch` (there is **no** `resource` processor) and its exporter is `otlphttp/oneuptime`",
561
+ );
562
+ expect(Object.keys(config["processors"]).sort()).toEqual([
563
+ "batch",
564
+ "resourcedetection",
565
+ ]);
566
+ expect(Object.keys(config["exporters"])).toEqual(["otlphttp/oneuptime"]);
567
+ expect(Object.keys(config["service"]["pipelines"])).toEqual(["metrics"]);
568
+ });
569
+ });
570
+
571
+ /*
572
+ * The Advanced topics hand out config fragments to merge into config.yaml.
573
+ * A fragment whose pipeline names a processor or receiver that exists
574
+ * nowhere stops the collector at startup ("references processor ... which
575
+ * is not configured"), so every name must be defined by the shared config,
576
+ * by the fragment itself, or by the Windows script that prints it.
577
+ */
578
+ describe("every config fragment names only components that exist", () => {
579
+ const shared: YamlMap = yaml.load(
580
+ getHostCollectorConfig({ oneuptimeUrl: URL, apiKey: KEY }),
581
+ ) as YamlMap;
582
+
583
+ test.each(CONFIG_FILE_METHODS)("%s", (method: HostInstallMethod) => {
584
+ const guide: SetupGuideContent = guideFor(method);
585
+ const fragments: Array<string> = (guide.advanced || []).flatMap(
586
+ (topic: SetupGuideTopic): Array<string> => {
587
+ return codeBlocksOf(topic.markdown, "yaml");
588
+ },
589
+ );
590
+ expect(fragments.length).toBeGreaterThan(1);
591
+
592
+ const printedByScript: Array<string> =
593
+ method === "windows" ? ["resource/oneuptime-hardware"] : [];
594
+
595
+ for (const fragment of fragments) {
596
+ const parsed: YamlMap = yaml.load(fragment) as YamlMap;
597
+ const metrics: YamlMap | undefined =
598
+ parsed["service"]?.["pipelines"]?.["metrics"];
599
+ expect(metrics).toBeDefined();
600
+
601
+ for (const processor of metrics!["processors"] || []) {
602
+ expect({
603
+ fragment: fragment.split("\n")[0],
604
+ processor,
605
+ defined:
606
+ processor in (shared["processors"] || {}) ||
607
+ processor in (parsed["processors"] || {}) ||
608
+ printedByScript.includes(processor),
609
+ }).toEqual({
610
+ fragment: fragment.split("\n")[0],
611
+ processor,
612
+ defined: true,
613
+ });
614
+ }
615
+
616
+ for (const receiver of metrics!["receivers"] || []) {
617
+ expect(
618
+ receiver in shared["receivers"] ||
619
+ receiver in (parsed["receivers"] || {}),
620
+ ).toBe(true);
621
+ }
622
+
623
+ // resourcedetection stamps host.name, which is what attaches a host.
624
+ if (metrics!["processors"]) {
625
+ expect(metrics!["processors"][0]).toBe("resourcedetection");
626
+ }
627
+ }
628
+ });
629
+ });
630
+
631
+ describe("the Linux package installs", () => {
632
+ test.each(["linux-deb", "linux-rpm"] as Array<HostInstallMethod>)(
633
+ "%s restarts the service after installing the config",
634
+ (method: HostInstallMethod) => {
635
+ /*
636
+ * The package's postinstall script already enables and starts the
637
+ * service with the package's own default config, so `enable --now`
638
+ * afterwards is a no-op and the collector would keep running the
639
+ * default config. Only a restart makes it read ours.
640
+ */
641
+ const install: string =
642
+ stepTitled(guideFor(method), "Install the collector").markdown || "";
643
+ const installConfig: number = install.indexOf(
644
+ "sudo install -m 0644 config.yaml /etc/otelcol-contrib/config.yaml",
645
+ );
646
+ expect(installConfig).toBeGreaterThan(-1);
647
+ expect(
648
+ install.indexOf("sudo systemctl restart otelcol-contrib"),
649
+ ).toBeGreaterThan(installConfig);
650
+ expect(install).not.toContain("enable --now");
651
+ },
652
+ );
653
+
654
+ test("the tarball unit runs the binary and config it installed", () => {
655
+ const install: string =
656
+ stepTitled(guideFor("linux-tarball"), "Install the collector").markdown ||
657
+ "";
658
+ expect(install).toContain(
659
+ "sudo install -m 0644 config.yaml /opt/otelcol-contrib/config.yaml",
660
+ );
661
+ expect(install).toContain(
662
+ "ExecStart=/opt/otelcol-contrib/otelcol-contrib --config /opt/otelcol-contrib/config.yaml",
663
+ );
664
+ expect(install.indexOf("sudo systemctl daemon-reload")).toBeLessThan(
665
+ install.indexOf("sudo systemctl enable --now otelcol-contrib"),
666
+ );
667
+ });
668
+
669
+ test("every Linux install downloads the contrib build for the host's architecture", () => {
670
+ for (const method of NATIVE_LINUX) {
671
+ const install: string =
672
+ stepTitled(guideFor(method), "Install the collector").markdown || "";
673
+ expect(install).toContain(
674
+ "https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v${VERSION}/otelcol-contrib_${VERSION}_linux_${ARCH}",
675
+ );
676
+ expect(install).toContain("VERSION=${VERSION##*/v}");
677
+ }
678
+ });
679
+
680
+ test("the tarball is not offered for distributions without systemd", () => {
681
+ const tarball: string = markdownOf("linux-tarball");
682
+ expect(tarball).not.toContain("Alpine");
683
+ expect(tarball).not.toContain("NixOS");
684
+ expect(
685
+ (guideFor("linux-tarball").prerequisites || []).join("\n"),
686
+ ).toContain("systemd");
687
+ });
688
+ });
689
+
690
+ describe("the systemd receiver", () => {
691
+ const topicOf: (method: HostInstallMethod) => SetupGuideTopic = (
692
+ method: HostInstallMethod,
693
+ ): SetupGuideTopic => {
694
+ const topic: SetupGuideTopic | undefined = topicTitled(
695
+ guideFor(method).advanced,
696
+ "Enable the Systemd Units tab",
697
+ );
698
+ if (!topic) {
699
+ throw new Error(`No systemd topic for ${method}`);
700
+ }
701
+ return topic;
702
+ };
703
+
704
+ test.each(NATIVE_LINUX)(
705
+ "%s names the version the tab needs",
706
+ (method: HostInstallMethod) => {
707
+ const topic: SetupGuideTopic = topicOf(method);
708
+ expect(topic.markdown).toContain(
709
+ `**${MIN_OTELCOL_CONTRIB_VERSION} or newer**`,
710
+ );
711
+ expect(topic.markdown).toContain("**v0.142.0**");
712
+ },
713
+ );
714
+
715
+ test.each(NATIVE_LINUX)(
716
+ "%s adds the receiver next to hostmetrics and keeps resourcedetection",
717
+ (method: HostInstallMethod) => {
718
+ const fragment: YamlMap = yaml.load(
719
+ codeBlocksOf(topicOf(method).markdown, "yaml")[0]!,
720
+ ) as YamlMap;
721
+ expect(fragment["receivers"]["systemd"]["units"]).toEqual(["*.service"]);
722
+ expect(
723
+ fragment["receivers"]["systemd"]["metrics"]["systemd.service.cpu.time"][
724
+ "enabled"
725
+ ],
726
+ ).toBe(false);
727
+ expect(fragment["service"]["pipelines"]["metrics"]).toEqual({
728
+ receivers: ["hostmetrics", "systemd"],
729
+ processors: ["resourcedetection", "batch"],
730
+ });
731
+ },
732
+ );
733
+
734
+ test("each install is told where its config lives and how to restart", () => {
735
+ expect(topicOf("linux-deb").markdown).toContain(
736
+ "`/etc/otelcol-contrib/config.yaml`",
737
+ );
738
+ expect(topicOf("linux-rpm").markdown).toContain(
739
+ "`/etc/otelcol-contrib/config.yaml`",
740
+ );
741
+ expect(topicOf("linux-tarball").markdown).toContain(
742
+ "`/opt/otelcol-contrib/config.yaml`",
743
+ );
744
+ for (const method of NATIVE_LINUX) {
745
+ expect(topicOf(method).markdown).toContain(
746
+ "sudo systemctl restart otelcol-contrib",
747
+ );
748
+ }
749
+ });
750
+
751
+ test("only the packaged installs are said to run as the otelcol-contrib user", () => {
752
+ expect(topicOf("linux-deb").markdown).toContain(
753
+ "which runs as the `otelcol-contrib` user",
754
+ );
755
+ // The tarball's own unit sets User=root.
756
+ expect(topicOf("linux-tarball").markdown).not.toContain(
757
+ "`otelcol-contrib` user",
758
+ );
759
+ });
760
+
761
+ test("the volume note matches the docs site's ten datapoints per unit", () => {
762
+ const doc: string = readRepoFile(HOST_DOCS_PAGE);
763
+ expect(doc).toContain("eight datapoints per unit per scrape");
764
+ expect(topicOf("linux-deb").markdown).toContain(
765
+ "eight datapoints per scrape for the state set, plus two more if you leave the CPU metric on",
766
+ );
767
+ });
768
+ });
769
+
770
+ describe("the Windows install", () => {
771
+ const guide: SetupGuideContent = guideFor("windows");
772
+ const install: string =
773
+ stepTitled(guide, "Install and start the collector").markdown || "";
774
+ const script: string = codeBlocksOf(install, "powershell")[0] || "";
775
+
776
+ test("downloads the contrib archive, not the core one", () => {
777
+ expect(script).toContain("otelcol-contrib_${version}_windows_amd64.tar.gz");
778
+ expect(script).not.toMatch(/\/otelcol_\$\{?version/);
779
+ });
780
+
781
+ test("pins a release that has the windows_service receiver", () => {
782
+ const pinned: RegExpMatchArray | null = script.match(
783
+ /\$version = "(\d+)\.(\d+)\.(\d+)"/,
784
+ );
785
+ expect(pinned).not.toBeNull();
786
+ expect(Number(pinned![1])).toBe(0);
787
+ expect(Number(pinned![2])).toBeGreaterThanOrEqual(155);
788
+ // The docs site names the same floor for the Services tab.
789
+ expect(readRepoFile(HOST_DOCS_PAGE)).toContain("v0.155.0");
790
+ });
791
+
792
+ test("registers the service with sc.exe quoting that survives PowerShell", () => {
793
+ /*
794
+ * PowerShell's escape character is the backtick: in a double-quoted
795
+ * PowerShell string, \" ends the string. --% hands the rest of the line
796
+ * to sc.exe verbatim, so the cmd-style quoting reaches it intact — and
797
+ * PowerShell variables are not expanded there, hence literal paths.
798
+ */
799
+ const line: string | undefined = script
800
+ .split("\n")
801
+ .find((candidate: string): boolean => {
802
+ return candidate.startsWith("sc.exe --% create");
803
+ });
804
+ expect(line).toBe(
805
+ `sc.exe --% create "otelcol-contrib" binPath= "\\"${WINDOWS_INSTALL_DIR}\\otelcol-contrib.exe\\" --config=\\"${WINDOWS_INSTALL_DIR}\\config.yaml\\"" start= auto DisplayName= "OpenTelemetry Collector (OneUptime)"`,
806
+ );
807
+ expect(line).not.toContain("$");
808
+ expect(script).toContain(`$dest = "${WINDOWS_INSTALL_DIR}"`);
809
+ expect(script).toContain('sc.exe start "otelcol-contrib"');
810
+ });
811
+
812
+ test("copies the saved config next to the binary", () => {
813
+ expect(script).toContain(
814
+ 'Copy-Item config.yaml "$dest\\config.yaml" -Force',
815
+ );
816
+ });
817
+
818
+ test("the Services tab topic uses the receiver the tab reads", () => {
819
+ const topic: SetupGuideTopic | undefined = topicTitled(
820
+ guide.advanced,
821
+ "Enable the Windows Services tab",
822
+ );
823
+ const fragment: YamlMap = yaml.load(
824
+ codeBlocksOf(topic?.markdown || "", "yaml")[0]!,
825
+ ) as YamlMap;
826
+ expect(
827
+ fragment["receivers"]["windows_service"]["collection_interval"],
828
+ ).toBe("30s");
829
+ expect(fragment["service"]["pipelines"]["metrics"]["receivers"]).toEqual([
830
+ "hostmetrics",
831
+ "windows_service",
832
+ ]);
833
+ expect(topic?.markdown).toContain("Restart-Service otelcol-contrib");
834
+ });
835
+
836
+ test("the hardware script reads WMI through CIM and prints the firmware version", () => {
837
+ const topic: SetupGuideTopic | undefined = topicTitled(
838
+ guide.advanced,
839
+ "Record the serial number, make, model and firmware version",
840
+ );
841
+ const hardware: string =
842
+ codeBlocksOf(topic?.markdown || "", "powershell")[0] || "";
843
+ expect(hardware).toContain("Get-CimInstance -ClassName Win32_BIOS");
844
+ expect(hardware).toContain(
845
+ "Get-CimInstance -ClassName Win32_ComputerSystem",
846
+ );
847
+ expect(hardware).toContain("$(Format-YamlValue $bios.SMBIOSBIOSVersion)");
848
+ expect(hardware).not.toMatch(/Get-WmiObject\s+-/);
849
+ expect(topic?.markdown).toMatch(/not the deprecated .{0,2}Get-WmiObject/);
850
+ });
851
+
852
+ test("the foreground run in troubleshooting uses the installed paths", () => {
853
+ const trouble: string =
854
+ topicTitled(guide.troubleshooting, "The Windows service does not start")
855
+ ?.markdown || "";
856
+ expect(trouble).toContain(
857
+ `& "${WINDOWS_INSTALL_DIR}\\otelcol-contrib.exe" --config="${WINDOWS_INSTALL_DIR}\\config.yaml"`,
858
+ );
859
+ expect(trouble).toContain('sc.exe qc "otelcol-contrib"');
860
+ });
861
+ });
862
+
863
+ describe("the macOS install", () => {
864
+ const guide: SetupGuideContent = guideFor("macos");
865
+ const install: string =
866
+ stepTitled(guide, "Install and start the collector").markdown || "";
867
+ const plist: string = codeBlocksOf(install, "xml")[0] || "";
868
+
869
+ test("installs the contrib release for the Mac's architecture", () => {
870
+ expect(install).toContain(
871
+ "otelcol-contrib_${VERSION}_darwin_${ARCH}.tar.gz",
872
+ );
873
+ expect(install).toContain("sed 's/x86_64/amd64/'");
874
+ expect(install).toContain(
875
+ "The core `otelcol` build has no `resourcedetection` processor",
876
+ );
877
+ });
878
+
879
+ test("does not send anyone to Homebrew", () => {
880
+ expect(getSetupGuideMarkdown(guide)).not.toMatch(/brew/i);
881
+ });
882
+
883
+ test("launchd runs the binary and config the install put in place", () => {
884
+ expect(install).toContain(
885
+ "sudo ln -sf /usr/local/otelcol-contrib/otelcol-contrib /usr/local/bin/otelcol-contrib",
886
+ );
887
+ expect(install).toContain(
888
+ "sudo install -m 0644 config.yaml /etc/otelcol-contrib/config.yaml",
889
+ );
890
+ expect(plist).toContain("<string>/usr/local/bin/otelcol-contrib</string>");
891
+ expect(plist).toContain(
892
+ "<string>--config=/etc/otelcol-contrib/config.yaml</string>",
893
+ );
894
+ expect(plist).toContain("<key>RunAtLoad</key><true/>");
895
+ expect(plist).toContain("<key>KeepAlive</key><true/>");
896
+ expect(install).toContain(
897
+ "Create `/Library/LaunchDaemons/com.oneuptime.otelcol-contrib.plist`",
898
+ );
899
+ });
900
+
901
+ test("the verify step reads the log file the plist writes", () => {
902
+ const verify: string =
903
+ stepTitled(guide, "Check the host appears").markdown || "";
904
+ expect(plist).toContain(
905
+ "<key>StandardErrorPath</key><string>/var/log/otelcol-contrib.err.log</string>",
906
+ );
907
+ expect(verify).toContain("tail -f /var/log/otelcol-contrib.err.log");
908
+ });
909
+
910
+ test("uses the same paths as the docs site's macOS install", () => {
911
+ const doc: string = readRepoFile(HOST_DOCS_PAGE);
912
+ for (const shared of [
913
+ "/Library/LaunchDaemons/com.oneuptime.otelcol-contrib.plist",
914
+ "/usr/local/bin/otelcol-contrib",
915
+ "--config=/etc/otelcol-contrib/config.yaml",
916
+ "/var/log/otelcol-contrib.err.log",
917
+ "_darwin_${ARCH}.tar.gz",
918
+ ]) {
919
+ expect({ shared, inDocs: doc.includes(shared) }).toEqual({
920
+ shared,
921
+ inDocs: true,
922
+ });
923
+ }
924
+ });
925
+
926
+ test("the hardware topic reads the Mac's own identifiers", () => {
927
+ const topic: string =
928
+ topicTitled(
929
+ guide.advanced,
930
+ "Record the serial number, make, model and firmware version",
931
+ )?.markdown || "";
932
+ expect(topic).toContain("IOPlatformSerialNumber");
933
+ expect(topic).toContain("sysctl -n hw.model");
934
+ expect(topic).toContain("System Firmware Version");
935
+ expect(topic).not.toContain("/sys/class/dmi");
936
+ });
937
+ });
938
+
939
+ describe("the Docker install", () => {
940
+ const guide: SetupGuideContent = guideFor("docker");
941
+
942
+ test("mounts the saved config and the host filesystem", () => {
943
+ const run: string =
944
+ stepTitled(guide, "Run the collector with Docker").markdown || "";
945
+ expect(run).toContain(
946
+ "-v $(pwd)/config.yaml:/etc/otelcol-contrib/config.yaml:ro",
947
+ );
948
+ expect(run).toContain("--config /etc/otelcol-contrib/config.yaml");
949
+ for (const variable of ["PROC", "SYS", "ETC", "VAR", "RUN", "DEV"]) {
950
+ expect(run).toContain(
951
+ `-e HOST_${variable}=/hostfs/${variable.toLowerCase()}`,
952
+ );
953
+ }
954
+ });
955
+
956
+ test("config edits recreate the container instead of restarting it", () => {
957
+ const labels: string =
958
+ topicTitled(guide.advanced, "Tag the host with project labels")
959
+ ?.markdown || "";
960
+ expect(labels).toContain("docker rm -f otel-collector");
961
+ expect(labels).toContain("run the `docker run` command from step 3 again");
962
+ });
963
+
964
+ test("reads the hardware values from DMI on the Docker host", () => {
965
+ const topic: string =
966
+ topicTitled(
967
+ guide.advanced,
968
+ "Record the serial number, make, model and firmware version",
969
+ )?.markdown || "";
970
+ expect(topic).toContain("cat /sys/class/dmi/id/product_serial");
971
+ expect(topic).not.toContain("ioreg");
972
+ });
973
+ });
974
+
975
+ /*
976
+ * Kubernetes nodes are filed under their cluster, never in Hosts: ingest
977
+ * refuses to register a host from telemetry with a Kubernetes identity. So
978
+ * the Kubernetes option installs what does show nodes — the OneUptime
979
+ * Kubernetes agent, with the Kubernetes section's own guide for a standard
980
+ * cluster — instead of a collector DaemonSet whose nodes would never appear.
981
+ */
982
+ describe("the Kubernetes option", () => {
983
+ const guide: SetupGuideContent = guideFor("kubernetes");
984
+ const markdown: string = getSetupGuideMarkdown(guide);
985
+ const agentGuide: SetupGuideContent = getKubernetesSetupGuide({
986
+ oneuptimeUrl: URL,
987
+ apiKey: KEY,
988
+ platform: "standard",
989
+ });
990
+
991
+ test("the option says it installs the Kubernetes agent", () => {
992
+ const option: SetupGuideOption<HostInstallMethod> | undefined =
993
+ HOST_INSTALL_METHODS.find(
994
+ (candidate: SetupGuideOption<HostInstallMethod>): boolean => {
995
+ return candidate.key === "kubernetes";
996
+ },
997
+ );
998
+ expect(option?.description).toContain("Kubernetes agent");
999
+ expect(option?.description).not.toMatch(/DaemonSet/);
1000
+ });
1001
+
1002
+ test("says nodes appear under Kubernetes, not in Hosts", () => {
1003
+ expect(guide.intro).toContain("**OneUptime Kubernetes agent**");
1004
+ expect(guide.intro).toContain("**Nodes**");
1005
+ expect(guide.intro).toContain("not in the **Hosts** list");
1006
+ });
1007
+
1008
+ test("points to the Kubernetes section for every other platform", () => {
1009
+ for (const platform of [
1010
+ "Amazon EKS",
1011
+ "Google GKE",
1012
+ "Azure AKS",
1013
+ "GKE Autopilot",
1014
+ "EKS Fargate",
1015
+ ]) {
1016
+ expect(guide.intro).toContain(platform);
1017
+ }
1018
+ });
1019
+
1020
+ test("installs the agent with the Kubernetes guide's own steps", () => {
1021
+ expect(guide.steps).toEqual(agentGuide.steps);
1022
+ expect(markdown).toContain(
1023
+ `helm install ${KUBERNETES_AGENT_HELM_RELEASE} oneuptime/kubernetes-agent`,
1024
+ );
1025
+ expect(markdown).toContain(`--set oneuptime.url="${URL}"`);
1026
+ expect(markdown).toContain(`--set oneuptime.apiKey="${KEY}"`);
1027
+ });
1028
+
1029
+ test("keeps the Kubernetes guide's Advanced, Troubleshooting and links", () => {
1030
+ expect(guide.prerequisites).toEqual(agentGuide.prerequisites);
1031
+ expect(guide.advanced).toEqual(agentGuide.advanced);
1032
+ expect(guide.troubleshooting).toEqual(agentGuide.troubleshooting);
1033
+ expect(guide.links).toEqual(agentGuide.links);
1034
+ });
1035
+
1036
+ test("no longer deploys a collector DaemonSet that never registers hosts", () => {
1037
+ for (const gone of [
1038
+ "open-telemetry/opentelemetry-collector",
1039
+ "mode: daemonset",
1040
+ "Save the collector config",
1041
+ "hostname_sources",
1042
+ ]) {
1043
+ expect(markdown).not.toContain(gone);
1044
+ }
1045
+ });
1046
+
1047
+ test("step 1 describes the agent's key and shows the base URL", () => {
1048
+ expect(guide.keyStep?.description).toContain("Kubernetes agent");
1049
+ expect(guide.keyStep?.description).not.toMatch(/[`*[\]]/);
1050
+ expect(guide.keyStep?.endpointValue).toBeUndefined();
1051
+ });
1052
+
1053
+ test("shows the placeholder until a key is picked", () => {
1054
+ const placeholder: string = getSetupGuideMarkdown(
1055
+ guideFor("kubernetes", { apiKey: SETUP_GUIDE_API_KEY_PLACEHOLDER }),
1056
+ );
1057
+ expect(placeholder).toContain(
1058
+ `--set oneuptime.apiKey="${SETUP_GUIDE_API_KEY_PLACEHOLDER}"`,
1059
+ );
1060
+ expect(placeholder).toContain("Pick an ingestion key in step 1");
1061
+ });
1062
+ });
1063
+
1064
+ describe("before a key is picked", () => {
1065
+ test.each(CONFIG_FILE_METHODS)(
1066
+ "%s shows the placeholder and says where to pick a key",
1067
+ (method: HostCollectorMethod) => {
1068
+ const guide: SetupGuideContent = guideFor(method, {
1069
+ apiKey: SETUP_GUIDE_API_KEY_PLACEHOLDER,
1070
+ });
1071
+ const markdown: string = getSetupGuideMarkdown(guide);
1072
+ expect(markdown).toContain(
1073
+ `x-oneuptime-token: ${SETUP_GUIDE_API_KEY_PLACEHOLDER}`,
1074
+ );
1075
+ expect(markdown).toContain("Pick an ingestion key in step 1");
1076
+ },
1077
+ );
1078
+
1079
+ test.each(CONFIG_FILE_METHODS)(
1080
+ "%s drops the note once a key is picked",
1081
+ (method: HostCollectorMethod) => {
1082
+ const markdown: string = markdownOf(method);
1083
+ expect(markdown).not.toContain("Pick an ingestion key in step 1");
1084
+ expect(markdown).not.toContain(SETUP_GUIDE_API_KEY_PLACEHOLDER);
1085
+ },
1086
+ );
1087
+
1088
+ test("an unknown dashboard host leaves the URL placeholder in the config", () => {
1089
+ const guide: SetupGuideContent = guideFor("docker", {
1090
+ oneuptimeUrl: SETUP_GUIDE_URL_PLACEHOLDER,
1091
+ });
1092
+ expect(guide.keyStep?.endpointValue).toBe(
1093
+ `${SETUP_GUIDE_URL_PLACEHOLDER}/otlp`,
1094
+ );
1095
+ expect(getSetupGuideMarkdown(guide)).toContain(
1096
+ `endpoint: ${SETUP_GUIDE_URL_PLACEHOLDER}/otlp`,
1097
+ );
1098
+ });
1099
+ });
1100
+
1101
+ /*
1102
+ * What the guide says about how a host is discovered and why a key is
1103
+ * refused must be what ingest does. These read the ingest code the claims
1104
+ * come from, so changing either side fails here.
1105
+ */
1106
+ describe("the guide's claims match ingest", () => {
1107
+ const reported: string =
1108
+ topicTitled(guideFor("linux-deb").advanced, "What gets reported")
1109
+ ?.markdown || "";
1110
+ const ingest: string = squash(
1111
+ readRepoFile(
1112
+ "packages/App/FeatureSet/Telemetry/Services/OtelIngestBaseService.ts",
1113
+ ),
1114
+ );
1115
+
1116
+ test("a host needs host.name plus os.type, container.runtime or host metrics", () => {
1117
+ expect(reported).toContain("carries `host.name` also carries any of");
1118
+ expect(reported).toContain(
1119
+ "an `os.type` or `container.runtime` resource attribute",
1120
+ );
1121
+ expect(ingest).toContain(
1122
+ 'const hostName: string | null = this.getStringAttribute( data.attributes, "host.name", ); if (!hostName) { return null; }',
1123
+ );
1124
+ expect(ingest).toContain(
1125
+ "const hasResourceSignal: boolean = Boolean(osType || containerRuntime); if (!hasResourceSignal && !data.hasInfraSignal) { return null; }",
1126
+ );
1127
+ expect(ingest).toContain(
1128
+ 'if (name.startsWith("system.") || name.startsWith("process.")) { result.hasInfraSignal = true; }',
1129
+ );
1130
+ });
1131
+
1132
+ test("Kubernetes identities never register a host", () => {
1133
+ expect(reported).toContain("is filed under its Kubernetes cluster instead");
1134
+ expect(ingest).toContain(
1135
+ "if (this.hasKubernetesIdentity(data.attributes)) { return null; }",
1136
+ );
1137
+ const entity: string = squash(
1138
+ readRepoFile("packages/Common/Server/Utils/Telemetry/TelemetryEntity.ts"),
1139
+ );
1140
+ for (const key of ["k8s.cluster.name", "k8s.node.name", "k8s.pod.name"]) {
1141
+ expect(reported).toContain(`\`${key}\``);
1142
+ expect(entity).toContain(`"${key}",`);
1143
+ }
1144
+ });
1145
+
1146
+ test("401 is a missing, wrong or expired key and 422 a disabled one", () => {
1147
+ expect(ExceptionCode.NotAuthenticatedException).toBe(401);
1148
+ expect(ExceptionCode.NotAuthorizedException).toBe(422);
1149
+
1150
+ const middleware: string = squash(
1151
+ readRepoFile("packages/Common/Server/Middleware/TelemetryIngest.ts"),
1152
+ );
1153
+ expect(middleware).toContain(
1154
+ 'new NotAuthenticatedException( "Missing ingestion token.',
1155
+ );
1156
+ expect(middleware).toContain(
1157
+ 'new NotAuthenticatedException( "Invalid ingestion token.',
1158
+ );
1159
+ expect(middleware).toContain(
1160
+ 'new NotAuthenticatedException( "This telemetry ingestion key expired.", )',
1161
+ );
1162
+ expect(middleware).toContain(
1163
+ 'new NotAuthorizedException( "This telemetry ingestion key has been disabled.", )',
1164
+ );
1165
+
1166
+ const trouble: string =
1167
+ topicTitled(
1168
+ guideFor("docker").troubleshooting,
1169
+ "The host does not appear in Hosts",
1170
+ )?.markdown || "";
1171
+ expect(trouble).toContain(
1172
+ "An HTTP `401` means the key is missing, wrong or expired; `422` means it has been disabled",
1173
+ );
1174
+ });
1175
+
1176
+ test("the OTLP endpoint the config exports to is one ingest serves", () => {
1177
+ const routes: string = readRepoFile(
1178
+ "packages/App/FeatureSet/Telemetry/API/OTelIngest.ts",
1179
+ );
1180
+ // otlphttp appends /v1/metrics to the endpoint it is given.
1181
+ expect(routes).toContain('"/otlp/v1/metrics"');
1182
+ });
1183
+ });