@oneuptime/common 13.0.8 → 14.0.1

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 (514) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Index.ts +4 -0
  4. package/Models/DatabaseModels/Monitor.ts +3 -2
  5. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  6. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
  7. package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
  8. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
  9. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
  10. package/Scripts/generate-service-worker.js +65 -4
  11. package/Server/API/BaseAPI.ts +26 -5
  12. package/Server/API/GlobalConfigAPI.ts +228 -462
  13. package/Server/API/ProjectOIDC.ts +25 -16
  14. package/Server/API/ProjectSSO.ts +24 -16
  15. package/Server/API/StatusPageAPI.ts +100 -42
  16. package/Server/API/TeamMemberAPI.ts +10 -1
  17. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  18. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  19. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  20. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  21. package/Server/EnvironmentConfig.ts +147 -2
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  26. package/Server/Middleware/UserAuthorization.ts +38 -16
  27. package/Server/Services/AuditLogService.ts +84 -1079
  28. package/Server/Services/DatabaseService.ts +10 -0
  29. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  30. package/Server/Services/GlobalConfigService.ts +80 -1
  31. package/Server/Services/Index.ts +4 -0
  32. package/Server/Services/MonitorProbeService.ts +116 -20
  33. package/Server/Services/MonitorService.ts +59 -6
  34. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  35. package/Server/Services/MonitorTemplateService.ts +26 -0
  36. package/Server/Services/ProjectService.ts +284 -0
  37. package/Server/Services/RumSessionPinService.ts +25 -6
  38. package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
  39. package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
  40. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
  41. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
  42. package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
  43. package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
  44. package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
  45. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  46. package/Server/Services/StatusPageService.ts +78 -1
  47. package/Server/Services/TeamMemberService.ts +11 -0
  48. package/Server/Services/TeamService.ts +10 -0
  49. package/Server/Services/UserService.ts +10 -17
  50. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  51. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  52. package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
  53. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  54. package/Server/Types/Markdown.ts +41 -0
  55. package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
  56. package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
  57. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  58. package/Server/Utils/EditionEnforcement.ts +233 -0
  59. package/Server/Utils/FrontendEnvironment.ts +41 -2
  60. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  61. package/Server/Utils/Monitor/AffectedResourceList.ts +148 -0
  62. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
  63. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  64. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
  65. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +720 -465
  66. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  67. package/Server/Utils/Monitor/RootCauseList.ts +139 -0
  68. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
  69. package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
  70. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  71. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  72. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  73. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  74. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  75. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  76. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  77. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  78. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  79. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  80. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  81. package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
  82. package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
  83. package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
  84. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  85. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
  86. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
  87. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  88. package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
  89. package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
  90. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
  91. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
  92. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
  93. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
  94. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  95. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  96. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
  97. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  98. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  99. package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
  100. package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
  101. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
  102. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
  103. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
  104. package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
  105. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  106. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  107. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  108. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  109. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
  110. package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
  111. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
  112. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  113. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  114. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  115. package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
  116. package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
  117. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  118. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  119. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  120. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  121. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  122. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  123. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  124. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  125. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  126. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  127. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  128. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  129. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  130. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  131. package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
  132. package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
  133. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
  134. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  135. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  136. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  137. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  138. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
  139. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  140. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  141. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  142. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  143. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  144. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  145. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  146. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
  147. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
  148. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  149. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
  150. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
  151. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
  152. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
  153. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
  154. package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
  155. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
  156. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  157. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  158. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
  159. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  160. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  161. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  162. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
  163. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  164. package/Tests/Server/Types/Markdown.test.ts +183 -1
  165. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
  166. package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
  167. package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
  168. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  169. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  170. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  171. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  172. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  173. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  174. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
  175. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +1339 -96
  176. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
  177. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
  178. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  179. package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
  180. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
  181. package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
  182. package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
  183. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
  184. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  185. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  186. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  187. package/Tests/Types/API/Route.test.ts +56 -0
  188. package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
  189. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  190. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  191. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  192. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
  193. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  194. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  195. package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
  196. package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
  197. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  198. package/Tests/UI/Components/Icon.test.tsx +26 -0
  199. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  200. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  201. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  202. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  203. package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
  204. package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
  205. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  206. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  207. package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
  208. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  209. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  210. package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
  211. package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
  212. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
  213. package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
  214. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  215. package/Types/API/Hostname.ts +63 -16
  216. package/Types/API/Route.ts +19 -2
  217. package/Types/API/URL.ts +26 -2
  218. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  219. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  220. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  221. package/Types/Database/CanonicalModelInstance.ts +102 -0
  222. package/Types/Database/TableColumn.ts +20 -6
  223. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  224. package/Types/IP/IPv6.ts +6 -1
  225. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
  226. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
  227. package/Types/Monitor/MonitorStep.ts +6 -1
  228. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  229. package/Types/Permission.ts +90 -0
  230. package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
  231. package/Types/Rules/RuleRun.ts +4 -0
  232. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  233. package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
  234. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  235. package/UI/Components/Feed/FeedOptions.ts +427 -0
  236. package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
  237. package/UI/Components/Feed/useFeedItems.ts +28 -9
  238. package/UI/Components/Feed/useFeedOptions.ts +225 -0
  239. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  240. package/UI/Components/Icon/Icon.tsx +1 -1
  241. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  242. package/UI/Components/ModelList/ModelList.tsx +11 -1
  243. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  244. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  245. package/UI/esbuild-enterprise.js +263 -0
  246. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  247. package/Utils/HostAddressUtil.ts +94 -0
  248. package/Utils/LabelRuleImportExport.ts +27 -9
  249. package/Utils/Monitor/MetricValueFormatter.ts +2 -2
  250. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  251. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  252. package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
  253. package/Utils/Slo/SloDuration.ts +22 -6
  254. package/Utils/Slo/SloHealth.ts +8 -7
  255. package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
  256. package/Utils/Slo/SloOverviewText.ts +33 -0
  257. package/Utils/Slo/SloProjection.ts +4 -3
  258. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  259. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  260. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  261. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  262. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  263. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  264. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  265. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  266. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  267. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  268. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  269. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
  270. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
  271. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
  272. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
  273. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
  274. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
  275. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
  276. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
  277. package/build/dist/Server/API/BaseAPI.js +26 -5
  278. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  279. package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
  280. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  281. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  282. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  283. package/build/dist/Server/API/ProjectSSO.js +24 -16
  284. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  285. package/build/dist/Server/API/StatusPageAPI.js +93 -43
  286. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  287. package/build/dist/Server/API/TeamMemberAPI.js +8 -1
  288. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  289. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  290. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  291. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  292. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  293. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  294. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  295. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  296. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  297. package/build/dist/Server/EnvironmentConfig.js +84 -2
  298. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  299. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  300. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  301. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
  302. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
  303. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
  304. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
  305. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  306. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  307. package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
  308. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  309. package/build/dist/Server/Services/AuditLogService.js +71 -740
  310. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  311. package/build/dist/Server/Services/DatabaseService.js +7 -0
  312. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  313. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  314. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  315. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  316. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  317. package/build/dist/Server/Services/Index.js +4 -0
  318. package/build/dist/Server/Services/Index.js.map +1 -1
  319. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  320. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  321. package/build/dist/Server/Services/MonitorService.js +48 -6
  322. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  323. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  324. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  325. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  326. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  327. package/build/dist/Server/Services/ProjectService.js +214 -0
  328. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  329. package/build/dist/Server/Services/RumSessionPinService.js +24 -6
  330. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  331. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
  332. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
  333. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
  334. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
  335. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
  336. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  337. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
  338. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
  339. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
  340. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
  341. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
  342. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
  343. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
  344. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  345. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  346. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  347. package/build/dist/Server/Services/StatusPageService.js +71 -0
  348. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  349. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  350. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  351. package/build/dist/Server/Services/TeamService.js +9 -0
  352. package/build/dist/Server/Services/TeamService.js.map +1 -1
  353. package/build/dist/Server/Services/UserService.js +10 -16
  354. package/build/dist/Server/Services/UserService.js.map +1 -1
  355. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  356. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  357. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  358. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  359. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
  360. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  361. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  362. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  363. package/build/dist/Server/Types/Markdown.js +31 -0
  364. package/build/dist/Server/Types/Markdown.js.map +1 -1
  365. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
  366. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
  367. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
  368. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  369. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  370. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  371. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  372. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  373. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  374. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  375. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  376. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  377. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +67 -0
  378. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  379. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
  380. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  381. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  382. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
  383. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +585 -367
  384. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  385. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  386. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  387. package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
  388. package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
  389. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
  390. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  391. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
  392. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
  393. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  394. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  395. package/build/dist/Types/API/Hostname.js +59 -11
  396. package/build/dist/Types/API/Hostname.js.map +1 -1
  397. package/build/dist/Types/API/Route.js +18 -2
  398. package/build/dist/Types/API/Route.js.map +1 -1
  399. package/build/dist/Types/API/URL.js +23 -2
  400. package/build/dist/Types/API/URL.js.map +1 -1
  401. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  402. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  403. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  404. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  405. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  406. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  407. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  408. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  409. package/build/dist/Types/Database/TableColumn.js +19 -6
  410. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  411. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  412. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  413. package/build/dist/Types/IP/IPv6.js +6 -1
  414. package/build/dist/Types/IP/IPv6.js.map +1 -1
  415. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  416. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  417. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  418. package/build/dist/Types/Permission.js +84 -0
  419. package/build/dist/Types/Permission.js.map +1 -1
  420. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
  421. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  422. package/build/dist/Types/Rules/RuleRun.js +4 -0
  423. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  424. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  425. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  426. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
  427. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  428. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  429. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  430. package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
  431. package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
  432. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
  433. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
  434. package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
  435. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
  436. package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
  437. package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
  438. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  439. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  440. package/build/dist/UI/Components/Icon/Icon.js +1 -1
  441. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  442. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  443. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  444. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  445. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  446. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  447. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  448. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  449. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  450. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  451. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  452. package/build/dist/Utils/HostAddressUtil.js +80 -0
  453. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  454. package/build/dist/Utils/LabelRuleImportExport.js +22 -6
  455. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  456. package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
  457. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  458. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  459. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  460. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  461. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
  462. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
  463. package/build/dist/Utils/Slo/SloDuration.js +13 -5
  464. package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
  465. package/build/dist/Utils/Slo/SloHealth.js +8 -7
  466. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  467. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
  468. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
  469. package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
  470. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
  471. package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
  472. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  473. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  474. package/jest.config.json +3 -1
  475. package/package.json +1 -1
  476. package/test-setup.sh +103 -34
  477. package/tsconfig.json +13 -0
  478. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  479. package/Server/API/TeamComplianceAPI.ts +0 -158
  480. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  481. package/Server/Services/TeamComplianceService.ts +0 -733
  482. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  483. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  484. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  485. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  486. package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
  487. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  488. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  489. package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
  490. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  491. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  492. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  493. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  494. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  495. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  496. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  497. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  498. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  499. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  500. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  501. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  502. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  503. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  504. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  505. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  506. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  507. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  508. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  509. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  510. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  511. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  512. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  513. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  514. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
@@ -0,0 +1,192 @@
1
+ import EnterpriseFeature from "./EnterpriseFeature";
2
+
3
+ /*
4
+ * The seat usage of an Enterprise install, as
5
+ * EnterpriseEdition.getSeatUsage() returns it and the /global-config/license
6
+ * response carries it. Only the type lives in core: the arithmetic that
7
+ * computes it belongs to the Enterprise license client
8
+ * (ee/Server/License/EnterpriseLicenseSeats.ts).
9
+ */
10
+ export interface SeatUsage {
11
+ /*
12
+ * False when the license carries no usable seat limit. Every other field is
13
+ * still filled in — a caller that wants to display usage can, it just must
14
+ * not block anything.
15
+ */
16
+ isEnforced: boolean;
17
+
18
+ // The limit actually being enforced, or null when there is none.
19
+ userLimit: number | null;
20
+
21
+ /*
22
+ * The best estimate of how many licensed seats are consumed right now,
23
+ * across every instance on this license, counting this installation's live
24
+ * users and the other instances' users from the last usage report.
25
+ */
26
+ seatsInUse: number;
27
+
28
+ // Null when there is no limit. Never negative — a breach reads as 0 free.
29
+ seatsRemaining: number | null;
30
+
31
+ /*
32
+ * The single question enforcement asks. True whenever there is no limit, so
33
+ * a caller can use this on its own without re-checking isEnforced.
34
+ */
35
+ hasSeatForNewUser: boolean;
36
+
37
+ /*
38
+ * How many of seatsInUse are users this installation has never seen. Zero
39
+ * whenever the topology is not known well enough to say, which is the
40
+ * conservative answer.
41
+ */
42
+ seatsUsedByOtherInstances: number;
43
+ }
44
+
45
+ /*
46
+ * Where the license stands in time. Deliberately about time only; whether the
47
+ * token was cryptographically verified is the separate `verification` axis.
48
+ *
49
+ * missing no license token is stored and the unlicensed trial is over, in
50
+ * which case graceEndsAt says when it ended. With no graceEndsAt
51
+ * the trial start is not known (see isTrialStartUnknown).
52
+ * valid the license is current
53
+ * grace expired no more than the grace period
54
+ * (ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS) ago, OR an unlicensed
55
+ * Enterprise install still inside its trial
56
+ * (ENTERPRISE_LICENSE_TRIAL_PERIOD_IN_DAYS from first seen). Both
57
+ * share this status because both entitle everything until they
58
+ * end; graceReason tells them apart, and graceEndsAt is the end of
59
+ * whichever one it is.
60
+ * expired expired longer ago than the grace period
61
+ * invalid a token is stored but cannot be trusted: a bad signature from a
62
+ * trusted key, the wrong audience or issuer, bound to a different
63
+ * instance, or malformed
64
+ */
65
+ export type EnterpriseLicenseStatus =
66
+ | "missing"
67
+ | "valid"
68
+ | "grace"
69
+ | "expired"
70
+ | "invalid";
71
+
72
+ /*
73
+ * verified signed by a key this build trusts; every limit comes from the
74
+ * signed claims
75
+ * unverified a legacy HS256 token or one signed by a key this build does not
76
+ * know; accepted while legacy acceptance is on, with limits taken
77
+ * from the stored columns
78
+ * none there is no token to verify
79
+ */
80
+ export type EnterpriseLicenseVerification = "verified" | "unverified" | "none";
81
+
82
+ export type EnterpriseLicenseGraceReason = "expired" | "unlicensed";
83
+
84
+ export type EnterpriseLicenseFeatures = "all" | Array<EnterpriseFeature>;
85
+
86
+ export interface EnterpriseLicenseSnapshot {
87
+ status: EnterpriseLicenseStatus;
88
+ verification: EnterpriseLicenseVerification;
89
+ graceReason?: EnterpriseLicenseGraceReason | undefined;
90
+ companyName?: string | undefined;
91
+ expiresAt?: Date | undefined;
92
+ graceEndsAt?: Date | undefined;
93
+ // Null when the license sets no seat limit.
94
+ userLimit: number | null;
95
+ isEvaluation: boolean;
96
+ features: EnterpriseLicenseFeatures;
97
+ // A human-readable explanation of the status, for logs and admin banners.
98
+ message?: string | undefined;
99
+ }
100
+
101
+ /*
102
+ * ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS (30): how long an expired license
103
+ * keeps working, counted from its expiry - a verified license's signed
104
+ * expiry, or an unverified legacy license's stored expiry column.
105
+ *
106
+ * ENTERPRISE_LICENSE_TRIAL_PERIOD_IN_DAYS (14): how long an Enterprise install
107
+ * that has no license is on trial, counted from
108
+ * GlobalConfig.enterpriseEditionFirstSeenAt.
109
+ *
110
+ * Until either ends nothing changes; after it, enterprise configuration
111
+ * becomes read-only and SSO, SCIM and audit logging stop
112
+ * (EnterpriseEdition.isFeatureActive) until a license is activated. They are
113
+ * defined in Common/Types so the browser copy derives the same numbers.
114
+ */
115
+ export {
116
+ ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS,
117
+ ENTERPRISE_LICENSE_TRIAL_PERIOD_IN_DAYS,
118
+ } from "../../Types/EnterpriseLicense/EnterpriseLicensePeriods";
119
+
120
+ export class EnterpriseLicenseSnapshotUtil {
121
+ /*
122
+ * True when the license currently entitles anything at all. Grace counts:
123
+ * the whole point of grace is that nothing changes until it ends.
124
+ */
125
+ public static isUsable(snapshot: EnterpriseLicenseSnapshot | null): boolean {
126
+ if (!snapshot) {
127
+ return false;
128
+ }
129
+
130
+ return snapshot.status === "valid" || snapshot.status === "grace";
131
+ }
132
+
133
+ public static includesFeature(
134
+ snapshot: EnterpriseLicenseSnapshot | null,
135
+ feature: EnterpriseFeature,
136
+ ): boolean {
137
+ if (!snapshot) {
138
+ return false;
139
+ }
140
+
141
+ if (snapshot.features === "all") {
142
+ return true;
143
+ }
144
+
145
+ if (!Array.isArray(snapshot.features)) {
146
+ return false;
147
+ }
148
+
149
+ return snapshot.features.includes(feature);
150
+ }
151
+
152
+ // Usable AND entitled: the license half of EnterpriseEdition.isFeatureAvailable.
153
+ public static entitles(
154
+ snapshot: EnterpriseLicenseSnapshot | null,
155
+ feature: EnterpriseFeature,
156
+ ): boolean {
157
+ return (
158
+ EnterpriseLicenseSnapshotUtil.isUsable(snapshot) &&
159
+ EnterpriseLicenseSnapshotUtil.includesFeature(snapshot, feature)
160
+ );
161
+ }
162
+
163
+ /*
164
+ * "missing" with no graceEndsAt: no license is installed, and the start of
165
+ * the unlicensed trial (GlobalConfig.enterpriseEditionFirstSeenAt) is not
166
+ * known - the stamp has not been written yet (it failed, or the row does
167
+ * not exist yet), or nothing could be read at all (createMissing). So
168
+ * whether the install is still in its trial is unknown.
169
+ * EnterpriseEdition.isFeatureActive treats it as an unknown license state
170
+ * (active); the configuration checks still fail closed on it.
171
+ */
172
+ public static isTrialStartUnknown(
173
+ snapshot: EnterpriseLicenseSnapshot | null,
174
+ ): boolean {
175
+ if (!snapshot) {
176
+ return false;
177
+ }
178
+
179
+ return snapshot.status === "missing" && !snapshot.graceEndsAt;
180
+ }
181
+
182
+ public static createMissing(message?: string): EnterpriseLicenseSnapshot {
183
+ return {
184
+ status: "missing",
185
+ verification: "none",
186
+ userLimit: null,
187
+ isEvaluation: false,
188
+ features: [],
189
+ message: message || "No OneUptime Enterprise license is installed.",
190
+ };
191
+ }
192
+ }
@@ -0,0 +1,233 @@
1
+ import type { ExpressRouter } from "../Utils/Express";
2
+ import type {
3
+ EnterpriseLicenseSnapshot,
4
+ SeatUsage,
5
+ } from "./EnterpriseLicenseSnapshot";
6
+ import type BaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
7
+ import type DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
8
+ import type { JSONObject } from "../../Types/JSON";
9
+ import type ObjectID from "../../Types/ObjectID";
10
+
11
+ /*
12
+ * The contract between core (Apache-2.0, everything outside ee/) and the
13
+ * enterprise module in ee/ (OneUptime Enterprise License).
14
+ *
15
+ * Core never imports ee. The App loader (packages/App/Utils/EnterpriseLoader.ts)
16
+ * finds ee/Server/Index.ts at boot, requires it, checks it against this
17
+ * interface and registers it with EnterpriseEdition. Everything in core that
18
+ * behaves differently per edition asks EnterpriseEdition, never ee directly.
19
+ */
20
+
21
+ export type EnterpriseServerModuleName = "oneuptime-enterprise";
22
+
23
+ export const ENTERPRISE_SERVER_MODULE_NAME: EnterpriseServerModuleName =
24
+ "oneuptime-enterprise";
25
+
26
+ /*
27
+ * The recording half of the audit log. Core's AuditLogService keeps these four
28
+ * public methods as thin delegates, so DatabaseService, ProjectService and the
29
+ * user-notification services call exactly what they call today; on the
30
+ * Community Edition there is no recorder and nothing is recorded.
31
+ *
32
+ * The signatures mirror AuditLogService's public methods one for one.
33
+ */
34
+ export interface AuditLogRecorder {
35
+ recordCreate<TModel extends BaseModel>(data: {
36
+ model: TModel;
37
+ createdItem: TModel;
38
+ props: DatabaseCommonInteractionProps;
39
+ }): Promise<void>;
40
+
41
+ recordUpdate<TModel extends BaseModel>(data: {
42
+ model: TModel;
43
+ before: TModel;
44
+ updatedFields: JSONObject;
45
+ itemId: ObjectID;
46
+ props: DatabaseCommonInteractionProps;
47
+ }): Promise<void>;
48
+
49
+ recordDelete<TModel extends BaseModel>(data: {
50
+ model: TModel;
51
+ deletedItem: TModel;
52
+ itemId: ObjectID;
53
+ props: DatabaseCommonInteractionProps;
54
+ }): Promise<void>;
55
+
56
+ invalidateProjectSettings(projectId: ObjectID): void;
57
+ }
58
+
59
+ export interface EnterpriseLicensingProvider {
60
+ /*
61
+ * Recomputes the snapshot from the cached inputs (token + stored columns)
62
+ * and the current time, so expiry and grace boundaries are exact. A failed
63
+ * refresh keeps the last good inputs; it never drops to "missing".
64
+ */
65
+ getSnapshot(): Promise<EnterpriseLicenseSnapshot>;
66
+
67
+ /*
68
+ * The synchronous twin for synchronous checks. Null until the first load
69
+ * finished. Configuration checks (isFeatureAvailableSync) treat null as "not
70
+ * licensed" (fail closed); runtime checks (isFeatureActive) treat it as
71
+ * active, so an unknown license state never locks anyone out.
72
+ */
73
+ getCachedSnapshot(): EnterpriseLicenseSnapshot | null;
74
+
75
+ refresh(): Promise<void>;
76
+
77
+ // Drops this process's cached inputs; the next read reloads them.
78
+ invalidate(): void;
79
+
80
+ getSeatUsage(): Promise<SeatUsage | null>;
81
+
82
+ /*
83
+ * Throws when adding one more user would exceed the license's seat limit.
84
+ * A no-op when billing is enabled or the license is not valid/grace.
85
+ */
86
+ assertSeatAvailableForNewUser(): Promise<void>;
87
+ }
88
+
89
+ export default interface EnterpriseServerModule {
90
+ name: typeof ENTERPRISE_SERVER_MODULE_NAME;
91
+ version: string;
92
+
93
+ /*
94
+ * Bounded by the loader with a timeout. Must not throw on a database blip,
95
+ * and must not make network calls the boot has to wait for.
96
+ */
97
+ init(): Promise<void>;
98
+
99
+ licensing: EnterpriseLicensingProvider;
100
+
101
+ /*
102
+ * Mounted at ["/api/identity", "/"] right after core's identity routers.
103
+ * RULE for every router below: no layer without a route (no router.use), because
104
+ * a path-less middleware in a router mounted at "/" or ahead of a core router
105
+ * runs for requests meant for core routes.
106
+ */
107
+ getIdentityRouters(): Array<ExpressRouter>;
108
+
109
+ // Mounted at "/api".
110
+ getApiRouters(): Array<ExpressRouter>;
111
+
112
+ // Mounted at "/api/admin/health" BEFORE core's AdminHealth router.
113
+ getAdminHealthRouter(): ExpressRouter | null;
114
+
115
+ // Requires the ee cron modules (RunCron registers at import time).
116
+ registerWorkerJobs(): Promise<void>;
117
+
118
+ getAuditLogRecorder(): AuditLogRecorder | null;
119
+ }
120
+
121
+ const REQUIRED_MODULE_FUNCTIONS: ReadonlyArray<string> = [
122
+ "init",
123
+ "getIdentityRouters",
124
+ "getApiRouters",
125
+ "getAdminHealthRouter",
126
+ "registerWorkerJobs",
127
+ "getAuditLogRecorder",
128
+ ];
129
+
130
+ const REQUIRED_LICENSING_FUNCTIONS: ReadonlyArray<string> = [
131
+ "getSnapshot",
132
+ "getCachedSnapshot",
133
+ "refresh",
134
+ "invalidate",
135
+ "getSeatUsage",
136
+ "assertSeatAvailableForNewUser",
137
+ ];
138
+
139
+ type LooseRecord = Record<string, unknown>;
140
+
141
+ const isRecord: (value: unknown) => value is LooseRecord = (
142
+ value: unknown,
143
+ ): value is LooseRecord => {
144
+ return typeof value === "object" && value !== null;
145
+ };
146
+
147
+ export class EnterpriseServerModuleShape {
148
+ /*
149
+ * Every way `candidate` falls short of EnterpriseServerModule, as readable
150
+ * sentences. Empty means the shape is right. Used by the loader (a wrong
151
+ * shape is a broken build: fail fast) and by ee's own shape test.
152
+ */
153
+ public static findProblems(candidate: unknown): Array<string> {
154
+ const problems: Array<string> = [];
155
+
156
+ if (!isRecord(candidate)) {
157
+ problems.push(
158
+ `the module must export an object, but it exported ${candidate === null ? "null" : typeof candidate}`,
159
+ );
160
+ return problems;
161
+ }
162
+
163
+ if (candidate["name"] !== ENTERPRISE_SERVER_MODULE_NAME) {
164
+ problems.push(
165
+ `"name" must be "${ENTERPRISE_SERVER_MODULE_NAME}", but it is ${JSON.stringify(candidate["name"]) ?? "undefined"}`,
166
+ );
167
+ }
168
+
169
+ if (
170
+ typeof candidate["version"] !== "string" ||
171
+ candidate["version"].trim().length === 0
172
+ ) {
173
+ problems.push(`"version" must be a non-empty string`);
174
+ }
175
+
176
+ for (const functionName of REQUIRED_MODULE_FUNCTIONS) {
177
+ if (typeof candidate[functionName] !== "function") {
178
+ problems.push(`"${functionName}" must be a function`);
179
+ }
180
+ }
181
+
182
+ const licensing: unknown = candidate["licensing"];
183
+
184
+ if (!isRecord(licensing)) {
185
+ problems.push(`"licensing" must be an object`);
186
+ return problems;
187
+ }
188
+
189
+ for (const functionName of REQUIRED_LICENSING_FUNCTIONS) {
190
+ if (typeof licensing[functionName] !== "function") {
191
+ problems.push(`"licensing.${functionName}" must be a function`);
192
+ }
193
+ }
194
+
195
+ return problems;
196
+ }
197
+
198
+ /*
199
+ * The router-contract check: describes every layer of `router` that is not a
200
+ * route (a router.use middleware or sub-router). Empty means the router
201
+ * cannot shadow a core route.
202
+ */
203
+ public static findLayersWithoutRoute(router: ExpressRouter): Array<string> {
204
+ const stack: unknown = (router as unknown as LooseRecord)["stack"];
205
+
206
+ if (!Array.isArray(stack)) {
207
+ return ["the router has no layer stack (is it an express Router?)"];
208
+ }
209
+
210
+ const problems: Array<string> = [];
211
+
212
+ stack.forEach((layer: unknown, index: number): void => {
213
+ if (isRecord(layer) && layer["route"]) {
214
+ return;
215
+ }
216
+
217
+ const name: string =
218
+ isRecord(layer) && typeof layer["name"] === "string"
219
+ ? layer["name"]
220
+ : "<unknown>";
221
+ const pattern: string =
222
+ isRecord(layer) && layer["regexp"] instanceof RegExp
223
+ ? layer["regexp"].toString()
224
+ : "<no pattern>";
225
+
226
+ problems.push(
227
+ `layer ${index} ("${name}", ${pattern}) is a router.use() layer, not a route`,
228
+ );
229
+ });
230
+
231
+ return problems;
232
+ }
233
+ }
@@ -1059,6 +1059,95 @@ export const EnableProfiling: boolean =
1059
1059
  export const IsEnterpriseEdition: boolean =
1060
1060
  process.env["IS_ENTERPRISE_EDITION"] === "true";
1061
1061
 
1062
+ /*
1063
+ * Which edition this process should run (ONEUPTIME_EDITION):
1064
+ * auto (default) load the enterprise module from ee/ when it is present
1065
+ * community never load it, even when ee/ is present
1066
+ * enterprise it MUST load; a missing or broken ee/ stops the boot (the
1067
+ * Enterprise image sets this, so a broken image never silently
1068
+ * runs as the Community Edition)
1069
+ *
1070
+ * The effective edition is EnterpriseEdition.isLoaded(), decided at boot by
1071
+ * packages/App/Utils/EnterpriseLoader.ts. IS_ENTERPRISE_EDITION above turns
1072
+ * nothing on: it only says the Enterprise Edition is expected (see
1073
+ * isEnterpriseEditionRequested below), and the boot stops when it is expected
1074
+ * but the enterprise module did not load.
1075
+ */
1076
+ export type OneUptimeEditionSetting = "auto" | "community" | "enterprise";
1077
+
1078
+ export const ONEUPTIME_EDITION_SETTINGS: ReadonlyArray<OneUptimeEditionSetting> =
1079
+ ["auto", "community", "enterprise"];
1080
+
1081
+ // Unset or blank reads as "auto"; an unrecognised value is null.
1082
+ export const parseOneUptimeEdition: (
1083
+ rawValue: string | undefined,
1084
+ ) => OneUptimeEditionSetting | null = (
1085
+ rawValue: string | undefined,
1086
+ ): OneUptimeEditionSetting | null => {
1087
+ const value: string = (rawValue || "").trim().toLowerCase();
1088
+
1089
+ if (!value) {
1090
+ return "auto";
1091
+ }
1092
+
1093
+ return (
1094
+ ONEUPTIME_EDITION_SETTINGS.find(
1095
+ (setting: OneUptimeEditionSetting): boolean => {
1096
+ return setting === value;
1097
+ },
1098
+ ) || null
1099
+ );
1100
+ };
1101
+
1102
+ /*
1103
+ * Null when ONEUPTIME_EDITION holds something unrecognised: the loader refuses
1104
+ * to boot rather than guess which edition a typo meant.
1105
+ */
1106
+ export const OneUptimeEdition: OneUptimeEditionSetting | null =
1107
+ parseOneUptimeEdition(process.env["ONEUPTIME_EDITION"]);
1108
+
1109
+ /*
1110
+ * Whether this install asks for the Enterprise Edition: IS_ENTERPRISE_EDITION
1111
+ * is exactly "true", unless ONEUPTIME_EDITION=community explicitly chooses the
1112
+ * Community Edition. The Enterprise image bakes IS_ENTERPRISE_EDITION=true, and
1113
+ * ONEUPTIME_EDITION=community is the documented way to run that image as the
1114
+ * Community Edition, so that combination is a deliberate choice, not a
1115
+ * mismatch.
1116
+ *
1117
+ * This is the one definition behind both the App's boot guard
1118
+ * (packages/App/Utils/EnterpriseLoader.ts: requested but not loaded stops the
1119
+ * boot) and the frontends' ENTERPRISE_EDITION_REQUESTED_BUT_NOT_LOADED notice
1120
+ * (Server/Utils/FrontendEnvironment.ts), so the two never disagree. It takes
1121
+ * the environment as an argument, so a caller can read it when it needs to.
1122
+ */
1123
+ export const isEnterpriseEditionRequested: (
1124
+ environment: Record<string, string | undefined>,
1125
+ ) => boolean = (environment: Record<string, string | undefined>): boolean => {
1126
+ return (
1127
+ environment["IS_ENTERPRISE_EDITION"] === "true" &&
1128
+ parseOneUptimeEdition(environment["ONEUPTIME_EDITION"]) !== "community"
1129
+ );
1130
+ };
1131
+
1132
+ export const IsEnterpriseEditionRequested: boolean =
1133
+ isEnterpriseEditionRequested(process.env);
1134
+
1135
+ /*
1136
+ * Overrides where the loader looks for the ee/ directory (tests and fixtures).
1137
+ * Unset: the repo layout <root>/ee, then the container layout /usr/src/ee.
1138
+ */
1139
+ export const OneUptimeEnterpriseDirectory: string | undefined =
1140
+ process.env["ONEUPTIME_EE_DIR"]?.trim() || undefined;
1141
+
1142
+ /*
1143
+ * The hosted oneuptime.com (billing enabled) must run the Enterprise image:
1144
+ * on the Community image paid SSO and audit logging would silently stop, and
1145
+ * the license server self-hosted customers activate against would be gone. The
1146
+ * boot refuses that combination unless this development escape hatch is set.
1147
+ */
1148
+ export const AllowBillingWithoutEnterprise: boolean =
1149
+ process.env["ALLOW_BILLING_WITHOUT_ENTERPRISE"] === "true";
1150
+
1062
1151
  export const AverageSpanRowSizeInBytes: number = parsePositiveNumberFromEnv(
1063
1152
  "AVERAGE_SPAN_ROW_SIZE_IN_BYTES",
1064
1153
  1024,
@@ -1182,12 +1271,68 @@ export const PushNotificationRelayUrl: string =
1182
1271
  process.env["PUSH_NOTIFICATION_RELAY_URL"] ||
1183
1272
  "https://oneuptime.com/api/notification/push-relay/send";
1184
1273
 
1274
+ export const DEFAULT_ENTERPRISE_LICENSE_SERVER_URL: string =
1275
+ "https://oneuptime.com";
1276
+
1277
+ const TRAILING_SLASHES_PATTERN: RegExp = /\/+$/;
1278
+
1279
+ /*
1280
+ * The license server self-hosted Enterprise installs activate against and
1281
+ * report seat usage to. Overridable for a staging license server or an
1282
+ * internal relay. The license key travels in these requests, so plain http is
1283
+ * accepted only when `allowInsecure` (development and test environments);
1284
+ * anything else unusable - empty, unparseable, another scheme, or http in
1285
+ * production - falls back to the default rather than sending the key in the
1286
+ * clear.
1287
+ */
1288
+ export const resolveEnterpriseLicenseServerUrl: (
1289
+ rawValue: string | undefined,
1290
+ allowInsecure: boolean,
1291
+ ) => string = (
1292
+ rawValue: string | undefined,
1293
+ allowInsecure: boolean,
1294
+ ): string => {
1295
+ const value: string = (rawValue || "")
1296
+ .trim()
1297
+ .replace(TRAILING_SLASHES_PATTERN, "");
1298
+
1299
+ if (!value) {
1300
+ return DEFAULT_ENTERPRISE_LICENSE_SERVER_URL;
1301
+ }
1302
+
1303
+ const lowerCasedValue: string = value.toLowerCase();
1304
+ const isHttps: boolean = lowerCasedValue.startsWith("https://");
1305
+ const isHttp: boolean = lowerCasedValue.startsWith("http://");
1306
+
1307
+ if (!isHttps && !(isHttp && allowInsecure)) {
1308
+ return DEFAULT_ENTERPRISE_LICENSE_SERVER_URL;
1309
+ }
1310
+
1311
+ try {
1312
+ URL.fromString(value);
1313
+ } catch {
1314
+ return DEFAULT_ENTERPRISE_LICENSE_SERVER_URL;
1315
+ }
1316
+
1317
+ return value;
1318
+ };
1319
+
1320
+ const enterpriseLicenseServerUrlValue: string =
1321
+ resolveEnterpriseLicenseServerUrl(
1322
+ process.env["ENTERPRISE_LICENSE_SERVER_URL"],
1323
+ IsDevelopment || IsTest,
1324
+ );
1325
+
1326
+ export const EnterpriseLicenseServerUrl: URL = URL.fromString(
1327
+ enterpriseLicenseServerUrlValue,
1328
+ );
1329
+
1185
1330
  export const EnterpriseLicenseValidationUrl: URL = URL.fromString(
1186
- "https://oneuptime.com/api/enterprise-license/validate",
1331
+ `${enterpriseLicenseServerUrlValue}/api/enterprise-license/validate`,
1187
1332
  );
1188
1333
 
1189
1334
  export const EnterpriseLicenseUserCountReportUrl: URL = URL.fromString(
1190
- "https://oneuptime.com/api/enterprise-license/report-user-count",
1335
+ `${enterpriseLicenseServerUrlValue}/api/enterprise-license/report-user-count`,
1191
1336
  );
1192
1337
 
1193
1338
  /*
@@ -0,0 +1,25 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ /*
4
+ * Generated with npm run generate-postgres-migration. GlobalConfig gains the
5
+ * moment this installation first booted the Enterprise Edition; an unlicensed
6
+ * Enterprise install gets its 14-day trial counted from it. Nullable with no
7
+ * default: the enterprise module stamps it on its own first boot.
8
+ */
9
+ export class AddEnterpriseEditionFirstSeenAt1793900000000
10
+ implements MigrationInterface
11
+ {
12
+ public name: string = "AddEnterpriseEditionFirstSeenAt1793900000000";
13
+
14
+ public async up(queryRunner: QueryRunner): Promise<void> {
15
+ await queryRunner.query(
16
+ `ALTER TABLE "GlobalConfig" ADD "enterpriseEditionFirstSeenAt" TIMESTAMP WITH TIME ZONE`,
17
+ );
18
+ }
19
+
20
+ public async down(queryRunner: QueryRunner): Promise<void> {
21
+ await queryRunner.query(
22
+ `ALTER TABLE "GlobalConfig" DROP COLUMN "enterpriseEditionFirstSeenAt"`,
23
+ );
24
+ }
25
+ }