@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,1074 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import {
5
+ DEFAULT_SERVERLESS_PLATFORM,
6
+ LAMBDA_EXEC_WRAPPER,
7
+ LAMBDA_LAYER_DOCS_URL,
8
+ SERVERLESS_DOCS_URL,
9
+ SERVERLESS_EXAMPLE_FUNCTION_NAME,
10
+ SERVERLESS_EXAMPLE_FUNCTION_VERSION,
11
+ SERVERLESS_PLATFORMS,
12
+ ServerlessEnvironmentVariable,
13
+ ServerlessPlatform,
14
+ getServerlessCloudPlatform,
15
+ getServerlessEnvironmentVariables,
16
+ getServerlessPlatformForCloudPlatform,
17
+ getServerlessResourceAttributes,
18
+ getServerlessSetupGuide,
19
+ resolveServerlessPlatform,
20
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/Serverless/ServerlessSetupGuide";
21
+ import {
22
+ SETUP_GUIDE_API_KEY_PLACEHOLDER,
23
+ SetupGuideContent,
24
+ SetupGuideOption,
25
+ SetupGuideStep,
26
+ SetupGuideStepVariant,
27
+ SetupGuideTopic,
28
+ getSetupGuideCodeBlocks,
29
+ getSetupGuideMarkdown,
30
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/SetupGuide/SetupGuide";
31
+ import {
32
+ FAAS_CLOUD_PLATFORM_VALUES,
33
+ FaasCloudPlatform,
34
+ } from "../../../Types/Cloud/CloudPlatform";
35
+
36
+ /*
37
+ * The serverless guide asks where the functions run, then shows only that
38
+ * platform's way of setting the exporter's environment variables. These
39
+ * tests pin, for every platform:
40
+ *
41
+ * - the variables themselves, with the reader's URL and key in them, as
42
+ * NAME=value lines a console takes (no shell quoting to paste along);
43
+ * - the cloud.platform each platform sets, which must be one ingest reads
44
+ * as a serverless function;
45
+ * - faas.name, which every tab of a function filters on — suggested on the
46
+ * product pages, the function's own identifier on its Documentation tab;
47
+ * - on Azure Functions, OTEL_SERVICE_NAME in its place, with faas.name
48
+ * left out as the docs' Azure Functions section says: ingest writes the
49
+ * function app's service.name onto the telemetry as faas.name;
50
+ * - that no platform is told to use a CLI form that splits
51
+ * OTEL_RESOURCE_ATTRIBUTES on its commas or replaces every variable the
52
+ * function already has;
53
+ * - that one platform's instructions never leak into another's.
54
+ */
55
+
56
+ const REPO_ROOT: string = path.resolve(__dirname, "../../../../..");
57
+ const DASHBOARD_SRC: string = path.join(
58
+ REPO_ROOT,
59
+ "packages/App/FeatureSet/Dashboard/src",
60
+ );
61
+ const DOCS_CONTENT: string = path.join(
62
+ REPO_ROOT,
63
+ "packages/App/FeatureSet/Docs/Content/en",
64
+ );
65
+
66
+ const URL: string = "https://oneuptime.example.com";
67
+ const KEY: string = "tik_secret_123";
68
+
69
+ const PLATFORM_KEYS: Array<ServerlessPlatform> = SERVERLESS_PLATFORMS.map(
70
+ (option: SetupGuideOption<ServerlessPlatform>): ServerlessPlatform => {
71
+ return option.key;
72
+ },
73
+ );
74
+
75
+ const guideFor: (
76
+ platform: ServerlessPlatform,
77
+ overrides?: { functionName?: string; apiKey?: string },
78
+ ) => SetupGuideContent = (
79
+ platform: ServerlessPlatform,
80
+ overrides?: { functionName?: string; apiKey?: string },
81
+ ): SetupGuideContent => {
82
+ return getServerlessSetupGuide({
83
+ oneuptimeUrl: URL,
84
+ apiKey: overrides?.apiKey ?? KEY,
85
+ platform: platform,
86
+ functionName: overrides?.functionName,
87
+ });
88
+ };
89
+
90
+ const topicTitles: (
91
+ topics: Array<SetupGuideTopic> | undefined,
92
+ ) => Array<string> = (
93
+ topics: Array<SetupGuideTopic> | undefined,
94
+ ): Array<string> => {
95
+ return (topics || []).map((topic: SetupGuideTopic): string => {
96
+ return topic.title;
97
+ });
98
+ };
99
+
100
+ // The steps' own text — what a first setup reads, without Advanced.
101
+ const stepsText: (guide: SetupGuideContent) => string = (
102
+ guide: SetupGuideContent,
103
+ ): string => {
104
+ return guide.steps
105
+ .map((step: SetupGuideStep): string => {
106
+ return [
107
+ step.title,
108
+ step.description || "",
109
+ step.markdown || "",
110
+ ...(step.variants || []).map(
111
+ (variant: SetupGuideStepVariant): string => {
112
+ return variant.markdown;
113
+ },
114
+ ),
115
+ ].join("\n");
116
+ })
117
+ .join("\n");
118
+ };
119
+
120
+ // The step that sets the variables: the one before "Invoke the function".
121
+ const settingsStep: (guide: SetupGuideContent) => SetupGuideStep = (
122
+ guide: SetupGuideContent,
123
+ ): SetupGuideStep => {
124
+ return guide.steps[guide.steps.length - 2]!;
125
+ };
126
+
127
+ /*
128
+ * Regex literals are named so the callsites read `RE.test(line)`: eslint's
129
+ * wrap-regex rule rejects `/.../.test(line)`.
130
+ */
131
+ const VARIABLE_LINE: RegExp = /^[A-Z][A-Z0-9_]*=/;
132
+ const REFERENCE_ROW: RegExp = /^\| `[A-Z_]+` \|/;
133
+
134
+ // The NAME=value lines of the code blocks in a piece of markdown.
135
+ const variableLinesIn: (markdown: string) => Array<string> = (
136
+ markdown: string,
137
+ ): Array<string> => {
138
+ const lines: Array<string> = [];
139
+ for (const match of markdown.matchAll(/```bash\n([\s\S]*?)```/g)) {
140
+ for (const line of match[1]!.split("\n")) {
141
+ if (VARIABLE_LINE.test(line)) {
142
+ lines.push(line);
143
+ }
144
+ }
145
+ }
146
+ return lines;
147
+ };
148
+
149
+ const docsPageExists: (url: string) => boolean = (url: string): boolean => {
150
+ return fs.existsSync(
151
+ path.join(DOCS_CONTENT, `${url.replace(/^\/docs\//, "")}.md`),
152
+ );
153
+ };
154
+
155
+ // The OTEL_RESOURCE_ATTRIBUTES the Azure Functions guide sets: no faas.name.
156
+ const AZURE_RESOURCE_ATTRIBUTES: string =
157
+ "cloud.provider=azure,cloud.platform=azure_functions";
158
+
159
+ describe("the platform picker", () => {
160
+ test("offers Lambda, Google Cloud Functions, Azure Functions and other runtimes, Lambda first", () => {
161
+ expect(PLATFORM_KEYS).toEqual([
162
+ "aws-lambda",
163
+ "google-cloud-functions",
164
+ "azure-functions",
165
+ "other",
166
+ ]);
167
+ expect(
168
+ SERVERLESS_PLATFORMS.map(
169
+ (option: SetupGuideOption<ServerlessPlatform>): string => {
170
+ return option.label;
171
+ },
172
+ ),
173
+ ).toEqual([
174
+ "AWS Lambda",
175
+ "Google Cloud Functions",
176
+ "Azure Functions",
177
+ "Other runtimes",
178
+ ]);
179
+ expect(DEFAULT_SERVERLESS_PLATFORM).toBe("aws-lambda");
180
+ });
181
+
182
+ test("every platform has a one-line description and no badge", () => {
183
+ for (const option of SERVERLESS_PLATFORMS) {
184
+ expect((option.description || "").length).toBeGreaterThan(0);
185
+ expect(option.description).not.toContain("\n");
186
+ expect(option.badge).toBeUndefined();
187
+ }
188
+ const other: SetupGuideOption<ServerlessPlatform> | undefined =
189
+ SERVERLESS_PLATFORMS.find(
190
+ (option: SetupGuideOption<ServerlessPlatform>): boolean => {
191
+ return option.key === "other";
192
+ },
193
+ );
194
+ expect(other?.description).toContain("Cloudflare Workers");
195
+ });
196
+
197
+ test("an unknown or missing platform resolves to AWS Lambda", () => {
198
+ for (const value of [undefined, null, "", "lambda", "AWS-LAMBDA"]) {
199
+ expect(resolveServerlessPlatform(value)).toBe("aws-lambda");
200
+ }
201
+ for (const platform of PLATFORM_KEYS) {
202
+ expect(resolveServerlessPlatform(platform)).toBe(platform);
203
+ }
204
+ });
205
+
206
+ test("each cloud platform option sets a cloud.platform ingest reads as serverless", () => {
207
+ expect(getServerlessCloudPlatform("aws-lambda")).toBe("aws_lambda");
208
+ expect(getServerlessCloudPlatform("google-cloud-functions")).toBe(
209
+ "gcp_cloud_functions",
210
+ );
211
+ expect(getServerlessCloudPlatform("azure-functions")).toBe(
212
+ "azure_functions",
213
+ );
214
+ expect(getServerlessCloudPlatform("other")).toBeUndefined();
215
+
216
+ for (const platform of PLATFORM_KEYS) {
217
+ const value: string | undefined = getServerlessCloudPlatform(platform);
218
+ if (value) {
219
+ expect(FAAS_CLOUD_PLATFORM_VALUES.has(value)).toBe(true);
220
+ }
221
+ }
222
+ });
223
+
224
+ test("a function's reported cloud.platform picks its option", () => {
225
+ expect(getServerlessPlatformForCloudPlatform("aws_lambda")).toBe(
226
+ "aws-lambda",
227
+ );
228
+ expect(getServerlessPlatformForCloudPlatform("gcp_cloud_functions")).toBe(
229
+ "google-cloud-functions",
230
+ );
231
+ expect(getServerlessPlatformForCloudPlatform("azure_functions")).toBe(
232
+ "azure-functions",
233
+ );
234
+ // The Node.js and .NET Azure detectors spell it with a dot.
235
+ expect(getServerlessPlatformForCloudPlatform("azure.functions")).toBe(
236
+ "azure-functions",
237
+ );
238
+ // Platforms without an option of their own get the generic guide.
239
+ for (const value of [
240
+ "tencent_cloud_scf",
241
+ "alibaba_cloud_fc",
242
+ "gcp_cloud_run",
243
+ ]) {
244
+ expect(getServerlessPlatformForCloudPlatform(value)).toBe("other");
245
+ }
246
+ // Nothing reported yet: the card opens on its default.
247
+ for (const value of [undefined, null, "", " "]) {
248
+ expect(getServerlessPlatformForCloudPlatform(value)).toBeUndefined();
249
+ }
250
+ });
251
+ });
252
+
253
+ describe.each(PLATFORM_KEYS)("the %s guide", (platform: ServerlessPlatform) => {
254
+ const guide: SetupGuideContent = guideFor(platform);
255
+ const markdown: string = getSetupGuideMarkdown(guide);
256
+ const steps: string = stepsText(guide);
257
+ const isLambda: boolean = platform === "aws-lambda";
258
+ const isAzure: boolean = platform === "azure-functions";
259
+ const cloudPlatform: string | undefined =
260
+ getServerlessCloudPlatform(platform);
261
+
262
+ test("ends by invoking the function and checking it arrived", () => {
263
+ expect(guide.steps.length).toBeGreaterThanOrEqual(2);
264
+ expect(guide.steps.length).toBeLessThanOrEqual(3);
265
+ expect(guide.steps[guide.steps.length - 1]!.title).toBe(
266
+ "Invoke the function and verify",
267
+ );
268
+ for (const step of guide.steps) {
269
+ expect((step.description || "").length).toBeGreaterThan(0);
270
+ expect(step.description).not.toContain("\n");
271
+ }
272
+ });
273
+
274
+ test("step 1 shows the OTLP endpoint the variables point at", () => {
275
+ expect(guide.keyStep?.endpointLabel).toBe("OTLP Endpoint");
276
+ expect(guide.keyStep?.endpointValue).toBe(`${URL}/otlp`);
277
+ expect((guide.keyStep?.description || "").length).toBeGreaterThan(0);
278
+ });
279
+
280
+ test("sets the exporter variables with the reader's URL and key", () => {
281
+ const lines: Array<string> = variableLinesIn(steps);
282
+ expect(lines).toContain(`OTEL_EXPORTER_OTLP_ENDPOINT=${URL}/otlp`);
283
+ expect(lines).toContain(
284
+ `OTEL_EXPORTER_OTLP_HEADERS=x-oneuptime-token=${KEY}`,
285
+ );
286
+ expect(lines).toContain("OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf");
287
+ });
288
+
289
+ test("the variables are console-ready NAME=value lines, never shell-quoted", () => {
290
+ const lines: Array<string> = variableLinesIn(
291
+ [
292
+ settingsStep(guide).markdown || "",
293
+ ...(settingsStep(guide).variants || [])
294
+ .filter((variant: SetupGuideStepVariant): boolean => {
295
+ return variant.label !== "Azure CLI";
296
+ })
297
+ .map((variant: SetupGuideStepVariant): string => {
298
+ return variant.markdown;
299
+ }),
300
+ ].join("\n"),
301
+ );
302
+ expect(lines.length).toBeGreaterThanOrEqual(4);
303
+ for (const line of lines) {
304
+ expect(line).not.toMatch(/["']/);
305
+ expect(line).not.toMatch(/^export /);
306
+ }
307
+ });
308
+
309
+ test("names the function and its platform the way this platform needs", () => {
310
+ const lines: Array<string> = variableLinesIn(steps);
311
+ const resourceLine: string | undefined = lines.find(
312
+ (line: string): boolean => {
313
+ return line.startsWith("OTEL_RESOURCE_ATTRIBUTES=");
314
+ },
315
+ );
316
+
317
+ if (isLambda) {
318
+ // The layer names the function; the guide sets no attributes of its own.
319
+ expect(resourceLine).toBeUndefined();
320
+ expect(lines).toContain(`AWS_LAMBDA_EXEC_WRAPPER=${LAMBDA_EXEC_WRAPPER}`);
321
+ expect(steps).toContain("sets `faas.name` from the function's name");
322
+ return;
323
+ }
324
+
325
+ if (isAzure) {
326
+ /*
327
+ * The function app's service.name names the function, for every
328
+ * process of the app; a faas.name in the app settings would name
329
+ * every function in it, and is never replaced.
330
+ */
331
+ expect(lines).toContain(
332
+ `OTEL_SERVICE_NAME=${SERVERLESS_EXAMPLE_FUNCTION_NAME}`,
333
+ );
334
+ expect(resourceLine).toBe(
335
+ `OTEL_RESOURCE_ATTRIBUTES=${AZURE_RESOURCE_ATTRIBUTES}`,
336
+ );
337
+ expect(markdown).not.toContain("faas.name=");
338
+ expect(steps).toContain(
339
+ "Leave `faas.name` out of `OTEL_RESOURCE_ATTRIBUTES`",
340
+ );
341
+ return;
342
+ }
343
+
344
+ expect(
345
+ lines.some((line: string): boolean => {
346
+ return line.startsWith("OTEL_SERVICE_NAME=");
347
+ }),
348
+ ).toBe(false);
349
+ expect(resourceLine).toBe(
350
+ `OTEL_RESOURCE_ATTRIBUTES=${getServerlessResourceAttributes({
351
+ platform: platform,
352
+ functionName: SERVERLESS_EXAMPLE_FUNCTION_NAME,
353
+ })}`,
354
+ );
355
+ expect(resourceLine).toContain(
356
+ `faas.name=${SERVERLESS_EXAMPLE_FUNCTION_NAME},faas.version=${SERVERLESS_EXAMPLE_FUNCTION_VERSION}`,
357
+ );
358
+ if (cloudPlatform) {
359
+ expect(resourceLine).toContain(`,cloud.platform=${cloudPlatform}`);
360
+ } else {
361
+ expect(resourceLine).not.toContain("cloud.platform");
362
+ }
363
+ });
364
+
365
+ test("assigns only its own cloud.platform", () => {
366
+ for (const other of PLATFORM_KEYS) {
367
+ const value: string | undefined = getServerlessCloudPlatform(other);
368
+ if (!value) {
369
+ continue;
370
+ }
371
+ expect(markdown.includes(`cloud.platform=${value}`)).toBe(
372
+ other === platform,
373
+ );
374
+ }
375
+ });
376
+
377
+ test("every command carries the reader's URL and key", () => {
378
+ const blocks: Array<string> = getSetupGuideCodeBlocks(guide);
379
+ const withToken: Array<string> = blocks.filter((block: string): boolean => {
380
+ return block.includes("x-oneuptime-token");
381
+ });
382
+ expect(withToken.length).toBeGreaterThanOrEqual(2);
383
+ for (const block of withToken) {
384
+ expect(block).toContain(KEY);
385
+ expect(block).toContain(URL);
386
+ }
387
+ expect(markdown).not.toContain(SETUP_GUIDE_API_KEY_PLACEHOLDER);
388
+ });
389
+
390
+ test("verifies the key against the validate endpoint", () => {
391
+ const verify: string = guide.steps[guide.steps.length - 1]!.markdown || "";
392
+ expect(verify).toContain(
393
+ `curl -i ${URL}/otlp/v1/validate \\\n -H "x-oneuptime-token: ${KEY}"`,
394
+ );
395
+ expect(verify).toContain('`200` with `"valid": true`');
396
+ expect(verify).toContain("`401`");
397
+ expect(verify).toContain(
398
+ "Once the function emits a span, log or metric it appears under **Serverless Functions**.",
399
+ );
400
+ expect(verify).toContain("invocations, error rate and p95 duration");
401
+ });
402
+
403
+ test("keeps the note that the token is a secret for a Server key", () => {
404
+ expect(steps).toContain(
405
+ "> **This token is a secret.** Use a **Server** ingestion key here and set it as a function environment variable.",
406
+ );
407
+ expect(steps).toContain("create a **Browser** ingestion key instead");
408
+ });
409
+
410
+ test("never uses a CLI form that splits values on commas or replaces every variable", () => {
411
+ for (const forbidden of [
412
+ "--set-env-vars",
413
+ "--update-env-vars",
414
+ "--env-vars-file",
415
+ "update-function-configuration",
416
+ "--environment",
417
+ "Variables={",
418
+ "gcloud functions deploy",
419
+ "gcloud run services update",
420
+ ]) {
421
+ expect(markdown).not.toContain(forbidden);
422
+ }
423
+ });
424
+
425
+ test("shows only its own platform's instructions", () => {
426
+ const own: Record<ServerlessPlatform, Array<string>> = {
427
+ "aws-lambda": [
428
+ "AWS_LAMBDA_EXEC_WRAPPER",
429
+ "Specify an ARN",
430
+ "Lambda console",
431
+ LAMBDA_LAYER_DOCS_URL,
432
+ ],
433
+ "google-cloud-functions": [
434
+ "Edit & deploy new revision",
435
+ "Runtime environment variables",
436
+ "Google Cloud console",
437
+ ],
438
+ "azure-functions": [
439
+ "az functionapp config appsettings set",
440
+ "Apply → Confirm",
441
+ "azure.functions",
442
+ "Azure portal",
443
+ ],
444
+ other: ["configured in code rather than through environment variables"],
445
+ };
446
+
447
+ for (const other of PLATFORM_KEYS) {
448
+ for (const text of own[other]) {
449
+ expect({ text, present: markdown.includes(text) }).toEqual({
450
+ text,
451
+ present: other === platform,
452
+ });
453
+ }
454
+ }
455
+ });
456
+
457
+ test("lists two to four prerequisites, one line each", () => {
458
+ const prerequisites: Array<string> = guide.prerequisites || [];
459
+ expect(prerequisites.length).toBeGreaterThanOrEqual(2);
460
+ expect(prerequisites.length).toBeLessThanOrEqual(4);
461
+ for (const line of prerequisites) {
462
+ expect(line).not.toContain("\n");
463
+ }
464
+ });
465
+
466
+ test("keeps reference material out of the first-run steps", () => {
467
+ for (const advanced of [
468
+ "oneuptime.label.",
469
+ "Label Rules",
470
+ "process.runtime",
471
+ "faas.instance",
472
+ "tencent_cloud_scf",
473
+ ]) {
474
+ expect(steps).not.toContain(advanced);
475
+ }
476
+ });
477
+
478
+ test("has Advanced topics for the variables, the attributes, labels and what you get", () => {
479
+ expect(topicTitles(guide.advanced)).toEqual([
480
+ "Environment variable reference",
481
+ "Resource attributes OneUptime reads",
482
+ "Label functions and assign owners",
483
+ "What you get",
484
+ ]);
485
+ });
486
+
487
+ test("every Advanced topic has a plain one-line summary", () => {
488
+ for (const topic of guide.advanced || []) {
489
+ expect(topic.summary).toBeTruthy();
490
+ // Summaries render as plain text, so no markdown.
491
+ expect(topic.summary).not.toMatch(/[`*_[\]#<>|]/);
492
+ expect(topic.summary).not.toContain("\n");
493
+ }
494
+ });
495
+
496
+ test("the variable reference lists exactly the variables the guide sets", () => {
497
+ const reference: string =
498
+ guide.advanced?.find((topic: SetupGuideTopic): boolean => {
499
+ return topic.title === "Environment variable reference";
500
+ })?.markdown || "";
501
+ const variables: Array<ServerlessEnvironmentVariable> =
502
+ getServerlessEnvironmentVariables({
503
+ oneuptimeUrl: URL,
504
+ apiKey: KEY,
505
+ platform: platform,
506
+ functionName: SERVERLESS_EXAMPLE_FUNCTION_NAME,
507
+ });
508
+ const rows: Array<string> = reference
509
+ .split("\n")
510
+ .filter((line: string): boolean => {
511
+ return REFERENCE_ROW.test(line);
512
+ });
513
+ expect(rows).toHaveLength(variables.length);
514
+ for (const variable of variables) {
515
+ expect(reference).toContain(
516
+ `| \`${variable.name}\` | \`${variable.value}\` |`,
517
+ );
518
+ }
519
+ });
520
+
521
+ test("the attribute table names what identifies a function and every serverless cloud.platform ingest reads", () => {
522
+ const attributes: string =
523
+ guide.advanced?.find((topic: SetupGuideTopic): boolean => {
524
+ return topic.title === "Resource attributes OneUptime reads";
525
+ })?.markdown || "";
526
+ // faas.name, or else service.name on a serverless cloud.platform.
527
+ expect(attributes).toContain(
528
+ "| `faas.name` | **yes**, unless the next two are set |",
529
+ );
530
+ expect(attributes).toContain(
531
+ "| `cloud.platform` | with `service.name`, when there is no `faas.name` |",
532
+ );
533
+ expect(attributes).toContain(
534
+ "| `service.name` | on a serverless `cloud.platform` without `faas.name` | Function identity, written onto the telemetry as `faas.name` |",
535
+ );
536
+ for (const value of Object.values(FaasCloudPlatform)) {
537
+ expect(attributes).toContain(`\`${value}\``);
538
+ }
539
+ expect(attributes).toContain(
540
+ "A function that also sets `service.name` still appears under **Services** too.",
541
+ );
542
+ });
543
+
544
+ test("labels come from oneuptime.label.* and the label and owner rules", () => {
545
+ const labels: string =
546
+ guide.advanced?.find((topic: SetupGuideTopic): boolean => {
547
+ return topic.title === "Label functions and assign owners";
548
+ })?.markdown || "";
549
+ expect(labels).toContain("`team:payments`");
550
+ expect(labels).toContain("oneuptime.label.team=payments");
551
+ expect(labels).toContain("**Serverless → Settings → Label Rules**");
552
+ const labelLine: string =
553
+ variableLinesIn(labels).find((line: string): boolean => {
554
+ return line.startsWith("OTEL_RESOURCE_ATTRIBUTES=");
555
+ }) || "";
556
+ /*
557
+ * Off Lambda, the label line carries the guide's own attributes too —
558
+ * on Azure Functions, without faas.name.
559
+ */
560
+ expect(
561
+ labelLine.includes(`faas.name=${SERVERLESS_EXAMPLE_FUNCTION_NAME}`),
562
+ ).toBe(!isLambda && !isAzure);
563
+ expect(labelLine.includes(AZURE_RESOURCE_ATTRIBUTES)).toBe(isAzure);
564
+ });
565
+
566
+ test("troubleshooting covers the key, a missing function, empty tabs and disconnects", () => {
567
+ expect(topicTitles(guide.troubleshooting)).toEqual([
568
+ "The key check returns 401",
569
+ "The function does not appear under Serverless Functions",
570
+ "The function is listed, but its tabs are empty",
571
+ 'The function shows as "Disconnected"',
572
+ ]);
573
+ });
574
+
575
+ test("a missing function is traced back to what this platform needs", () => {
576
+ const missing: string =
577
+ guide.troubleshooting?.find((topic: SetupGuideTopic): boolean => {
578
+ return (
579
+ topic.title ===
580
+ "The function does not appear under Serverless Functions"
581
+ );
582
+ })?.markdown || "";
583
+ expect(missing.includes("AWS_LAMBDA_EXEC_WRAPPER")).toBe(isLambda);
584
+ expect(
585
+ missing.includes("`OTEL_RESOURCE_ATTRIBUTES` carries `faas.name`"),
586
+ ).toBe(!isLambda && !isAzure);
587
+ expect(
588
+ missing.includes(
589
+ "`OTEL_RESOURCE_ATTRIBUTES` carries `cloud.platform=azure_functions`",
590
+ ),
591
+ ).toBe(isAzure);
592
+ expect(missing).toContain("only sends telemetry while it runs");
593
+ });
594
+
595
+ /*
596
+ * Ingest writes service.name onto the telemetry of a function named by it
597
+ * (stampServerlessFunctionNameAttribute), so such a function's tabs fill
598
+ * without a faas.name of its own; only telemetry stored before that is
599
+ * missing it, and it is not updated.
600
+ */
601
+ test("empty tabs are never blamed on a missing faas.name that ingest fills in", () => {
602
+ const empty: string =
603
+ guide.troubleshooting?.find((topic: SetupGuideTopic): boolean => {
604
+ return topic.title === "The function is listed, but its tabs are empty";
605
+ })?.markdown || "";
606
+ expect(empty).toContain(
607
+ "whose `faas.name` equals its **Function Identifier** exactly",
608
+ );
609
+ expect(empty).not.toContain("has no `faas.name` on its telemetry");
610
+ expect(empty).not.toContain("add `faas.name`");
611
+ expect(
612
+ empty.includes(
613
+ "OneUptime writes the `service.name` onto the telemetry as `faas.name` as it arrives",
614
+ ),
615
+ ).toBe(!isLambda);
616
+ expect(
617
+ empty.includes(
618
+ "Telemetry stored before OneUptime began filling in `faas.name` is not updated",
619
+ ),
620
+ ).toBe(!isLambda);
621
+ });
622
+
623
+ test("links to the serverless functions docs page, which exists", () => {
624
+ expect(guide.links).toEqual([
625
+ {
626
+ title: "Serverless functions documentation",
627
+ url: SERVERLESS_DOCS_URL,
628
+ },
629
+ ]);
630
+ expect(docsPageExists(SERVERLESS_DOCS_URL)).toBe(true);
631
+ });
632
+
633
+ test("every docs link in the guide points at a page that exists", () => {
634
+ const links: Array<string> = Array.from(
635
+ markdown.matchAll(/\]\((\/docs\/[^)#\s]+)/g),
636
+ ).map((match: RegExpMatchArray): string => {
637
+ return match[1]!;
638
+ });
639
+ expect(links.length).toBeGreaterThan(0);
640
+ for (const link of links) {
641
+ expect({ link, exists: docsPageExists(link) }).toEqual({
642
+ link,
643
+ exists: true,
644
+ });
645
+ }
646
+ });
647
+ });
648
+
649
+ describe("the function name", () => {
650
+ test("a product page suggests a name and says to replace it", () => {
651
+ for (const platform of [
652
+ "google-cloud-functions",
653
+ "azure-functions",
654
+ "other",
655
+ ] as Array<ServerlessPlatform>) {
656
+ const steps: string = stepsText(guideFor(platform));
657
+ // Azure Functions asks for the function app's name.
658
+ expect(steps).toContain(
659
+ platform === "azure-functions"
660
+ ? `Replace \`${SERVERLESS_EXAMPLE_FUNCTION_NAME}\` with your function app's name`
661
+ : `Replace \`${SERVERLESS_EXAMPLE_FUNCTION_NAME}\` with your function's name`,
662
+ );
663
+ expect(steps).toContain("a new name registers a new function");
664
+ }
665
+ });
666
+
667
+ test("a function's own tab sets faas.name to its identifier and says to keep it", () => {
668
+ const guide: SetupGuideContent = guideFor("google-cloud-functions", {
669
+ functionName: "invoice-mailer",
670
+ });
671
+ const steps: string = stepsText(guide);
672
+ expect(variableLinesIn(steps)).toContain(
673
+ "OTEL_RESOURCE_ATTRIBUTES=faas.name=invoice-mailer,faas.version=1.4.2,cloud.platform=gcp_cloud_functions",
674
+ );
675
+ expect(steps).toContain("`faas.name` is **`invoice-mailer`**");
676
+ expect(steps).toContain("keep it as it is");
677
+ expect(steps).not.toContain(
678
+ `Replace \`${SERVERLESS_EXAMPLE_FUNCTION_NAME}\``,
679
+ );
680
+ expect(getSetupGuideMarkdown(guide)).not.toContain(
681
+ `faas.name=${SERVERLESS_EXAMPLE_FUNCTION_NAME}`,
682
+ );
683
+ });
684
+
685
+ test("Lambda leaves naming to the layer, even for a known function", () => {
686
+ const steps: string = stepsText(
687
+ guideFor("aws-lambda", { functionName: "invoice-mailer" }),
688
+ );
689
+ expect(steps).not.toContain("faas.name=");
690
+ expect(steps).not.toContain("Replace `");
691
+ });
692
+
693
+ test("a name OTEL_RESOURCE_ATTRIBUTES cannot carry as written is percent-encoded", () => {
694
+ const name: string = "billing jobs,v2=%";
695
+ const guide: SetupGuideContent = guideFor("other", { functionName: name });
696
+ const line: string =
697
+ variableLinesIn(stepsText(guide)).find((candidate: string): boolean => {
698
+ return candidate.startsWith("OTEL_RESOURCE_ATTRIBUTES=");
699
+ }) || "";
700
+ const pairs: Array<string> = line
701
+ .replace("OTEL_RESOURCE_ATTRIBUTES=", "")
702
+ .split(",");
703
+ // Still two pairs: the comma in the name did not split it.
704
+ expect(pairs).toHaveLength(2);
705
+ expect(pairs[0]).toBe("faas.name=billing%20jobs%2Cv2%3D%25");
706
+ expect(decodeURIComponent(pairs[0]!.replace("faas.name=", ""))).toBe(name);
707
+ expect(stepsText(guide)).toContain("percent-encoded");
708
+ });
709
+
710
+ test("an ordinary name is not encoded and needs no note", () => {
711
+ const steps: string = stepsText(
712
+ guideFor("other", { functionName: "checkout_v2.handler" }),
713
+ );
714
+ expect(steps).toContain("faas.name=checkout_v2.handler,");
715
+ expect(steps).not.toContain("percent-encoded");
716
+ });
717
+
718
+ test("a blank name counts as unknown", () => {
719
+ for (const platform of [
720
+ "google-cloud-functions",
721
+ "azure-functions",
722
+ ] as Array<ServerlessPlatform>) {
723
+ const steps: string = stepsText(
724
+ guideFor(platform, { functionName: " " }),
725
+ );
726
+ expect(variableLinesIn(steps)).toContain(
727
+ platform === "azure-functions"
728
+ ? `OTEL_SERVICE_NAME=${SERVERLESS_EXAMPLE_FUNCTION_NAME}`
729
+ : `OTEL_RESOURCE_ATTRIBUTES=faas.name=${SERVERLESS_EXAMPLE_FUNCTION_NAME},faas.version=${SERVERLESS_EXAMPLE_FUNCTION_VERSION},cloud.platform=gcp_cloud_functions`,
730
+ );
731
+ expect(steps).toContain(
732
+ `Replace \`${SERVERLESS_EXAMPLE_FUNCTION_NAME}\``,
733
+ );
734
+ }
735
+ });
736
+
737
+ /*
738
+ * On Azure Functions the function app's service.name names the function:
739
+ * the Functions host and Azure's resource detectors never set faas.name,
740
+ * app settings reach every function in the app, and a faas.name that is
741
+ * sent is never replaced. The guide sets OTEL_SERVICE_NAME instead, and
742
+ * ingest writes it onto the telemetry as faas.name.
743
+ */
744
+ test("on Azure Functions a function's own tab sets OTEL_SERVICE_NAME to its identifier and leaves faas.name out", () => {
745
+ const guide: SetupGuideContent = guideFor("azure-functions", {
746
+ functionName: "orders-func-app",
747
+ });
748
+ const steps: string = stepsText(guide);
749
+ const lines: Array<string> = variableLinesIn(steps);
750
+ expect(lines).toContain("OTEL_SERVICE_NAME=orders-func-app");
751
+ expect(lines).toContain(
752
+ `OTEL_RESOURCE_ATTRIBUTES=${AZURE_RESOURCE_ATTRIBUTES}`,
753
+ );
754
+ expect(steps).toContain(
755
+ "`OTEL_SERVICE_NAME` is **`orders-func-app`**, this function's identifier — keep it as it is",
756
+ );
757
+ expect(steps).not.toContain(
758
+ `Replace \`${SERVERLESS_EXAMPLE_FUNCTION_NAME}\``,
759
+ );
760
+ // Nowhere: not the steps, the CLI, the reference, nor the label example.
761
+ expect(getSetupGuideMarkdown(guide)).not.toContain("faas.name=");
762
+ });
763
+
764
+ test("on Azure Functions the name goes into OTEL_SERVICE_NAME as written", () => {
765
+ const name: string = "billing jobs,v2=%";
766
+ const steps: string = stepsText(
767
+ guideFor("azure-functions", { functionName: name }),
768
+ );
769
+ // A plain string, not percent-decoded like OTEL_RESOURCE_ATTRIBUTES.
770
+ expect(variableLinesIn(steps)).toContain(`OTEL_SERVICE_NAME=${name}`);
771
+ expect(steps).not.toContain("percent-encoded");
772
+ });
773
+ });
774
+
775
+ describe("before a key is picked", () => {
776
+ test.each(PLATFORM_KEYS)(
777
+ "%s shows the placeholder and says where to pick a key",
778
+ (platform: ServerlessPlatform) => {
779
+ const guide: SetupGuideContent = guideFor(platform, {
780
+ apiKey: SETUP_GUIDE_API_KEY_PLACEHOLDER,
781
+ });
782
+ const steps: string = stepsText(guide);
783
+ expect(variableLinesIn(steps)).toContain(
784
+ `OTEL_EXPORTER_OTLP_HEADERS=x-oneuptime-token=${SETUP_GUIDE_API_KEY_PLACEHOLDER}`,
785
+ );
786
+ expect(steps).toContain(
787
+ `Pick an ingestion key in step 1 to fill in \`${SETUP_GUIDE_API_KEY_PLACEHOLDER}\`.`,
788
+ );
789
+ },
790
+ );
791
+
792
+ test("the note goes away once a key is picked", () => {
793
+ for (const platform of PLATFORM_KEYS) {
794
+ expect(getSetupGuideMarkdown(guideFor(platform))).not.toContain(
795
+ "Pick an ingestion key in step 1",
796
+ );
797
+ }
798
+ });
799
+ });
800
+
801
+ describe("the Azure CLI tab", () => {
802
+ const cliMarkdown: (apiKey: string) => string = (apiKey: string): string => {
803
+ const step: SetupGuideStep = settingsStep(
804
+ guideFor("azure-functions", { apiKey: apiKey }),
805
+ );
806
+ return (
807
+ step.variants?.find((variant: SetupGuideStepVariant): boolean => {
808
+ return variant.label === "Azure CLI";
809
+ })?.markdown || ""
810
+ );
811
+ };
812
+
813
+ const command: (apiKey: string) => string = (apiKey: string): string => {
814
+ const match: RegExpMatchArray | null = cliMarkdown(apiKey).match(
815
+ /```bash\n([\s\S]*?)\n```/,
816
+ );
817
+ return match ? match[1]! : "";
818
+ };
819
+
820
+ test("the portal comes first, the CLI second", () => {
821
+ const step: SetupGuideStep = settingsStep(guideFor("azure-functions"));
822
+ expect(
823
+ (step.variants || []).map((variant: SetupGuideStepVariant): string => {
824
+ return variant.label;
825
+ }),
826
+ ).toEqual(["Azure portal", "Azure CLI"]);
827
+ });
828
+
829
+ test("sets every variable in one appsettings call, without touching the others", () => {
830
+ const cli: string = command(KEY);
831
+ expect(cli).toMatch(
832
+ /^az functionapp config appsettings set \\\n {2}--name <function-app-name> \\\n {2}--resource-group <resource-group> \\\n {2}--settings \\\n/,
833
+ );
834
+ for (const variable of getServerlessEnvironmentVariables({
835
+ oneuptimeUrl: URL,
836
+ apiKey: KEY,
837
+ platform: "azure-functions",
838
+ functionName: SERVERLESS_EXAMPLE_FUNCTION_NAME,
839
+ })) {
840
+ expect(cli).toContain(` ${variable.name}=${variable.value}`);
841
+ }
842
+ // The comma-separated attributes stay one argument.
843
+ expect(cli).toContain(
844
+ ` OTEL_RESOURCE_ATTRIBUTES=${AZURE_RESOURCE_ATTRIBUTES}`,
845
+ );
846
+ // The function app's name names the function; faas.name stays out.
847
+ expect(cli).toContain(
848
+ ` OTEL_SERVICE_NAME=${SERVERLESS_EXAMPLE_FUNCTION_NAME}`,
849
+ );
850
+ expect(cli).not.toContain("faas.name");
851
+ expect(cliMarkdown(KEY)).toContain(
852
+ "adds or updates only the settings you pass",
853
+ );
854
+ });
855
+
856
+ test("quotes a setting the shell would otherwise mangle", () => {
857
+ expect(command(SETUP_GUIDE_API_KEY_PLACEHOLDER)).toContain(
858
+ `'OTEL_EXPORTER_OTLP_HEADERS=x-oneuptime-token=${SETUP_GUIDE_API_KEY_PLACEHOLDER}'`,
859
+ );
860
+ expect(command("abc$def")).toContain(
861
+ "'OTEL_EXPORTER_OTLP_HEADERS=x-oneuptime-token=abc$def'",
862
+ );
863
+ });
864
+ });
865
+
866
+ describe("the variables", () => {
867
+ test("Lambda turns the layer on and sets no attributes of its own", () => {
868
+ expect(
869
+ getServerlessEnvironmentVariables({
870
+ oneuptimeUrl: URL,
871
+ apiKey: KEY,
872
+ platform: "aws-lambda",
873
+ functionName: SERVERLESS_EXAMPLE_FUNCTION_NAME,
874
+ }),
875
+ ).toEqual([
876
+ { name: "AWS_LAMBDA_EXEC_WRAPPER", value: "/opt/otel-handler" },
877
+ { name: "OTEL_EXPORTER_OTLP_ENDPOINT", value: `${URL}/otlp` },
878
+ { name: "OTEL_EXPORTER_OTLP_HEADERS", value: `x-oneuptime-token=${KEY}` },
879
+ { name: "OTEL_EXPORTER_OTLP_PROTOCOL", value: "http/protobuf" },
880
+ ]);
881
+ });
882
+
883
+ test("Azure Functions names the function app with OTEL_SERVICE_NAME and sets no faas.name", () => {
884
+ expect(
885
+ getServerlessEnvironmentVariables({
886
+ oneuptimeUrl: URL,
887
+ apiKey: KEY,
888
+ platform: "azure-functions",
889
+ functionName: SERVERLESS_EXAMPLE_FUNCTION_NAME,
890
+ }),
891
+ ).toEqual([
892
+ { name: "OTEL_EXPORTER_OTLP_ENDPOINT", value: `${URL}/otlp` },
893
+ { name: "OTEL_EXPORTER_OTLP_HEADERS", value: `x-oneuptime-token=${KEY}` },
894
+ { name: "OTEL_EXPORTER_OTLP_PROTOCOL", value: "http/protobuf" },
895
+ { name: "OTEL_SERVICE_NAME", value: SERVERLESS_EXAMPLE_FUNCTION_NAME },
896
+ { name: "OTEL_RESOURCE_ATTRIBUTES", value: AZURE_RESOURCE_ATTRIBUTES },
897
+ ]);
898
+ });
899
+
900
+ test("everywhere else they name the function", () => {
901
+ expect(
902
+ getServerlessEnvironmentVariables({
903
+ oneuptimeUrl: URL,
904
+ apiKey: KEY,
905
+ platform: "other",
906
+ functionName: SERVERLESS_EXAMPLE_FUNCTION_NAME,
907
+ }),
908
+ ).toEqual([
909
+ { name: "OTEL_EXPORTER_OTLP_ENDPOINT", value: `${URL}/otlp` },
910
+ { name: "OTEL_EXPORTER_OTLP_HEADERS", value: `x-oneuptime-token=${KEY}` },
911
+ { name: "OTEL_EXPORTER_OTLP_PROTOCOL", value: "http/protobuf" },
912
+ {
913
+ name: "OTEL_RESOURCE_ATTRIBUTES",
914
+ value: "faas.name=checkout-handler,faas.version=1.4.2",
915
+ },
916
+ ]);
917
+ });
918
+ });
919
+
920
+ /*
921
+ * The guide explains how OneUptime finds and shows a function. Each of
922
+ * these reads the code that does it, so the explanation cannot outlive a
923
+ * change to it.
924
+ */
925
+ describe("what the guide says matches the product", () => {
926
+ const read: (relativePath: string) => string = (
927
+ relativePath: string,
928
+ ): string => {
929
+ return fs.readFileSync(path.join(REPO_ROOT, relativePath), "utf8");
930
+ };
931
+
932
+ /*
933
+ * resolveServerlessFunctionIdentity decides which function a batch is (an
934
+ * explicit faas.name, or else service.name on a serverless
935
+ * cloud.platform), stampServerlessFunctionNameAttribute writes a
936
+ * service.name identity onto the batch as faas.name, and
937
+ * autoDiscoverServerless registers the function and reads the rest.
938
+ */
939
+ test("ingest registers a function from faas.name or service.name and reads the attributes the table lists", () => {
940
+ const ingest: string = read(
941
+ "packages/App/FeatureSet/Telemetry/Services/OtelIngestBaseService.ts",
942
+ );
943
+ const identityStart: number = ingest.indexOf(
944
+ "protected static resolveServerlessFunctionIdentity(",
945
+ );
946
+ const discoveryStart: number = ingest.indexOf(
947
+ "protected static async autoDiscoverServerless(",
948
+ );
949
+ const end: number = ingest.indexOf(
950
+ "protected static async promoteOneuptimeLabelsToServerlessFunction(",
951
+ );
952
+ expect(identityStart).toBeGreaterThan(-1);
953
+ expect(discoveryStart).toBeGreaterThan(identityStart);
954
+ expect(end).toBeGreaterThan(discoveryStart);
955
+
956
+ const identity: string = ingest.slice(identityStart, discoveryStart);
957
+ for (const attribute of ["faas.name", "cloud.platform", "service.name"]) {
958
+ expect(identity).toContain(`"${attribute}"`);
959
+ }
960
+ expect(identity).toContain("FAAS_CLOUD_PLATFORM_VALUES");
961
+
962
+ const discovery: string = ingest.slice(discoveryStart, end);
963
+ expect(discovery).toContain("this.resolveServerlessFunctionIdentity(");
964
+ for (const attribute of [
965
+ "faas.version",
966
+ "faas.instance",
967
+ "cloud.provider",
968
+ "cloud.region",
969
+ "cloud.account.id",
970
+ "process.runtime.name",
971
+ "process.runtime.version",
972
+ ]) {
973
+ expect(discovery).toContain(`"${attribute}"`);
974
+ }
975
+ expect(discovery).toContain("promoteOneuptimeLabelsToServerlessFunction");
976
+ });
977
+
978
+ test("ingest writes a service.name identity onto every signal's telemetry as faas.name, as the guide says", () => {
979
+ const ingest: string = read(
980
+ "packages/App/FeatureSet/Telemetry/Services/OtelIngestBaseService.ts",
981
+ );
982
+ expect(ingest).toContain(
983
+ "protected static stampServerlessFunctionNameAttribute(",
984
+ );
985
+ for (const signal of ["Traces", "Logs", "Metrics", "Profiles"]) {
986
+ expect({
987
+ signal,
988
+ stamps: read(
989
+ `packages/App/FeatureSet/Telemetry/Services/Otel${signal}IngestService.ts`,
990
+ ).includes("this.stampServerlessFunctionNameAttribute("),
991
+ }).toEqual({ signal, stamps: true });
992
+ }
993
+ });
994
+
995
+ test("the Azure Functions guide follows the docs page's Azure Functions section", () => {
996
+ const docs: string = fs.readFileSync(
997
+ path.join(DOCS_CONTENT, "telemetry/serverless-functions.md"),
998
+ "utf8",
999
+ );
1000
+ // The section the guide links to, and what it says about faas.name.
1001
+ expect(docs).toContain("\n## Azure Functions\n");
1002
+ expect(docs).toContain(
1003
+ "Don't add `faas.name` to `OTEL_RESOURCE_ATTRIBUTES` on a Function App",
1004
+ );
1005
+ // The settings it gives a worker without an Azure resource detector.
1006
+ expect(docs).toContain("OTEL_SERVICE_NAME=my-function-app");
1007
+ expect(docs).toContain(
1008
+ `"OTEL_RESOURCE_ATTRIBUTES=${AZURE_RESOURCE_ATTRIBUTES}"`,
1009
+ );
1010
+
1011
+ const markdown: string = getSetupGuideMarkdown(guideFor("azure-functions"));
1012
+ expect(markdown).toContain(`${SERVERLESS_DOCS_URL}#azure-functions`);
1013
+ expect(markdown).not.toContain("faas.name=");
1014
+ expect(markdown).toContain(
1015
+ `OTEL_RESOURCE_ATTRIBUTES=${AZURE_RESOURCE_ATTRIBUTES}`,
1016
+ );
1017
+ });
1018
+
1019
+ test("every tab of a function filters on resource.faas.name", () => {
1020
+ for (const page of ["Overview", "Logs", "Traces", "Metrics"]) {
1021
+ expect(
1022
+ read(
1023
+ `packages/App/FeatureSet/Dashboard/src/Pages/Serverless/View/${page}.tsx`,
1024
+ ),
1025
+ ).toContain('"resource.faas.name"');
1026
+ }
1027
+ });
1028
+
1029
+ test("a function is marked disconnected after 15 minutes without telemetry", () => {
1030
+ const service: string = read(
1031
+ "packages/Common/Server/Services/ServerlessFunctionService.ts",
1032
+ );
1033
+ expect(service).toMatch(
1034
+ /markDisconnectedFunctions[\s\S]*?addRemoveMinutes\(\s*OneUptimeDate\.getCurrentDate\(\),\s*-15,/,
1035
+ );
1036
+ });
1037
+
1038
+ test("label and owner rules exist and run when a function is created", () => {
1039
+ for (const page of ["LabelRules", "OwnerRules"]) {
1040
+ expect(
1041
+ fs.existsSync(
1042
+ path.join(DASHBOARD_SRC, `Pages/Serverless/Settings/${page}.tsx`),
1043
+ ),
1044
+ ).toBe(true);
1045
+ }
1046
+ const service: string = read(
1047
+ "packages/Common/Server/Services/ServerlessFunctionService.ts",
1048
+ );
1049
+ expect(service).toMatch(
1050
+ /onCreateSuccess[\s\S]*?ServerlessFunctionLabelRuleEngineService[\s\S]*?ServerlessFunctionOwnerRuleEngineService/,
1051
+ );
1052
+ });
1053
+
1054
+ test("the Lambda wrapper path and layer docs match the docs page", () => {
1055
+ const docs: string = fs.readFileSync(
1056
+ path.join(DOCS_CONTENT, "telemetry/serverless-functions.md"),
1057
+ "utf8",
1058
+ );
1059
+ expect(docs).toContain(`AWS_LAMBDA_EXEC_WRAPPER=${LAMBDA_EXEC_WRAPPER}`);
1060
+ expect(docs).toContain(LAMBDA_LAYER_DOCS_URL);
1061
+ });
1062
+
1063
+ test("the validate endpoint the guide checks the key with exists", () => {
1064
+ expect(
1065
+ read("packages/App/FeatureSet/Telemetry/API/OTelIngest.ts"),
1066
+ ).toContain('"/otlp/v1/validate"');
1067
+ });
1068
+
1069
+ test("a Browser key is refused without an Origin header, as the troubleshooting says", () => {
1070
+ expect(
1071
+ read("packages/Common/Server/Middleware/TelemetryIngest.ts"),
1072
+ ).toContain("This request did not send an Origin header");
1073
+ });
1074
+ });