@oneuptime/common 13.0.7 → 14.0.0

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 (759) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Monitor.ts +3 -2
  4. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  5. package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
  6. package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
  7. package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
  8. package/Scripts/generate-service-worker.js +65 -4
  9. package/Server/API/AIBillingAPI.ts +1 -0
  10. package/Server/API/AIInsightAPI.ts +1 -4
  11. package/Server/API/AIInvestigationAPI.ts +1 -4
  12. package/Server/API/AIReadinessAPI.ts +4 -5
  13. package/Server/API/AlertAPI.ts +1 -0
  14. package/Server/API/AutoRemediationAPI.ts +1 -4
  15. package/Server/API/BaseAPI.ts +34 -0
  16. package/Server/API/BaseAnalyticsAPI.ts +80 -9
  17. package/Server/API/BillingAPI.ts +2 -0
  18. package/Server/API/BillingInvoiceAPI.ts +1 -0
  19. package/Server/API/BillingPaymentMethodAPI.ts +2 -0
  20. package/Server/API/CodeFixRunAPI.ts +1 -3
  21. package/Server/API/CommonAPI.ts +68 -4
  22. package/Server/API/DashboardAPI.ts +12 -12
  23. package/Server/API/GlobalConfigAPI.ts +243 -460
  24. package/Server/API/IncidentAPI.ts +2 -0
  25. package/Server/API/IncidentEpisodeAPI.ts +1 -0
  26. package/Server/API/NotificationAPI.ts +1 -0
  27. package/Server/API/OnCallCalendarAPI.ts +4 -5
  28. package/Server/API/OnCallDutyPolicyAPI.ts +7 -0
  29. package/Server/API/OnCallReadinessAPI.ts +4 -1
  30. package/Server/API/OnCallScheduleTimelineAPI.ts +731 -0
  31. package/Server/API/ProjectAPI.ts +1 -0
  32. package/Server/API/ProjectOIDC.ts +25 -16
  33. package/Server/API/ProjectSSO.ts +24 -16
  34. package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
  35. package/Server/API/StatusPageAPI.ts +261 -74
  36. package/Server/API/TeamMemberAPI.ts +13 -1
  37. package/Server/API/UserCallAPI.ts +2 -0
  38. package/Server/API/UserEmailAPI.ts +2 -0
  39. package/Server/API/UserIncomingCallNumberAPI.ts +2 -0
  40. package/Server/API/UserMicrosoftTeamsAPI.ts +1 -0
  41. package/Server/API/UserSlackAPI.ts +1 -0
  42. package/Server/API/UserSmsAPI.ts +2 -0
  43. package/Server/API/UserTotpAuthAPI.ts +1 -0
  44. package/Server/API/UserWebAuthnAPI.ts +2 -0
  45. package/Server/API/UserWebhookAPI.ts +1 -0
  46. package/Server/API/UserWhatsAppAPI.ts +2 -0
  47. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  48. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  49. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  50. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  51. package/Server/EnvironmentConfig.ts +147 -2
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  54. package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
  55. package/Server/Middleware/UserAuthorization.ts +117 -21
  56. package/Server/Services/ApiKeyPermissionService.ts +101 -4
  57. package/Server/Services/AuditLogService.ts +84 -1079
  58. package/Server/Services/DatabaseService.ts +245 -0
  59. package/Server/Services/DetectionRuleService.ts +5 -4
  60. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  61. package/Server/Services/GlobalConfigService.ts +80 -1
  62. package/Server/Services/MonitorProbeService.ts +116 -20
  63. package/Server/Services/MonitorService.ts +56 -4
  64. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  65. package/Server/Services/MonitorTemplateService.ts +26 -0
  66. package/Server/Services/OnCallDutyPolicyChildService.ts +261 -0
  67. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -2
  68. package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -2
  69. package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -2
  70. package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -2
  71. package/Server/Services/PayAsYouGoBillingService.ts +23 -28
  72. package/Server/Services/ProjectService.ts +302 -0
  73. package/Server/Services/RumSessionPinService.ts +293 -22
  74. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  75. package/Server/Services/StatusPageService.ts +78 -1
  76. package/Server/Services/TeamMemberService.ts +11 -0
  77. package/Server/Services/TeamPermissionService.ts +120 -26
  78. package/Server/Services/TeamService.ts +10 -0
  79. package/Server/Services/ThreatIntelFeedService.ts +6 -3
  80. package/Server/Services/UserService.ts +10 -17
  81. package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
  82. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  83. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  84. package/Server/Types/Database/Permissions/Index.ts +75 -11
  85. package/Server/Types/Database/Permissions/TablePermission.ts +34 -31
  86. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  87. package/Server/Types/Markdown.ts +41 -0
  88. package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
  89. package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
  90. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  91. package/Server/Utils/EditionEnforcement.ts +233 -0
  92. package/Server/Utils/FrontendEnvironment.ts +41 -2
  93. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  94. package/Server/Utils/MasterAdminPageAccess.ts +61 -0
  95. package/Server/Utils/Monitor/AffectedResourceList.ts +190 -0
  96. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  97. package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
  98. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
  99. package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
  100. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  101. package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1 -1
  102. package/Server/Utils/Realtime.ts +163 -45
  103. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +11 -28
  104. package/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.ts +170 -0
  105. package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +1 -1
  106. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +6 -2
  107. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +10 -9
  108. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  109. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  110. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  111. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  112. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  113. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  114. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  115. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  116. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +1059 -0
  117. package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +376 -0
  118. package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +757 -0
  119. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +307 -0
  120. package/Tests/App/Dashboard/ArgumentsFormGroupByUnlistedAttributes.test.tsx +131 -0
  121. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  122. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +1 -1
  123. package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +9 -1
  124. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +24 -0
  125. package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +162 -8
  126. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  127. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  128. package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +105 -6
  129. package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +434 -0
  130. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +276 -1
  131. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  132. package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
  133. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  134. package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +58 -42
  135. package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +42 -5
  136. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +34 -23
  137. package/Tests/App/Dashboard/ScheduleTimeline.test.tsx +1580 -0
  138. package/Tests/App/Dashboard/ScheduleTimelineAPI.test.ts +280 -0
  139. package/Tests/App/Dashboard/ScheduleTimelineModel.test.ts +673 -0
  140. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +133 -70
  141. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  142. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  143. package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
  144. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -58
  145. package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
  146. package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
  147. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  148. package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
  149. package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
  150. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  151. package/Tests/App/Dashboard/SloOverviewHero.test.tsx +171 -36
  152. package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +215 -0
  153. package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +40 -3
  154. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  155. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
  156. package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
  157. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  158. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  159. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  160. package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
  161. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  162. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +138 -5
  163. package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +187 -0
  164. package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +51 -3
  165. package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +55 -2
  166. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  167. package/Tests/Server/API/BaseAnalyticsAPIAggregateCache.test.ts +729 -0
  168. package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +93 -7
  169. package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +36 -3
  170. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +1003 -24
  171. package/Tests/Server/API/DashboardPublicRateLimit.test.ts +6 -3
  172. package/Tests/Server/API/ExpiredSessionAIRoutes.test.ts +708 -0
  173. package/Tests/Server/API/ExpiredSessionCustomRoutes.test.ts +928 -0
  174. package/Tests/Server/API/ExpiredSessionMonitorTemplate.test.ts +319 -0
  175. package/Tests/Server/API/ExpiredSessionOnCallDutyPolicy.test.ts +336 -0
  176. package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +820 -0
  177. package/Tests/Server/API/GlobalConfigLicense.test.ts +766 -381
  178. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +115 -12
  179. package/Tests/Server/API/OnCallCalendarAPI.test.ts +375 -8
  180. package/Tests/Server/API/OnCallReadinessAPI.test.ts +196 -912
  181. package/Tests/Server/API/OnCallScheduleTimelineAPI.test.ts +1513 -0
  182. package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +119 -7
  183. package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +111 -4
  184. package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +615 -0
  185. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +89 -2
  186. package/Tests/Server/API/SessionReplayAPI.test.ts +121 -0
  187. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  188. package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +4 -2
  189. package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +441 -0
  190. package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +664 -0
  191. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  192. package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +7 -0
  193. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +6 -0
  194. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +65 -4
  195. package/Tests/Server/API/UserProjectsAPI.test.ts +63 -3
  196. package/Tests/Server/API/UserTotpAuthAPI.test.ts +48 -2
  197. package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +11 -2
  198. package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +46 -3
  199. package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +18 -2
  200. package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +24 -7
  201. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  202. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  203. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  204. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  205. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  206. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  207. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  208. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  209. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  210. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  211. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  212. package/Tests/Server/Middleware/ExpiredSessionUserMiddleware.test.ts +563 -0
  213. package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +299 -19
  214. package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +453 -0
  215. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  216. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  217. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +24 -0
  218. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +2 -0
  219. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +3 -3
  220. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  221. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  222. package/Tests/Server/Services/DatabaseServiceCreateSuppliedId.test.ts +147 -0
  223. package/Tests/Server/Services/DatabaseServiceLoginBeforeHooks.test.ts +1078 -0
  224. package/Tests/Server/Services/DatabaseServiceTenantRelationGuard.test.ts +259 -0
  225. package/Tests/Server/Services/DatabaseServiceWriteOperatorValues.test.ts +147 -0
  226. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  227. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  228. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  229. package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
  230. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  231. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  232. package/Tests/Server/Services/OnCallChildCreateAuthorizationPostgres.test.ts +711 -0
  233. package/Tests/Server/Services/OnCallDutyPolicyChildService.test.ts +733 -0
  234. package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +190 -140
  235. package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +4 -9
  236. package/Tests/Server/Services/PermissionBlockDeletion.test.ts +780 -0
  237. package/Tests/Server/Services/PermissionBlockDeletionPostgres.test.ts +628 -0
  238. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  239. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  240. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
  241. package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
  242. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  243. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  244. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  245. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  246. package/Tests/Server/Services/TeamMemberMultiTenantReadPostgres.test.ts +394 -0
  247. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +6 -0
  248. package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +131 -0
  249. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  250. package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
  251. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  252. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  253. package/Tests/Server/Types/Database/Permissions/ModelPermissionAnonymousRefusal.test.ts +518 -0
  254. package/Tests/Server/Types/Database/Permissions/MultiTenantPermissions.test.ts +350 -0
  255. package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +282 -25
  256. package/Tests/Server/Types/Database/Permissions/TableLevelBlockPermission.test.ts +459 -0
  257. package/Tests/Server/Types/Markdown.test.ts +181 -0
  258. package/Tests/Server/Utils/AI/AIRunPrivacyFilter.test.ts +101 -9
  259. package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +88 -4
  260. package/Tests/Server/Utils/AI/Toolbox/ExceptionTools.test.ts +459 -0
  261. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +794 -0
  262. package/Tests/Server/Utils/AI/Toolbox/RecentChangesTools.test.ts +574 -0
  263. package/Tests/Server/Utils/AI/Toolbox/SecurityEventTools.test.ts +596 -0
  264. package/Tests/Server/Utils/CaptchaRequestAndLogging.test.ts +395 -0
  265. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  266. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  267. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  268. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  269. package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
  270. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  271. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  272. package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
  273. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +934 -96
  274. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  275. package/Tests/Server/Utils/Realtime.test.ts +502 -0
  276. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorSeverity.test.ts +216 -0
  277. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +142 -0
  278. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.test.ts +140 -0
  279. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepairClickhouseIntegration.test.ts +542 -0
  280. package/Tests/Server/Utils/Telemetry/ChangeEventRow.test.ts +743 -0
  281. package/Tests/Server/Utils/Telemetry/RuntimeMetrics.test.ts +465 -0
  282. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Alert.test.ts +202 -0
  283. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.test.ts +194 -0
  284. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/ScheduledMaintenance.test.ts +231 -0
  285. package/Tests/Server/Utils/Workspace/Slack/Messages/Alert.test.ts +194 -0
  286. package/Tests/Server/Utils/Workspace/Slack/Messages/AlertEpisode.test.ts +194 -0
  287. package/Tests/Server/Utils/Workspace/Slack/Messages/Incident.test.ts +194 -0
  288. package/Tests/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.test.ts +194 -0
  289. package/Tests/Server/Utils/Workspace/Slack/Messages/ScheduledMaintenance.test.ts +247 -0
  290. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  291. package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
  292. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  293. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  294. package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
  295. package/Tests/Types/Call/CallProvider.test.ts +528 -0
  296. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  297. package/Tests/Types/Kubernetes/KubernetesCostIngest.test.ts +236 -0
  298. package/Tests/Types/OnCallDutyPolicy/ScheduleTimeline.test.ts +736 -0
  299. package/Tests/Types/OnCallDutyPolicy/ScheduleTimelineLayout.test.ts +996 -0
  300. package/Tests/Types/SecurityEvent/SigmaRule.test.ts +142 -0
  301. package/Tests/Types/Workflow/Components/JSON.test.ts +182 -0
  302. package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +116 -1
  303. package/Tests/UI/Components/Dropdown/DropdownAsyncOptions.test.tsx +81 -0
  304. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  305. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  306. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +165 -171
  307. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  308. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  309. package/Tests/UI/Components/EventAttachmentList.test.tsx +174 -0
  310. package/Tests/UI/Components/Forms/BasicFormBurnRateTemplateDefaults.test.tsx +395 -0
  311. package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +286 -0
  312. package/Tests/UI/Components/Forms/FormSummary.test.tsx +128 -0
  313. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  314. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  315. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  316. package/Tests/UI/Components/ModelTable/BaseModelTableQueryChange.test.tsx +365 -0
  317. package/Tests/UI/Components/OpenAuthenticatedUrl.test.ts +358 -0
  318. package/Tests/UI/Components/SessionAwareImage.test.tsx +496 -0
  319. package/Tests/UI/Components/TelemetryHistogramZeroBuckets.test.tsx +190 -0
  320. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  321. package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
  322. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  323. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +1 -1
  324. package/Tests/UI/Monitor/EvaluationLogListTimestamps.test.tsx +367 -0
  325. package/Tests/UI/Utils/API/BaseAPIRefreshSession.test.ts +1087 -0
  326. package/Tests/UI/Utils/API/DashboardHost.ts +12 -0
  327. package/Tests/UI/Utils/API/FakeAxiosServer.ts +183 -0
  328. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
  329. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  330. package/Tests/UI/Utils/Cookie.test.ts +440 -0
  331. package/Tests/UI/Utils/ModelAPIRequestClient.test.ts +278 -0
  332. package/Tests/UI/Utils/Navigation.test.ts +33 -0
  333. package/Tests/UI/Utils/PricingPlan.test.ts +295 -0
  334. package/Tests/UI/Utils/Realtime.test.ts +759 -0
  335. package/Tests/UI/Utils/Telemetry/Telemetry.test.ts +500 -0
  336. package/Tests/Utils/APIInstanceDispatch.test.ts +311 -0
  337. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  338. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  339. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  340. package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
  341. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  342. package/Types/API/Hostname.ts +63 -16
  343. package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
  344. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  345. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  346. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  347. package/Types/Database/CanonicalModelInstance.ts +102 -0
  348. package/Types/Database/TableColumn.ts +20 -6
  349. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  350. package/Types/IP/IPv6.ts +6 -1
  351. package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
  352. package/Types/Monitor/MonitorStep.ts +6 -1
  353. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  354. package/Types/OnCallDutyPolicy/ScheduleTimeline.ts +507 -0
  355. package/Types/OnCallDutyPolicy/ScheduleTimelineLayout.ts +589 -0
  356. package/Types/Realtime/EventName.ts +11 -0
  357. package/Types/SecurityEvent/DetectionFindingConstants.ts +14 -0
  358. package/Types/SecurityEvent/OcsfSeverity.ts +31 -26
  359. package/Types/SecurityEvent/SigmaRule.ts +51 -0
  360. package/Types/SecurityEvent/ThreatIntelConstants.ts +18 -0
  361. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  362. package/UI/Components/AttachmentList/EventAttachmentList.tsx +30 -2
  363. package/UI/Components/Dashboard/DashboardVariableControl.tsx +12 -2
  364. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  365. package/UI/Components/EditionLabel/EditionLabel.tsx +808 -1195
  366. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  367. package/UI/Components/EventItem/EventItem.tsx +12 -1
  368. package/UI/Components/Forms/BasicForm.tsx +151 -126
  369. package/UI/Components/Forms/CollapsibleFormSection.tsx +63 -0
  370. package/UI/Components/Forms/Fields/FormField.tsx +10 -4
  371. package/UI/Components/Forms/FormSummary.tsx +7 -0
  372. package/UI/Components/Forms/Types/Field.ts +10 -0
  373. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  374. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  375. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
  376. package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
  377. package/UI/Components/ModelList/ModelList.tsx +11 -1
  378. package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
  379. package/UI/Components/ModelTable/TableView.tsx +1 -1
  380. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  381. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  382. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +8 -1
  383. package/UI/Components/Tooltip/Tooltip.tsx +8 -1
  384. package/UI/Utils/API/API.ts +173 -12
  385. package/UI/Utils/API/RequestOptions.ts +11 -0
  386. package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +31 -7
  387. package/UI/Utils/ModelAPI/ModelAPI.ts +30 -9
  388. package/UI/Utils/Navigation.ts +9 -0
  389. package/UI/Utils/OpenAuthenticatedUrl.ts +154 -0
  390. package/UI/Utils/Realtime.ts +176 -30
  391. package/UI/esbuild-enterprise.js +263 -0
  392. package/Utils/API.ts +14 -5
  393. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  394. package/Utils/HostAddressUtil.ts +94 -0
  395. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  396. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  397. package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
  398. package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
  399. package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
  400. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  401. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  402. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  403. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  404. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  405. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  406. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  407. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  408. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  409. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +1 -1
  410. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -1
  411. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +1 -1
  412. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -1
  413. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +1 -1
  414. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -1
  415. package/build/dist/Server/API/AIBillingAPI.js +1 -1
  416. package/build/dist/Server/API/AIBillingAPI.js.map +1 -1
  417. package/build/dist/Server/API/AIInsightAPI.js +1 -4
  418. package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
  419. package/build/dist/Server/API/AIInvestigationAPI.js +1 -4
  420. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  421. package/build/dist/Server/API/AIReadinessAPI.js +1 -3
  422. package/build/dist/Server/API/AIReadinessAPI.js.map +1 -1
  423. package/build/dist/Server/API/AlertAPI.js +1 -1
  424. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  425. package/build/dist/Server/API/AutoRemediationAPI.js +1 -4
  426. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  427. package/build/dist/Server/API/BaseAPI.js +33 -0
  428. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  429. package/build/dist/Server/API/BaseAnalyticsAPI.js +55 -10
  430. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  431. package/build/dist/Server/API/BillingAPI.js +2 -2
  432. package/build/dist/Server/API/BillingAPI.js.map +1 -1
  433. package/build/dist/Server/API/BillingInvoiceAPI.js +1 -1
  434. package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
  435. package/build/dist/Server/API/BillingPaymentMethodAPI.js +2 -2
  436. package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
  437. package/build/dist/Server/API/CodeFixRunAPI.js +1 -3
  438. package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
  439. package/build/dist/Server/API/CommonAPI.js +50 -5
  440. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  441. package/build/dist/Server/API/DashboardAPI.js +12 -12
  442. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  443. package/build/dist/Server/API/GlobalConfigAPI.js +158 -342
  444. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  445. package/build/dist/Server/API/IncidentAPI.js +2 -2
  446. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  447. package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
  448. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  449. package/build/dist/Server/API/NotificationAPI.js +1 -1
  450. package/build/dist/Server/API/NotificationAPI.js.map +1 -1
  451. package/build/dist/Server/API/OnCallCalendarAPI.js +1 -4
  452. package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -1
  453. package/build/dist/Server/API/OnCallDutyPolicyAPI.js +6 -0
  454. package/build/dist/Server/API/OnCallDutyPolicyAPI.js.map +1 -1
  455. package/build/dist/Server/API/OnCallReadinessAPI.js +4 -1
  456. package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -1
  457. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +494 -0
  458. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -0
  459. package/build/dist/Server/API/ProjectAPI.js +1 -1
  460. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  461. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  462. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  463. package/build/dist/Server/API/ProjectSSO.js +24 -16
  464. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  465. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
  466. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  467. package/build/dist/Server/API/StatusPageAPI.js +218 -76
  468. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  469. package/build/dist/Server/API/TeamMemberAPI.js +11 -4
  470. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  471. package/build/dist/Server/API/UserCallAPI.js +2 -2
  472. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  473. package/build/dist/Server/API/UserEmailAPI.js +2 -2
  474. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  475. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +2 -2
  476. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  477. package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +1 -1
  478. package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -1
  479. package/build/dist/Server/API/UserSlackAPI.js +1 -1
  480. package/build/dist/Server/API/UserSlackAPI.js.map +1 -1
  481. package/build/dist/Server/API/UserSmsAPI.js +2 -2
  482. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  483. package/build/dist/Server/API/UserTotpAuthAPI.js +1 -1
  484. package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
  485. package/build/dist/Server/API/UserWebAuthnAPI.js +2 -2
  486. package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
  487. package/build/dist/Server/API/UserWebhookAPI.js +1 -1
  488. package/build/dist/Server/API/UserWebhookAPI.js.map +1 -1
  489. package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
  490. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  491. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  492. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  493. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  494. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  495. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  496. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  497. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  498. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  499. package/build/dist/Server/EnvironmentConfig.js +84 -2
  500. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  501. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  502. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  503. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  504. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  505. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -2
  506. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  507. package/build/dist/Server/Middleware/UserAuthorization.js +94 -15
  508. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  509. package/build/dist/Server/Services/ApiKeyPermissionService.js +80 -4
  510. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  511. package/build/dist/Server/Services/AuditLogService.js +71 -740
  512. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  513. package/build/dist/Server/Services/DatabaseService.js +171 -0
  514. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  515. package/build/dist/Server/Services/DetectionRuleService.js +4 -4
  516. package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
  517. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  518. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  519. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  520. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  521. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  522. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  523. package/build/dist/Server/Services/MonitorService.js +45 -4
  524. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  525. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  526. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  527. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  528. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  529. package/build/dist/Server/Services/OnCallDutyPolicyChildService.js +170 -0
  530. package/build/dist/Server/Services/OnCallDutyPolicyChildService.js.map +1 -0
  531. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -2
  532. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  533. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +2 -2
  534. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
  535. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -2
  536. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
  537. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -2
  538. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
  539. package/build/dist/Server/Services/PayAsYouGoBillingService.js +20 -27
  540. package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -1
  541. package/build/dist/Server/Services/ProjectService.js +231 -0
  542. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  543. package/build/dist/Server/Services/RumSessionPinService.js +198 -16
  544. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  545. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  546. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  547. package/build/dist/Server/Services/StatusPageService.js +71 -0
  548. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  549. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  550. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  551. package/build/dist/Server/Services/TeamPermissionService.js +89 -27
  552. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  553. package/build/dist/Server/Services/TeamService.js +9 -0
  554. package/build/dist/Server/Services/TeamService.js.map +1 -1
  555. package/build/dist/Server/Services/ThreatIntelFeedService.js +5 -4
  556. package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -1
  557. package/build/dist/Server/Services/UserService.js +10 -16
  558. package/build/dist/Server/Services/UserService.js.map +1 -1
  559. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +9 -6
  560. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  561. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  562. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  563. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  564. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  565. package/build/dist/Server/Types/Database/Permissions/Index.js +60 -6
  566. package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
  567. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +24 -16
  568. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  569. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  570. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  571. package/build/dist/Server/Types/Markdown.js +31 -0
  572. package/build/dist/Server/Types/Markdown.js.map +1 -1
  573. package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +7 -0
  574. package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -1
  575. package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +7 -0
  576. package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js.map +1 -1
  577. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  578. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  579. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  580. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  581. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  582. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  583. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  584. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  585. package/build/dist/Server/Utils/MasterAdminPageAccess.js +39 -0
  586. package/build/dist/Server/Utils/MasterAdminPageAccess.js.map +1 -0
  587. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +96 -0
  588. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  589. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  590. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  591. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +3 -1
  592. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  593. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +449 -261
  594. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  595. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +3 -1
  596. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  597. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  598. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  599. package/build/dist/Server/Utils/Realtime.js +126 -37
  600. package/build/dist/Server/Utils/Realtime.js.map +1 -1
  601. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +7 -25
  602. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
  603. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js +127 -0
  604. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js.map +1 -0
  605. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +1 -1
  606. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
  607. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +3 -2
  608. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -1
  609. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +4 -8
  610. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -1
  611. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  612. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  613. package/build/dist/Types/API/Hostname.js +59 -11
  614. package/build/dist/Types/API/Hostname.js.map +1 -1
  615. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +31 -1
  616. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
  617. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  618. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  619. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  620. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  621. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  622. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  623. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  624. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  625. package/build/dist/Types/Database/TableColumn.js +19 -6
  626. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  627. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  628. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  629. package/build/dist/Types/IP/IPv6.js +6 -1
  630. package/build/dist/Types/IP/IPv6.js.map +1 -1
  631. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  632. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  633. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  634. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js +321 -0
  635. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js.map +1 -0
  636. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js +372 -0
  637. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js.map +1 -0
  638. package/build/dist/Types/Realtime/EventName.js +10 -0
  639. package/build/dist/Types/Realtime/EventName.js.map +1 -1
  640. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +11 -0
  641. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
  642. package/build/dist/Types/SecurityEvent/OcsfSeverity.js +30 -25
  643. package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -1
  644. package/build/dist/Types/SecurityEvent/SigmaRule.js +47 -0
  645. package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -1
  646. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +14 -0
  647. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -1
  648. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  649. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  650. package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +9 -4
  651. package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
  652. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +10 -2
  653. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
  654. package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -1
  655. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  656. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +425 -585
  657. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  658. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  659. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  660. package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
  661. package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
  662. package/build/dist/UI/Components/Forms/BasicForm.js +70 -64
  663. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  664. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +27 -0
  665. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -0
  666. package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -7
  667. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  668. package/build/dist/UI/Components/Forms/FormSummary.js +7 -0
  669. package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
  670. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  671. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  672. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  673. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  674. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +2 -1
  675. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  676. package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js +84 -0
  677. package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js.map +1 -0
  678. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  679. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  680. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +14 -1
  681. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  682. package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
  683. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  684. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  685. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  686. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  687. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  688. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -1
  689. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  690. package/build/dist/UI/Components/Tooltip/Tooltip.js +2 -1
  691. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  692. package/build/dist/UI/Utils/API/API.js +143 -19
  693. package/build/dist/UI/Utils/API/API.js.map +1 -1
  694. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +21 -7
  695. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
  696. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +26 -9
  697. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  698. package/build/dist/UI/Utils/Navigation.js +8 -0
  699. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  700. package/build/dist/UI/Utils/OpenAuthenticatedUrl.js +92 -0
  701. package/build/dist/UI/Utils/OpenAuthenticatedUrl.js.map +1 -0
  702. package/build/dist/UI/Utils/Realtime.js +120 -15
  703. package/build/dist/UI/Utils/Realtime.js.map +1 -1
  704. package/build/dist/Utils/API.js +13 -5
  705. package/build/dist/Utils/API.js.map +1 -1
  706. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  707. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  708. package/build/dist/Utils/HostAddressUtil.js +80 -0
  709. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  710. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  711. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  712. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  713. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  714. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +123 -6
  715. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
  716. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +4 -18
  717. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -1
  718. package/build/dist/Utils/Slo/SloBurnRateTemplate.js +2 -2
  719. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  720. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  721. package/jest.config.json +3 -1
  722. package/package.json +1 -1
  723. package/test-setup.sh +103 -34
  724. package/tsconfig.json +13 -0
  725. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  726. package/Server/API/TeamComplianceAPI.ts +0 -158
  727. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  728. package/Server/Services/TeamComplianceService.ts +0 -733
  729. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  730. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  731. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  732. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  733. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  734. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  735. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  736. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  737. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  738. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  739. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  740. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  741. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  742. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  743. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  744. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  745. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  746. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  747. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  748. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  749. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  750. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  751. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  752. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  753. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  754. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  755. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  756. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  757. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  758. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  759. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommunityEditionSsoReport.js","sourceRoot":"","sources":["../../../../Server/Utils/CommunityEditionSsoReport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ import EnterpriseEdition from "../Enterprise/EnterpriseEdition";
2
+ import EnterpriseFeature from "../Enterprise/EnterpriseFeature";
3
+ import { ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS, ENTERPRISE_LICENSE_TRIAL_PERIOD_IN_DAYS, } from "../Enterprise/EnterpriseLicenseSnapshot";
4
+ import logger from "./Logger";
5
+ import PaymentRequiredException from "../../Types/Exception/PaymentRequiredException";
6
+ /*
7
+ * Which enterprise identity controls are live in this process.
8
+ *
9
+ * Every answer here follows the RUNTIME state of the feature behind it
10
+ * (EnterpriseEdition.isFeatureActive): SSO for the SSO requirements, the
11
+ * SAML/OIDC sign-in routes and the provider listings, SCIM for the SCIM Push
12
+ * Groups team locks. A feature is active when the Enterprise Edition is loaded
13
+ * and, with billing off, its license covers the feature (valid, in the grace
14
+ * period after it expired, or - with no license - inside the trial).
15
+ *
16
+ * The controls are relaxed where they cannot work:
17
+ * - on the Community Edition, which has no SAML/OIDC sign-in routes and no
18
+ * SCIM endpoints;
19
+ * - on an Enterprise install whose license has lapsed, where those routes
20
+ * refuse (ee/Server/Identity).
21
+ * Enforcing a leftover "Require SSO for login" there would lock every user
22
+ * out, and a leftover SCIM Push Groups lock would leave teams nobody can
23
+ * manage. Users sign in with their password instead (users who only ever used
24
+ * SSO reset it). The configuration itself is kept untouched - reads made for
25
+ * a caller report the requirement as off, and a caller's write can neither
26
+ * switch it off nor set it meanwhile (guardSsoRequirementWrite) - so running
27
+ * the Enterprise Edition again (with a valid license, or during its trial or
28
+ * grace period), or renewing the license, restores enforcement without a
29
+ * restart.
30
+ *
31
+ * Failure direction: an error while deciding answers "enforce", and an
32
+ * unknown license state counts as active (see isFeatureActive), so a read
33
+ * error never switches a control off.
34
+ */
35
+ class EditionEnforcement {
36
+ /*
37
+ * Whether configured SSO requirements - a project's requireSsoForLogin (and
38
+ * its required provider), the instance-wide requireSsoForLogin and a status
39
+ * page's requireSsoForLogin - are enforced.
40
+ */
41
+ static isSsoEnforced() {
42
+ try {
43
+ return EnterpriseEdition.isFeatureActive(EnterpriseFeature.SSO);
44
+ }
45
+ catch (err) {
46
+ logger.error("EditionEnforcement: could not tell whether SSO is enforced; enforcing it.");
47
+ logger.error(err);
48
+ return true;
49
+ }
50
+ }
51
+ // A configured SSO requirement that is also enforced in this process.
52
+ static isSsoRequired(configuredRequirement) {
53
+ if (!configuredRequirement) {
54
+ return false;
55
+ }
56
+ return EditionEnforcement.isSsoEnforced();
57
+ }
58
+ /*
59
+ * Whether SCIM Push Groups owns team membership: while a project's SCIM
60
+ * configuration has Push Groups on, teams and team members can only be
61
+ * changed by the identity provider. Relaxed on the Community Edition, and
62
+ * while the license does not cover SCIM, because then no SCIM endpoint
63
+ * answers the identity provider and nobody else could manage those teams.
64
+ */
65
+ static areScimTeamLocksEnforced() {
66
+ try {
67
+ return EnterpriseEdition.isFeatureActive(EnterpriseFeature.SCIM);
68
+ }
69
+ catch (err) {
70
+ logger.error("EditionEnforcement: could not tell whether SCIM team locks apply; applying them.");
71
+ logger.error(err);
72
+ return true;
73
+ }
74
+ }
75
+ /*
76
+ * Whether the SAML/OIDC sign-in routes answer right now. Provider listings
77
+ * (the lists a sign-in page offers) are empty when they do not, so no client
78
+ * sends a user into a route that answers 404 (Community Edition) or refuses
79
+ * because the license lapsed (Enterprise Edition).
80
+ */
81
+ static areSsoRoutesServed() {
82
+ try {
83
+ return EnterpriseEdition.isFeatureActive(EnterpriseFeature.SSO);
84
+ }
85
+ catch (err) {
86
+ logger.error("EditionEnforcement: could not tell whether the SSO routes are served; serving them.");
87
+ logger.error(err);
88
+ return true;
89
+ }
90
+ }
91
+ /*
92
+ * Whether a read should report the EFFECTIVE SSO requirement (false)
93
+ * instead of the stored one. Clients - the mobile app in particular, whose
94
+ * store builds cannot be patched - decide from these columns whether to
95
+ * start an SSO flow, and while SSO is not active that flow does not exist
96
+ * (Community Edition) or refuses (lapsed license).
97
+ *
98
+ * Only reads made for a caller are masked. Internal (root) reads see the
99
+ * stored value, and a read never writes, so the configuration is intact
100
+ * when SSO is active again. The write half is guardSsoRequirementWrite.
101
+ */
102
+ static shouldMaskSsoRequirementOnRead(props) {
103
+ if (!props || props.isRoot) {
104
+ return false;
105
+ }
106
+ return !EditionEnforcement.isSsoEnforced();
107
+ }
108
+ /*
109
+ * The write half of shouldMaskSsoRequirementOnRead, for the services'
110
+ * onBeforeUpdate. A caller whose reads are masked has only ever seen the
111
+ * requirement as off (no required provider), so what it writes to those
112
+ * columns cannot be taken at face value: a settings form, or an API client
113
+ * doing a read-modify-write, sends back the masked value it read. Saving it
114
+ * would switch a configured requirement off without anybody deciding to,
115
+ * and it would stay off once SSO is active again.
116
+ *
117
+ * So while this caller's reads are masked:
118
+ * - a write of the masked value (false, or no provider) is dropped from
119
+ * `data`, and the stored requirement is kept;
120
+ * - a write that would set a requirement (true, or a provider) is
121
+ * refused: it could neither be seen nor enforced until SSO is active;
122
+ * - a write that is left with nothing else to save is refused with the
123
+ * same explanation, rather than reporting a save that did not happen.
124
+ *
125
+ * Root writes, and every write while SSO is active, are left alone.
126
+ * Mutates `data`. Throws PaymentRequiredException.
127
+ */
128
+ static guardSsoRequirementWrite(input) {
129
+ if (!EditionEnforcement.shouldMaskSsoRequirementOnRead(input.props)) {
130
+ return;
131
+ }
132
+ const writtenColumns = input.columns.filter((column) => {
133
+ return input.data[column] !== undefined;
134
+ });
135
+ if (writtenColumns.length === 0) {
136
+ return;
137
+ }
138
+ const setsRequirement = writtenColumns.some((column) => {
139
+ return !EditionEnforcement.isMaskedSsoRequirementValue(input.data[column]);
140
+ });
141
+ if (setsRequirement) {
142
+ throw EditionEnforcement.createSsoRequirementUnchangeableException();
143
+ }
144
+ for (const column of writtenColumns) {
145
+ delete input.data[column];
146
+ }
147
+ /*
148
+ * `data` is the plain update onBeforeUpdate receives (a model instance
149
+ * has already been reduced to its set columns by
150
+ * DatabaseService.sanitizeUpdateData); a key left undefined writes
151
+ * nothing, so it does not count.
152
+ */
153
+ const hasOtherColumns = Object.keys(input.data).some((key) => {
154
+ return input.data[key] !== undefined;
155
+ });
156
+ if (!hasOtherColumns) {
157
+ throw EditionEnforcement.createSsoRequirementUnchangeableException();
158
+ }
159
+ }
160
+ // What a masked read reports for a requirement column: false or null.
161
+ static isMaskedSsoRequirementValue(value) {
162
+ return value === false || value === null;
163
+ }
164
+ static createSsoRequirementUnchangeableException() {
165
+ let isEnterpriseEditionLoaded = true;
166
+ try {
167
+ isEnterpriseEditionLoaded = EnterpriseEdition.isLoaded();
168
+ }
169
+ catch (err) {
170
+ logger.error(err);
171
+ }
172
+ return new PaymentRequiredException(isEnterpriseEditionLoaded
173
+ ? EditionEnforcement.SSO_REQUIREMENT_UNCHANGEABLE_LICENSE_MESSAGE
174
+ : EditionEnforcement.SSO_REQUIREMENT_UNCHANGEABLE_COMMUNITY_MESSAGE);
175
+ }
176
+ }
177
+ // Why guardSsoRequirementWrite refuses a write, on the Community Edition.
178
+ EditionEnforcement.SSO_REQUIREMENT_UNCHANGEABLE_COMMUNITY_MESSAGE = 'Single sign-on is part of the OneUptime Enterprise Edition and this server runs the Community Edition, so "Require SSO for login" shows as off, is not enforced and cannot be changed here. ' +
179
+ `A setting saved earlier is kept, and it is enforced again when this server runs the Enterprise Edition image with a valid license (or during its ${ENTERPRISE_LICENSE_TRIAL_PERIOD_IN_DAYS}-day trial, or the ${ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS}-day grace period after a license expires).`;
180
+ /*
181
+ * Why guardSsoRequirementWrite refuses a write, on an Enterprise install
182
+ * whose license does not cover SSO right now.
183
+ */
184
+ EditionEnforcement.SSO_REQUIREMENT_UNCHANGEABLE_LICENSE_MESSAGE = 'Single sign-on has stopped because the OneUptime Enterprise license is missing, expired or does not include SSO, so "Require SSO for login" shows as off, is not enforced and cannot be changed. ' +
185
+ "The saved setting is kept, and it is enforced again as soon as a master admin activates or renews the license from the edition label in the Admin Dashboard header.";
186
+ export default EditionEnforcement;
187
+ //# sourceMappingURL=EditionEnforcement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditionEnforcement.js","sourceRoot":"","sources":["../../../../Server/Utils/EditionEnforcement.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,35 @@
1
- import { getFrontendEnvVars } from "../EnvironmentConfig";
1
+ import { getFrontendEnvVars, isEnterpriseEditionRequested, } from "../EnvironmentConfig";
2
+ import EnterpriseEdition from "../Enterprise/EnterpriseEdition";
2
3
  import Response from "./Response";
3
4
  export const FRONTEND_ENVIRONMENT_CACHE_CONTROL = "private, no-store, no-cache, must-revalidate";
5
+ /*
6
+ * The edition the frontends are told about is the EFFECTIVE one: whether the
7
+ * enterprise module actually loaded in this process, not what the raw
8
+ * IS_ENTERPRISE_EDITION variable claims. A Community image with a leftover
9
+ * IS_ENTERPRISE_EDITION=true must not show enterprise pages whose server
10
+ * routes do not exist; ENTERPRISE_EDITION_REQUESTED_BUT_NOT_LOADED lets the
11
+ * admin UI explain that mismatch to a master admin instead.
12
+ *
13
+ * "Requested" is EnvironmentConfig's isEnterpriseEditionRequested, the same
14
+ * definition the App's boot guard uses: an explicit ONEUPTIME_EDITION=community
15
+ * withdraws the request, so the Enterprise image (which bakes
16
+ * IS_ENTERPRISE_EDITION=true) run as the Community Edition on purpose is not
17
+ * told to switch images. It is read on every call, like the rest of the
18
+ * environment served here.
19
+ */
20
+ export const getFrontendEnvironmentVariables = () => {
21
+ const frontendEnv = getFrontendEnvVars();
22
+ const isEnterpriseEditionLoaded = EnterpriseEdition.isLoaded();
23
+ const isEnterpriseEditionExpected = isEnterpriseEditionRequested(process.env);
24
+ frontendEnv["IS_ENTERPRISE_EDITION"] = isEnterpriseEditionLoaded
25
+ ? "true"
26
+ : "false";
27
+ frontendEnv["ENTERPRISE_EDITION_REQUESTED_BUT_NOT_LOADED"] =
28
+ isEnterpriseEditionExpected && !isEnterpriseEditionLoaded
29
+ ? "true"
30
+ : "false";
31
+ return frontendEnv;
32
+ };
4
33
  /*
5
34
  * The combined App server and the five standalone frontend servers must emit
6
35
  * exactly the same environment payload. Keeping the serializer here prevents
@@ -15,7 +44,7 @@ if(!window.process){
15
44
  if(!window.process.env){
16
45
  window.process.env = {}
17
46
  }
18
- window.process.env = ${JSON.stringify(getFrontendEnvVars())};
47
+ window.process.env = ${JSON.stringify(getFrontendEnvironmentVariables())};
19
48
  `;
20
49
  };
21
50
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"FrontendEnvironment.js","sourceRoot":"","sources":["../../../../Server/Utils/FrontendEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,CAAC,MAAM,kCAAkC,GAC7C,8CAA8C,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAiB,GAAW,EAAE;IACrE,OAAO;;;;;;;;uBAQc,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;CAC1D,CAAC;AACF,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAGhC,CAAC,GAAmB,EAAE,GAAoB,EAAQ,EAAE;IAC9D,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAChC,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;IACnE,QAAQ,CAAC,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,4BAA4B,EAAE,CAAC,CAAC;AAC5E,CAAC,CAAC"}
1
+ {"version":3,"file":"FrontendEnvironment.js","sourceRoot":"","sources":["../../../../Server/Utils/FrontendEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAEhE,OAAO,QAAQ,MAAM,YAAY,CAAC;AAGlC,MAAM,CAAC,MAAM,kCAAkC,GAC7C,8CAA8C,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAC1C,GAAe,EAAE;IACf,MAAM,WAAW,GAAe,kBAAkB,EAAE,CAAC;IACrD,MAAM,yBAAyB,GAAY,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IACxE,MAAM,2BAA2B,GAAY,4BAA4B,CACvE,OAAO,CAAC,GAAG,CACZ,CAAC;IAEF,WAAW,CAAC,uBAAuB,CAAC,GAAG,yBAAyB;QAC9D,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,CAAC;IACZ,WAAW,CAAC,6CAA6C,CAAC;QACxD,2BAA2B,IAAI,CAAC,yBAAyB;YACvD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,OAAO,CAAC;IAEd,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEJ;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAiB,GAAW,EAAE;IACrE,OAAO;;;;;;;;uBAQc,IAAI,CAAC,SAAS,CAAC,+BAA+B,EAAE,CAAC;CACvE,CAAC;AACF,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAGhC,CAAC,GAAmB,EAAE,GAAoB,EAAQ,EAAE;IAC9D,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAChC,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;IACnE,QAAQ,CAAC,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,4BAA4B,EAAE,CAAC,CAAC;AAC5E,CAAC,CAAC"}
@@ -1,36 +1,4 @@
1
1
  import Redis from "../../Infrastructure/Redis";
2
- /*
3
- * Where the previous counter sample is kept so a later run can turn Redis'
4
- * monotonic counters into "did this happen since we last looked".
5
- *
6
- * Redis stores its own history here on purpose: the counters and the sample
7
- * then share a lifetime, so a Redis restart clears both together and cannot
8
- * leave a stale baseline that fabricates an enormous delta. The uptime guard
9
- * below covers the case where the sample somehow outlives a restart anyway.
10
- *
11
- * Under memory pressure with an eviction policy this key can itself be evicted,
12
- * which costs one interval of eviction detection: the next run finds no sample,
13
- * re-seeds it, and reports deltas again from there.
14
- */
15
- const COUNTER_SAMPLE_KEY = "oneuptime-instance-health-redis-sample";
16
- const COUNTER_SAMPLE_TTL_IN_SECONDS = 60 * 60;
17
- /*
18
- * The minimum age of the baseline the counter deltas are measured against, so
19
- * every evaluation answers "did this happen in at least the last half hour"
20
- * rather than "did it happen in the last five minutes".
21
- *
22
- * That span is what keeps an edge-triggered signal from flapping. Evictions
23
- * arriving in bursts would otherwise clear on the first quiet tick and fire
24
- * again on the next, emailing every other cycle.
25
- *
26
- * Two samples are kept rather than one because a single rolling baseline is a
27
- * TUMBLING window, not a sliding one: the tick immediately after a roll would
28
- * compare against a five-minute-old sample and a lone quiet tick there would
29
- * resolve the notification, re-notifying on the next burst of the same ongoing
30
- * incident. Measuring against the OLDER of two samples makes the lookback
31
- * always at least this long (and at most twice it).
32
- */
33
- export const COUNTER_WINDOW_IN_SECONDS = 30 * 60;
34
2
  /*
35
3
  * INFO is a flat `field:value` document split into `# Section` blocks. Section
36
4
  * headers and comment lines are dropped; field names are unique across sections
@@ -110,103 +78,11 @@ async function getMaxClients(client, info) {
110
78
  }
111
79
  return null;
112
80
  }
113
- function parseCounterSample(value) {
114
- if (!value || typeof value !== "object" || Array.isArray(value)) {
115
- return null;
116
- }
117
- const sample = value;
118
- const evictedKeys = Number(sample["evictedKeys"]);
119
- const rejectedConnections = Number(sample["rejectedConnections"]);
120
- const uptimeInSeconds = Number(sample["uptimeInSeconds"]);
121
- if (!Number.isFinite(evictedKeys) ||
122
- !Number.isFinite(rejectedConnections) ||
123
- !Number.isFinite(uptimeInSeconds)) {
124
- return null;
125
- }
126
- return { evictedKeys, rejectedConnections, uptimeInSeconds };
127
- }
128
- async function readCounterSamples(client) {
129
- try {
130
- const raw = await client.get(COUNTER_SAMPLE_KEY);
131
- if (!raw) {
132
- return null;
133
- }
134
- const parsed = JSON.parse(raw);
135
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
136
- return null;
137
- }
138
- const stored = parsed;
139
- const older = parseCounterSample(stored["older"]);
140
- const newer = parseCounterSample(stored["newer"]);
141
- if (older && newer) {
142
- return { older, newer };
143
- }
144
- /*
145
- * A single-sample payload is what the previous release wrote. Treat it as
146
- * both ends of the pair so an upgrade keeps its baseline instead of going
147
- * blind for a window.
148
- */
149
- const legacy = parseCounterSample(parsed);
150
- return legacy ? { older: legacy, newer: legacy } : null;
151
- }
152
- catch (_a) {
153
- // A missing or unreadable sample simply means no delta this run.
154
- return null;
155
- }
156
- }
157
81
  /*
158
- * Returns whether the baseline was actually stored. The caller needs to know,
159
- * because a write can fail for a reason that does not stop the key from being
160
- * kept alive by other means — see getRedisHealthSnapshot.
82
+ * One INFO read, plus the CONFIG fallback for maxclients. Exported so the
83
+ * Enterprise worker's snapshot reads Redis exactly the way this file does.
161
84
  */
162
- async function writeCounterSamples(client, samples) {
163
- try {
164
- await client.set(COUNTER_SAMPLE_KEY, JSON.stringify(samples), "EX", COUNTER_SAMPLE_TTL_IN_SECONDS);
165
- return true;
166
- }
167
- catch (_a) {
168
- /*
169
- * Losing the baseline must never fail the health evaluation that produced
170
- * this snapshot, so the error is swallowed and reported through the return.
171
- */
172
- return false;
173
- }
174
- }
175
- // Keep a baseline alive across the runs that do not rewrite it.
176
- async function refreshCounterSampleTtl(client) {
177
- try {
178
- await client.expire(COUNTER_SAMPLE_KEY, COUNTER_SAMPLE_TTL_IN_SECONDS);
179
- }
180
- catch (_a) {
181
- // Same reasoning as writeCounterSamples: never fail the evaluation over this.
182
- }
183
- }
184
- /*
185
- * The pair rolls only once the NEWER sample has aged past the window, which
186
- * promotes it to `older` and starts a fresh one. Deltas are always measured
187
- * against `older`, so the lookback never drops below the window. Redis' own
188
- * uptime measures that age, which avoids trusting either machine's clock.
189
- */
190
- export function shouldRollCounterSamples(data) {
191
- if (!data.previous || data.didRestart) {
192
- return true;
193
- }
194
- return (data.currentUptimeInSeconds - data.previous.newer.uptimeInSeconds >=
195
- COUNTER_WINDOW_IN_SECONDS);
196
- }
197
- /*
198
- * Compare a monotonic counter against its previous value. A decrease, or a
199
- * shorter uptime than the sample was taken at, means Redis restarted and the
200
- * counter began again from zero — the difference is meaningless, so report no
201
- * delta rather than a fabricated spike.
202
- */
203
- export function getCounterDelta(data) {
204
- if (data.didRestart || data.current < data.previous) {
205
- return null;
206
- }
207
- return data.current - data.previous;
208
- }
209
- async function readInfoSnapshot(client) {
85
+ export async function readInfoSnapshot(client) {
210
86
  const info = parseRedisInfo(await client.info());
211
87
  return buildRedisInfoSnapshot({
212
88
  info,
@@ -215,9 +91,9 @@ async function readInfoSnapshot(client) {
215
91
  }
216
92
  /*
217
93
  * Read-only view for the admin health API. It deliberately does NOT touch the
218
- * stored counter sample: advancing that baseline here would consume the delta
219
- * the worker needs, so a page refresh could hide an eviction burst from the
220
- * notification that exists to catch it.
94
+ * counter sample the Enterprise health worker keeps: advancing that baseline
95
+ * here would consume the delta the worker needs, so a page refresh could hide
96
+ * an eviction burst from the notification that exists to catch it.
221
97
  */
222
98
  export async function getRedisInfoSnapshot() {
223
99
  const client = Redis.getClient();
@@ -226,67 +102,4 @@ export async function getRedisInfoSnapshot() {
226
102
  }
227
103
  return await readInfoSnapshot(client);
228
104
  }
229
- /*
230
- * The evaluating worker's view: the same INFO read, plus the counter deltas
231
- * that turn cumulative totals into "did this happen in roughly the last
232
- * COUNTER_WINDOW_IN_SECONDS". Returns null when Redis is unreachable, which the
233
- * caller treats as "cannot evaluate" rather than "healthy".
234
- */
235
- export async function getRedisHealthSnapshot() {
236
- const client = Redis.getClient();
237
- if (!client || !Redis.isConnected()) {
238
- return null;
239
- }
240
- const snapshot = await readInfoSnapshot(client);
241
- const previousSamples = await readCounterSamples(client);
242
- const didRestart = Boolean(previousSamples &&
243
- previousSamples.older.uptimeInSeconds > snapshot.uptimeInSeconds);
244
- // Deltas always measure against the older half, never the freshly rolled one.
245
- const baseline = previousSamples
246
- ? previousSamples.older
247
- : null;
248
- const current = {
249
- evictedKeys: snapshot.evictedKeys,
250
- rejectedConnections: snapshot.rejectedConnections,
251
- uptimeInSeconds: snapshot.uptimeInSeconds,
252
- };
253
- const wantsRoll = shouldRollCounterSamples({
254
- previous: previousSamples,
255
- currentUptimeInSeconds: snapshot.uptimeInSeconds,
256
- didRestart,
257
- });
258
- const didRoll = wantsRoll
259
- ? await writeCounterSamples(client, {
260
- older: previousSamples && !didRestart ? previousSamples.newer : current,
261
- newer: current,
262
- })
263
- : false;
264
- /*
265
- * Keep the existing samples alive whenever they were not rolled — including
266
- * when the roll FAILED, which is the case that matters most. Under the
267
- * noeviction policy Redis rejects SET once it is out of memory but still
268
- * serves EXPIRE, so letting a failed write skip the refresh would expire the
269
- * baseline precisely when memory is full: eviction detection would then go
270
- * permanently blind at the moment it is needed, because every later write
271
- * fails the same way and the key never returns.
272
- */
273
- if (!didRoll) {
274
- await refreshCounterSampleTtl(client);
275
- }
276
- return Object.assign(Object.assign({}, snapshot), { counterWindowInSeconds: baseline
277
- ? snapshot.uptimeInSeconds - baseline.uptimeInSeconds
278
- : null, evictedKeysDelta: baseline
279
- ? getCounterDelta({
280
- current: snapshot.evictedKeys,
281
- previous: baseline.evictedKeys,
282
- didRestart,
283
- })
284
- : null, rejectedConnectionsDelta: baseline
285
- ? getCounterDelta({
286
- current: snapshot.rejectedConnections,
287
- previous: baseline.rejectedConnections,
288
- didRestart,
289
- })
290
- : null });
291
- }
292
105
  //# sourceMappingURL=RedisHealth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RedisHealth.js","sourceRoot":"","sources":["../../../../../Server/Utils/InstanceHealth/RedisHealth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RedisHealth.js","sourceRoot":"","sources":["../../../../../Server/Utils/InstanceHealth/RedisHealth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import UserMiddleware from "../Middleware/UserAuthorization";
2
+ import JSONWebToken from "./JsonWebToken";
3
+ import logger from "./Logger";
4
+ import Response from "./Response";
5
+ import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
6
+ export const NOT_A_MASTER_ADMIN_MESSAGE = "Unauthorized: Only master admins can access the admin dashboard.";
7
+ /*
8
+ * Gate for the Admin Dashboard's index page (the HTML shell, not its APIs).
9
+ *
10
+ * It refuses only a caller it can positively identify as NOT a master admin.
11
+ * A missing access token, or one that no longer decodes, is served the shell:
12
+ * the access-token cookie expires with the JWT inside it, so an admin who
13
+ * reloads a tab left open past the token lifetime arrives here with no token
14
+ * at all, and answering that with a 422 JSON page meant the app never loaded
15
+ * and so never got to refresh the session. The shell holds nothing the public
16
+ * static bundle does not; once it loads, the SPA sends a signed-out visitor to
17
+ * the login page, and every admin API it calls refreshes an expired session
18
+ * (or answers 401) on its own.
19
+ */
20
+ export const ensureMasterAdminPageAccess = async (data) => {
21
+ const accessToken = UserMiddleware.getAccessTokenFromExpressRequest(data.req);
22
+ if (!accessToken) {
23
+ return {};
24
+ }
25
+ let authData;
26
+ try {
27
+ authData = JSONWebToken.decode(accessToken);
28
+ }
29
+ catch (error) {
30
+ // Expired or unreadable: let the app load and refresh it.
31
+ logger.debug(error, { service: data.service });
32
+ return {};
33
+ }
34
+ if (!authData.isMasterAdmin) {
35
+ Response.sendErrorResponse(data.req, data.res, new NotAuthorizedException(NOT_A_MASTER_ADMIN_MESSAGE));
36
+ }
37
+ return {};
38
+ };
39
+ //# sourceMappingURL=MasterAdminPageAccess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MasterAdminPageAccess.js","sourceRoot":"","sources":["../../../../Server/Utils/MasterAdminPageAccess.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,iCAAiC,CAAC;AAE7D,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,sBAAsB,MAAM,8CAA8C,CAAC;AAIlF,MAAM,CAAC,MAAM,0BAA0B,GACrC,kEAAkE,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAIZ,KAAK,EAAE,IAIlC,EAAuB,EAAE;IACxB,MAAM,WAAW,GACf,cAAc,CAAC,gCAAgC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE5D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,QAA0B,CAAC;IAE/B,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0DAA0D;QAC1D,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5B,QAAQ,CAAC,iBAAiB,CACxB,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,GAAG,EACR,IAAI,sBAAsB,CAAC,0BAA0B,CAAC,CACvD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC"}
@@ -0,0 +1,96 @@
1
+ import { escapeMarkdownInline } from "../../../Utils/Markdown/MarkdownEscape";
2
+ class AffectedResourceList {
3
+ static render(input) {
4
+ const lines = [];
5
+ input.entries.forEach((entry, index) => {
6
+ const marker = `${index + 1}.`;
7
+ /*
8
+ * A nested bullet belongs to its item only when it is indented to
9
+ * the item's content column, which is one past the marker — three
10
+ * spaces under "1.", four under "10.". A fixed three-space indent
11
+ * would push item 10's details out into a separate top-level list.
12
+ */
13
+ const indent = " ".repeat(marker.length + 1);
14
+ /*
15
+ * The kind is bold so each item's first line stands out from the
16
+ * detail bullets under it — the value at the end of the line is
17
+ * bold too, so the eye lands on what it is and how bad it is.
18
+ */
19
+ const kind = escapeMarkdownInline(entry.kind).trim();
20
+ const title = [kind ? `**${kind}**` : "", entry.name.trim()]
21
+ .filter((part) => {
22
+ return part.length > 0;
23
+ })
24
+ .join(" ");
25
+ lines.push(`${marker} ${title} — ${entry.value}`);
26
+ for (const detail of entry.details) {
27
+ if (!detail.value || detail.value.trim().length === 0) {
28
+ continue;
29
+ }
30
+ lines.push(`${indent}- ${escapeMarkdownInline(detail.label)}: ${detail.value}`);
31
+ }
32
+ });
33
+ const hiddenCount = input.totalCount - input.entries.length;
34
+ if (hiddenCount > 0) {
35
+ /*
36
+ * The blank line matters: without it the summary is a lazy
37
+ * continuation of the last item's final bullet, not a paragraph of
38
+ * its own.
39
+ */
40
+ lines.push("");
41
+ lines.push(`*... and ${hiddenCount} more ${escapeMarkdownInline(input.overflowNoun)}*`);
42
+ }
43
+ return `\n\n**${escapeMarkdownInline(input.heading)}** (${input.totalCount} total)\n\n${lines.join("\n")}`;
44
+ }
45
+ /*
46
+ * A resource identifier as an inline code span.
47
+ *
48
+ * The identifiers come from telemetry attributes, and a VMware VM or a
49
+ * Proxmox guest can be named anything. Wrapping a name that contains a
50
+ * backtick in single backticks closes the span early and spills the rest
51
+ * of the name — and whatever markdown it contains — into the list. So the
52
+ * fence is always one backtick longer than the longest run inside the
53
+ * value, and padded with a space on each side when the value has any
54
+ * backticks at all (CommonMark strips exactly one from each side, so the
55
+ * padding never shows). Line breaks become spaces: a newline inside a
56
+ * list item would end the item.
57
+ */
58
+ static code(value) {
59
+ if (value === undefined || value === null) {
60
+ return "";
61
+ }
62
+ const text = String(value)
63
+ .replace(/\s*[\r\n]+\s*/g, " ")
64
+ .trim();
65
+ if (text.length === 0) {
66
+ return "";
67
+ }
68
+ const backtickRuns = text.match(/`+/g) || [];
69
+ const longestRun = backtickRuns.reduce((longest, run) => {
70
+ return Math.max(longest, run.length);
71
+ }, 0);
72
+ if (longestRun === 0) {
73
+ return `\`${text}\``;
74
+ }
75
+ const fence = "`".repeat(longestRun + 1);
76
+ return `${fence} ${text} ${fence}`;
77
+ }
78
+ /*
79
+ * A display name alongside the identifier it abbreviates — a Proxmox
80
+ * guest's name and its `qemu/100` id, a Ceph pool's name and number, a
81
+ * vSphere resource pool's name and inventory path. Either half may be
82
+ * missing; when both are the same only one is shown.
83
+ */
84
+ static codeWithId(input) {
85
+ const name = AffectedResourceList.code(input.name);
86
+ const id = AffectedResourceList.code(input.id);
87
+ if (name && id && name !== id) {
88
+ return `${name} (${id})`;
89
+ }
90
+ return name || id;
91
+ }
92
+ }
93
+ // How many resources the list shows before it summarises the rest.
94
+ AffectedResourceList.MAX_ENTRIES = 10;
95
+ export default AffectedResourceList;
96
+ //# sourceMappingURL=AffectedResourceList.js.map