@oneuptime/common 13.0.0 → 13.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 (734) hide show
  1. package/Models/DatabaseModels/Alert.ts +55 -0
  2. package/Models/DatabaseModels/CloudResource.ts +45 -7
  3. package/Models/DatabaseModels/CodeRepository.ts +85 -0
  4. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +57 -7
  5. package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +263 -0
  6. package/Models/DatabaseModels/Incident.ts +55 -0
  7. package/Models/DatabaseModels/Index.ts +16 -0
  8. package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
  9. package/Models/DatabaseModels/User.ts +51 -2
  10. package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +43 -2
  11. package/Models/DatabaseModels/UserWebAuthn.ts +17 -0
  12. package/Models/DatabaseModels/VMwareResource.ts +1149 -0
  13. package/Models/DatabaseModels/VMwareVCenter.ts +1122 -0
  14. package/Models/DatabaseModels/VMwareVCenterFeed.ts +625 -0
  15. package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +514 -0
  16. package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +596 -0
  17. package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +485 -0
  18. package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +484 -0
  19. package/Models/DatabaseModels/WorkflowVariable.ts +22 -1
  20. package/Server/API/AIAgentDataAPI.ts +79 -4
  21. package/Server/API/AIAgentGitHubAPI.ts +523 -0
  22. package/Server/API/AIChatAPI.ts +20 -1
  23. package/Server/API/BillingAPI.ts +33 -0
  24. package/Server/API/DashboardAPI.ts +10 -0
  25. package/Server/API/GitHubAPI.ts +47 -5
  26. package/Server/API/GoogleSecOpsConnectionAPI.ts +79 -0
  27. package/Server/API/UserWebAuthnAPI.ts +21 -1
  28. package/Server/API/VMwareResourceAPI.ts +143 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.ts +68 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.ts +26 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.ts +636 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.ts +47 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.ts +17 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.ts +83 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  36. package/Server/Middleware/IdentityRateLimit.ts +101 -0
  37. package/Server/Services/AIRunService.ts +13 -0
  38. package/Server/Services/BillingPaymentMethodService.ts +99 -28
  39. package/Server/Services/BillingService.ts +287 -20
  40. package/Server/Services/CloudResourceInstanceService.ts +70 -0
  41. package/Server/Services/ExceptionAggregationService.ts +1 -0
  42. package/Server/Services/GoogleSecOpsConnectionRunService.ts +10 -0
  43. package/Server/Services/GoogleSecOpsConnectionService.ts +12 -0
  44. package/Server/Services/Index.ts +16 -0
  45. package/Server/Services/LogAggregationService.ts +1 -0
  46. package/Server/Services/MetricAggregationService.ts +1 -0
  47. package/Server/Services/MobilePasskeyLoginService.ts +216 -0
  48. package/Server/Services/MonitorService.ts +51 -1
  49. package/Server/Services/MonitorTemplateService.ts +91 -29
  50. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +132 -1
  51. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +176 -2
  52. package/Server/Services/OpenTelemetryIngestService.ts +17 -0
  53. package/Server/Services/PayAsYouGoBillingService.ts +446 -0
  54. package/Server/Services/ProjectService.ts +46 -2
  55. package/Server/Services/ServerlessFunctionInstanceService.ts +71 -0
  56. package/Server/Services/TeamMemberService.ts +96 -36
  57. package/Server/Services/TelemetryIngestionKeyService.ts +80 -10
  58. package/Server/Services/TelemetryUsageBillingService.ts +95 -5
  59. package/Server/Services/TraceAggregationService.ts +5 -4
  60. package/Server/Services/UserWebAuthnService.ts +592 -133
  61. package/Server/Services/VMwareResourceService.ts +648 -0
  62. package/Server/Services/VMwareVCenterFeedService.ts +99 -0
  63. package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +240 -0
  64. package/Server/Services/VMwareVCenterLabelRuleService.ts +14 -0
  65. package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +252 -0
  66. package/Server/Services/VMwareVCenterOwnerRuleService.ts +14 -0
  67. package/Server/Services/VMwareVCenterOwnerTeamService.ts +139 -0
  68. package/Server/Services/VMwareVCenterOwnerUserService.ts +133 -0
  69. package/Server/Services/VMwareVCenterService.ts +629 -0
  70. package/Server/Services/WorkflowVariableService.ts +203 -0
  71. package/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.ts +17 -0
  72. package/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.ts +31 -1
  73. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +7 -0
  74. package/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.ts +341 -0
  75. package/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.ts +274 -0
  76. package/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.ts +375 -0
  77. package/Server/Utils/CodeRepository/GitHub/GitHubConversation.ts +846 -0
  78. package/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.ts +360 -0
  79. package/Server/Utils/CodeRepository/GitHub/GitHubRunReply.ts +421 -0
  80. package/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.ts +140 -0
  81. package/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.ts +906 -0
  82. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +143 -0
  83. package/Server/Utils/DataSource/EgressGuard.ts +160 -15
  84. package/Server/Utils/Database/TruncateColumnValue.ts +1 -1
  85. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +2 -0
  86. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +33 -0
  87. package/Server/Utils/EmailRollup/EmailRollupWriter.ts +44 -0
  88. package/Server/Utils/LogRedaction.ts +2 -1
  89. package/Server/Utils/Monitor/MonitorAlert.ts +1 -1
  90. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +302 -3
  91. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +26 -4
  92. package/Server/Utils/Monitor/MonitorResourceContext.ts +5 -3
  93. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +14 -0
  94. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
  95. package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
  96. package/Server/Utils/Monitor/SeriesResourceLinker.ts +28 -5
  97. package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +3 -3
  98. package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +14 -9
  99. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +116 -84
  100. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +594 -195
  101. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +466 -0
  102. package/Server/Utils/Telemetry/EntityRegistry.ts +5 -0
  103. package/Server/Utils/Telemetry/ResourceHeartbeat.ts +2 -1
  104. package/Server/Utils/Telemetry/TelemetryEntity.ts +181 -1
  105. package/Server/Utils/Telemetry/VMwareSnapshotScan.ts +1352 -0
  106. package/Tests/App/Accounts/LoginPasskey.test.tsx +529 -0
  107. package/Tests/App/Accounts/MobilePasskey.test.tsx +620 -0
  108. package/Tests/App/Accounts/PasswordRequirements.test.tsx +254 -0
  109. package/Tests/App/Accounts/RegisterPassword.test.tsx +553 -0
  110. package/Tests/App/Dashboard/AskAiAvailability.test.ts +224 -0
  111. package/Tests/App/Dashboard/AskAiDisabled.test.tsx +432 -0
  112. package/Tests/App/Dashboard/BackupCodes.test.tsx +414 -0
  113. package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +530 -0
  114. package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +195 -0
  115. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +199 -0
  116. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +198 -0
  117. package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +215 -0
  118. package/Tests/App/Dashboard/CloudFleetSummary.test.ts +183 -0
  119. package/Tests/App/Dashboard/CloudFleetSummaryComponent.test.tsx +248 -0
  120. package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +215 -0
  121. package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +3 -0
  122. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +441 -0
  123. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +458 -0
  124. package/Tests/App/Dashboard/DashboardToolbarPopupLayering.test.tsx +566 -0
  125. package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +376 -0
  126. package/Tests/App/Dashboard/DiscoveryScanLiveUpdates.test.tsx +642 -0
  127. package/Tests/App/Dashboard/DiscoveryScanProgress.test.tsx +267 -0
  128. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +69 -231
  129. package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +244 -0
  130. package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +724 -0
  131. package/Tests/App/Dashboard/MonitorTemplateSyncFields.test.tsx +539 -0
  132. package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +24 -7
  133. package/Tests/App/Dashboard/OnCallOverridePresentation.test.ts +496 -0
  134. package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +677 -0
  135. package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +31 -3
  136. package/Tests/App/Dashboard/PaidUsageConsent.test.tsx +180 -0
  137. package/Tests/App/Dashboard/PasskeySettings.test.tsx +1220 -0
  138. package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +176 -275
  139. package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +380 -233
  140. package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +3 -23
  141. package/Tests/App/Dashboard/ResourceFeed.test.tsx +1 -0
  142. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
  143. package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +260 -0
  144. package/Tests/App/Dashboard/VMwareDashboardWidgets.test.ts +573 -0
  145. package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
  146. package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +768 -0
  147. package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +532 -40
  148. package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +19 -2
  149. package/Tests/Fixtures/MobilePasskeyUser.json +8 -0
  150. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +25 -6
  151. package/Tests/Models/DatabaseModels/VMwareModels.test.ts +1134 -0
  152. package/Tests/Models/RunnerVersionLabel.test.ts +4 -2
  153. package/Tests/Server/API/AIChatProvidersAIEnabled.test.ts +259 -0
  154. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +31 -2
  155. package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +116 -0
  156. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +29 -1
  157. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +13 -2
  158. package/Tests/Server/API/GitHubWebhookSignature.test.ts +368 -0
  159. package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +248 -0
  160. package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +330 -0
  161. package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +172 -0
  162. package/Tests/Server/API/VMwareResourceAPI.test.ts +546 -0
  163. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupMetadataMigration.test.ts +85 -0
  164. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +34 -3
  165. package/Tests/Server/Middleware/PasskeyRateLimit.test.ts +141 -0
  166. package/Tests/Server/Services/AutoImportRuleRearmRecentScans.test.ts +343 -0
  167. package/Tests/Server/Services/AutoImportRuleWriteRearmsScans.test.ts +381 -0
  168. package/Tests/Server/Services/BillingPaymentMethodServiceSync.test.ts +175 -0
  169. package/Tests/Server/Services/BillingService.test.ts +26 -11
  170. package/Tests/Server/Services/BillingServiceMeteredPaymentAuthorization.test.ts +245 -0
  171. package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +362 -0
  172. package/Tests/Server/Services/CloudResourceInstanceStalePrune.test.ts +188 -0
  173. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +16 -2
  174. package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +153 -0
  175. package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +13 -0
  176. package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +5 -0
  177. package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +36 -0
  178. package/Tests/Server/Services/InventoryUpsertTruncationGuard.test.ts +151 -0
  179. package/Tests/Server/Services/MobilePasskeyLoginIntegration.test.ts +231 -0
  180. package/Tests/Server/Services/MobilePasskeyLoginService.test.ts +315 -0
  181. package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +302 -0
  182. package/Tests/Server/Services/MonitorTemplateServiceFieldSync.test.ts +994 -0
  183. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +22 -0
  184. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
  185. package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +857 -0
  186. package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +379 -0
  187. package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +99 -1
  188. package/Tests/Server/Services/ProjectServiceSubscriptionSeats.test.ts +134 -0
  189. package/Tests/Server/Services/ResourceFeedServices.test.ts +3 -2
  190. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +32 -6
  191. package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +363 -175
  192. package/Tests/Server/Services/ServerlessFunctionInstanceStalePrune.test.ts +200 -0
  193. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +3 -0
  194. package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +762 -0
  195. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +3 -0
  196. package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +72 -0
  197. package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +17 -4
  198. package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +355 -0
  199. package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +41 -4
  200. package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +37 -0
  201. package/Tests/Server/Services/UserWebAuthnPasskeyIntegration.test.ts +401 -0
  202. package/Tests/Server/Services/UserWebAuthnPasskeyService.test.ts +769 -0
  203. package/Tests/Server/Services/UserWebAuthnUserVerification.test.ts +649 -0
  204. package/Tests/Server/Services/VMwareResourceService.test.ts +945 -0
  205. package/Tests/Server/Services/VMwareVCenterService.test.ts +722 -0
  206. package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +842 -0
  207. package/Tests/Server/TestingUtils/PasskeyHttpIntegration.ts +102 -0
  208. package/Tests/Server/TestingUtils/SecurityKey.ts +464 -0
  209. package/Tests/Server/TestingUtils/WebAuthnServiceMocks.ts +60 -0
  210. package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +573 -0
  211. package/Tests/Server/Types/Database/Permissions/ProjectCustomerSupportAccessColumn.test.ts +261 -0
  212. package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +95 -0
  213. package/Tests/Server/Utils/CodeRepository/GitHubAgentTaskTrigger.test.ts +2101 -0
  214. package/Tests/Server/Utils/CodeRepository/GitHubCommandAuthorizer.test.ts +883 -0
  215. package/Tests/Server/Utils/CodeRepository/GitHubCommandParser.test.ts +1474 -0
  216. package/Tests/Server/Utils/CodeRepository/GitHubConversation.test.ts +1526 -0
  217. package/Tests/Server/Utils/CodeRepository/GitHubReplyComposer.test.ts +1389 -0
  218. package/Tests/Server/Utils/CodeRepository/GitHubRunReply.test.ts +1707 -0
  219. package/Tests/Server/Utils/CodeRepository/GitHubWebhookHandler.test.ts +2202 -0
  220. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +345 -0
  221. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +896 -0
  222. package/Tests/Server/Utils/EmailRollup/EmailRollupMetadataIntegration.test.ts +246 -0
  223. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +299 -1
  224. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +6 -0
  225. package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +185 -0
  226. package/Tests/Server/Utils/LogRedaction.test.ts +33 -0
  227. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +2 -1
  228. package/Tests/Server/Utils/Monitor/Criteria/TelemetryStepMetricAlias.test.ts +10 -0
  229. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +66 -1
  230. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +362 -0
  231. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
  232. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +60 -1
  233. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +60 -0
  234. package/Tests/Server/Utils/Monitor/MonitorRootCauseTargetResolution.test.ts +423 -0
  235. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +6 -0
  236. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
  237. package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
  238. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +46 -2
  239. package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +81 -45
  240. package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +711 -0
  241. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClickhouseIntegration.test.ts +223 -0
  242. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +69 -1
  243. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +838 -0
  244. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsErrorHandling.test.ts +241 -28
  245. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +651 -0
  246. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +11 -0
  247. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +13 -12
  248. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +112 -127
  249. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsRequestContract.test.ts +12 -18
  250. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsResponseParsing.test.ts +43 -0
  251. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +580 -0
  252. package/Tests/Server/Utils/Telemetry/VMwareSnapshotScan.test.ts +1748 -0
  253. package/Tests/Types/Cloud/CloudPlatform.test.ts +574 -0
  254. package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +2 -0
  255. package/Tests/Types/Monitor/MonitorCriteriaMetricVariables.test.ts +9 -0
  256. package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
  257. package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +53 -8
  258. package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +97 -0
  259. package/Tests/Types/Monitor/MonitorStepMetricViewConfigUtil.test.ts +1 -0
  260. package/Tests/Types/Monitor/MonitorStepTemplateSyncFields.test.ts +107 -0
  261. package/Tests/Types/Monitor/MonitorTemplateSyncField.test.ts +172 -0
  262. package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
  263. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +2 -0
  264. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +1 -0
  265. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +9 -0
  266. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
  267. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
  268. package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +131 -0
  269. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +10 -0
  270. package/Tests/Types/Monitor/VMwareAlertTemplates.test.ts +1608 -0
  271. package/Tests/Types/Monitor/VMwareMetricCatalog.test.ts +488 -0
  272. package/Tests/Types/OnCallDutyPolicy/OverrideProvenance.test.ts +295 -0
  273. package/Tests/Types/Runner/RunnerLiveStatus.test.ts +2 -2
  274. package/Tests/Types/SignupPassword.test.ts +205 -0
  275. package/Tests/Types/StatusPage/StatusPageLanguage.test.ts +44 -0
  276. package/Tests/Types/SupportedLanguages.test.ts +119 -0
  277. package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +19 -0
  278. package/Tests/UI/ColorPickerBuild.test.ts +86 -0
  279. package/Tests/UI/Components/Breadcrumbs.test.tsx +32 -0
  280. package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +937 -0
  281. package/Tests/UI/Components/Forms/ModelFormWriteOnlyColumnSelect.test.tsx +230 -0
  282. package/Tests/UI/Components/Forms/ValidationFormSteps.test.ts +3 -4
  283. package/Tests/UI/Components/LabelRuleImportExport.test.tsx +907 -0
  284. package/Tests/UI/Components/ModelTable/ModelTableCreateAfterEdit.test.tsx +514 -0
  285. package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +301 -0
  286. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +2 -1
  287. package/Tests/UI/Components/TooltipLazyContent.test.tsx +373 -0
  288. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsMessagingEndpointGuidance.test.tsx +43 -12
  289. package/Tests/UI/ReactDomBuild.test.ts +104 -0
  290. package/Tests/UI/ReactRouterSingletonBuild.test.ts +11 -1
  291. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +148 -0
  292. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +29 -0
  293. package/Tests/UI/Utils/DashboardStackingLayers.test.ts +197 -0
  294. package/Tests/UI/Utils/LabelRuleImportExport.test.ts +546 -0
  295. package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +109 -2
  296. package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +7 -2
  297. package/Tests/UI/Utils/UserEmailRegistrationStatus.test.tsx +295 -0
  298. package/Tests/UI/Utils/WebAuthn.test.ts +265 -0
  299. package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +5 -0
  300. package/Tests/Utils/Dashboard/Components/DashboardVMwareListComponents.test.ts +548 -0
  301. package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +17 -3
  302. package/Tests/Utils/LabelRuleImportExport.test.ts +583 -0
  303. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  304. package/Tests/Utils/Monitor/MonitorTemplateSyncUtil.test.ts +590 -0
  305. package/Tests/Utils/RequestFailedDetails.test.ts +325 -0
  306. package/Tests/Utils/Telemetry/CloudInstanceIdentity.test.ts +255 -0
  307. package/Tests/Utils/Telemetry/EntityRelationship.test.ts +167 -0
  308. package/Tests/Utils/WebAuthnTestUtil.ts +79 -0
  309. package/Tests/__mocks__/simplewebauthn.js +33 -4
  310. package/Types/AI/CodeFixTaskContext.ts +122 -0
  311. package/Types/AI/CodeFixTaskType.ts +62 -0
  312. package/Types/Accounts/AccountsLanguage.ts +1 -0
  313. package/Types/AdminDashboard/AdminDashboardLanguage.ts +1 -0
  314. package/Types/Calendar/CalendarEvent.ts +16 -0
  315. package/Types/Cloud/CloudPlatform.ts +372 -0
  316. package/Types/CodeRepository/GitHubCommand.ts +69 -0
  317. package/Types/Dashboard/DashboardComponentType.ts +2 -0
  318. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  319. package/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.ts +23 -0
  320. package/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.ts +30 -0
  321. package/Types/Dashboard/DashboardLanguage.ts +1 -0
  322. package/Types/Dashboard/DashboardTemplates.ts +314 -0
  323. package/Types/Docs/DocsLanguage.ts +1 -0
  324. package/Types/Exception/EgressGuardException.ts +65 -0
  325. package/Types/Icon/IconProp.ts +1 -0
  326. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +36 -0
  327. package/Types/Monitor/MonitorCriteriaInstance.ts +1 -0
  328. package/Types/Monitor/MonitorStep.ts +78 -17
  329. package/Types/Monitor/MonitorStepMetricViewConfigUtil.ts +1 -0
  330. package/Types/Monitor/MonitorStepVMwareMonitor.ts +127 -0
  331. package/Types/Monitor/MonitorTemplateSyncField.ts +291 -0
  332. package/Types/Monitor/MonitorType.ts +24 -0
  333. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +33 -0
  334. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +2 -0
  335. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +3 -0
  336. package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +158 -0
  337. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +61 -0
  338. package/Types/Monitor/VMwareAlertTemplates.ts +1070 -0
  339. package/Types/Monitor/VMwareMetricCatalog.ts +914 -0
  340. package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +29 -0
  341. package/Types/OnCallDutyPolicy/UserOverrideUtil.ts +16 -0
  342. package/Types/Password.ts +84 -5
  343. package/Types/Permission.ts +265 -0
  344. package/Types/Probe/RequestFailedDetails.ts +7 -0
  345. package/Types/Runner/RunnerLiveStatus.ts +1 -1
  346. package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -0
  347. package/Types/StatusPage/StatusPageLanguage.ts +1 -0
  348. package/Types/Telemetry/EntityType.ts +21 -0
  349. package/Types/Telemetry/ServiceType.ts +1 -0
  350. package/Typings/Index.d.ts +63 -0
  351. package/UI/Components/Breadcrumbs/Breadcrumbs.tsx +2 -2
  352. package/UI/Components/Calendar/Calendar.css +78 -0
  353. package/UI/Components/Calendar/Calendar.tsx +28 -3
  354. package/UI/Components/Forms/BasicForm.tsx +44 -2
  355. package/UI/Components/Forms/Fields/ColorPicker.tsx +2 -1
  356. package/UI/Components/Forms/Fields/FormField.tsx +16 -3
  357. package/UI/Components/Forms/ModelForm.tsx +159 -5
  358. package/UI/Components/Forms/Types/Field.ts +8 -1
  359. package/UI/Components/Graphs/DayUptimeGraph.tsx +8 -10
  360. package/UI/Components/Icon/Icon.tsx +16 -0
  361. package/UI/Components/Input/Input.tsx +42 -7
  362. package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +441 -0
  363. package/UI/Components/LabelRule/LabelRuleTable.tsx +142 -0
  364. package/UI/Components/ModelTable/BaseModelTable.tsx +22 -5
  365. package/UI/Components/ModelTable/ModelTable.tsx +14 -6
  366. package/UI/Components/MonitorGraphs/Uptime.tsx +17 -27
  367. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +3 -1
  368. package/UI/Components/Tooltip/Tooltip.tsx +52 -6
  369. package/UI/Utils/DashboardStackingLayers.ts +85 -0
  370. package/UI/Utils/LabelRuleImportExport.ts +310 -0
  371. package/UI/Utils/ModelAPI/ModelAPI.ts +4 -3
  372. package/UI/Utils/TelemetryService.ts +4 -3
  373. package/UI/Utils/UseDashboardGridDnd.ts +4 -1
  374. package/UI/Utils/UserEmailRegistrationStatus.ts +33 -5
  375. package/UI/Utils/WebAuthn.ts +220 -0
  376. package/UI/esbuild-config.js +4 -0
  377. package/Utils/API.ts +34 -0
  378. package/Utils/Dashboard/Components/DashboardVMwareHostListComponent.ts +38 -0
  379. package/Utils/Dashboard/Components/DashboardVMwareResourceListShared.ts +70 -0
  380. package/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.ts +76 -0
  381. package/Utils/Dashboard/Components/Index.ts +16 -0
  382. package/Utils/LabelRuleImportExport.ts +496 -0
  383. package/Utils/Monitor/MonitorTemplateSyncUtil.ts +164 -0
  384. package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +8 -0
  385. package/Utils/Telemetry/CloudInstanceIdentity.ts +94 -0
  386. package/Utils/Telemetry/EntityKey.ts +19 -0
  387. package/Utils/Telemetry/EntityRelationship.ts +19 -0
  388. package/build/dist/Models/DatabaseModels/Alert.js +54 -0
  389. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  390. package/build/dist/Models/DatabaseModels/CloudResource.js +44 -7
  391. package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
  392. package/build/dist/Models/DatabaseModels/CodeRepository.js +87 -0
  393. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  394. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +60 -7
  395. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  396. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +287 -0
  397. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +1 -0
  398. package/build/dist/Models/DatabaseModels/Incident.js +54 -0
  399. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  400. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  401. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  402. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
  403. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  404. package/build/dist/Models/DatabaseModels/User.js +57 -4
  405. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  406. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +47 -2
  407. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -1
  408. package/build/dist/Models/DatabaseModels/UserWebAuthn.js +18 -0
  409. package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
  410. package/build/dist/Models/DatabaseModels/VMwareResource.js +1201 -0
  411. package/build/dist/Models/DatabaseModels/VMwareResource.js.map +1 -0
  412. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +1149 -0
  413. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -0
  414. package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js +648 -0
  415. package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js.map +1 -0
  416. package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +522 -0
  417. package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -0
  418. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +603 -0
  419. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -0
  420. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +503 -0
  421. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -0
  422. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +502 -0
  423. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -0
  424. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +22 -1
  425. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  426. package/build/dist/Server/API/AIAgentDataAPI.js +63 -3
  427. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  428. package/build/dist/Server/API/AIAgentGitHubAPI.js +363 -0
  429. package/build/dist/Server/API/AIAgentGitHubAPI.js.map +1 -0
  430. package/build/dist/Server/API/AIChatAPI.js +19 -1
  431. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  432. package/build/dist/Server/API/BillingAPI.js +22 -0
  433. package/build/dist/Server/API/BillingAPI.js.map +1 -1
  434. package/build/dist/Server/API/DashboardAPI.js +10 -0
  435. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  436. package/build/dist/Server/API/GitHubAPI.js +33 -5
  437. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  438. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +56 -0
  439. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -0
  440. package/build/dist/Server/API/UserWebAuthnAPI.js +17 -1
  441. package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
  442. package/build/dist/Server/API/VMwareResourceAPI.js +106 -0
  443. package/build/dist/Server/API/VMwareResourceAPI.js.map +1 -0
  444. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js +41 -0
  445. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js.map +1 -0
  446. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js +14 -0
  447. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js.map +1 -0
  448. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js +241 -0
  449. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js.map +1 -0
  450. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js +36 -0
  451. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js.map +1 -0
  452. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js +12 -0
  453. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js.map +1 -0
  454. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js +34 -0
  455. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js.map +1 -0
  456. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  457. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  458. package/build/dist/Server/Middleware/IdentityRateLimit.js +80 -0
  459. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
  460. package/build/dist/Server/Services/AIRunService.js +14 -1
  461. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  462. package/build/dist/Server/Services/BillingPaymentMethodService.js +71 -21
  463. package/build/dist/Server/Services/BillingPaymentMethodService.js.map +1 -1
  464. package/build/dist/Server/Services/BillingService.js +210 -22
  465. package/build/dist/Server/Services/BillingService.js.map +1 -1
  466. package/build/dist/Server/Services/CloudResourceInstanceService.js +66 -0
  467. package/build/dist/Server/Services/CloudResourceInstanceService.js.map +1 -1
  468. package/build/dist/Server/Services/ExceptionAggregationService.js +1 -0
  469. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  470. package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +9 -0
  471. package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +1 -0
  472. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +7 -0
  473. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -1
  474. package/build/dist/Server/Services/Index.js +16 -0
  475. package/build/dist/Server/Services/Index.js.map +1 -1
  476. package/build/dist/Server/Services/LogAggregationService.js +1 -0
  477. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  478. package/build/dist/Server/Services/MetricAggregationService.js +1 -0
  479. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  480. package/build/dist/Server/Services/MobilePasskeyLoginService.js +137 -0
  481. package/build/dist/Server/Services/MobilePasskeyLoginService.js.map +1 -0
  482. package/build/dist/Server/Services/MonitorService.js +34 -1
  483. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  484. package/build/dist/Server/Services/MonitorTemplateService.js +64 -26
  485. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  486. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +124 -1
  487. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  488. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +142 -2
  489. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  490. package/build/dist/Server/Services/OpenTelemetryIngestService.js +28 -13
  491. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  492. package/build/dist/Server/Services/PayAsYouGoBillingService.js +297 -0
  493. package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -0
  494. package/build/dist/Server/Services/ProjectService.js +38 -2
  495. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  496. package/build/dist/Server/Services/ServerlessFunctionInstanceService.js +66 -0
  497. package/build/dist/Server/Services/ServerlessFunctionInstanceService.js.map +1 -1
  498. package/build/dist/Server/Services/TeamMemberService.js +85 -28
  499. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  500. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +61 -10
  501. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  502. package/build/dist/Server/Services/TelemetryUsageBillingService.js +62 -5
  503. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  504. package/build/dist/Server/Services/TraceAggregationService.js +5 -4
  505. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  506. package/build/dist/Server/Services/UserWebAuthnService.js +345 -113
  507. package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
  508. package/build/dist/Server/Services/VMwareResourceService.js +395 -0
  509. package/build/dist/Server/Services/VMwareResourceService.js.map +1 -0
  510. package/build/dist/Server/Services/VMwareVCenterFeedService.js +89 -0
  511. package/build/dist/Server/Services/VMwareVCenterFeedService.js.map +1 -0
  512. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +197 -0
  513. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -0
  514. package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js +13 -0
  515. package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js.map +1 -0
  516. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +214 -0
  517. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -0
  518. package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js +13 -0
  519. package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js.map +1 -0
  520. package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js +129 -0
  521. package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js.map +1 -0
  522. package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js +122 -0
  523. package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js.map +1 -0
  524. package/build/dist/Server/Services/VMwareVCenterService.js +533 -0
  525. package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -0
  526. package/build/dist/Server/Services/WorkflowVariableService.js +169 -0
  527. package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
  528. package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js +12 -1
  529. package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js.map +1 -1
  530. package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js +25 -2
  531. package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js.map +1 -1
  532. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  533. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js +275 -0
  534. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js.map +1 -0
  535. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js +226 -0
  536. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js.map +1 -0
  537. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js +297 -0
  538. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js.map +1 -0
  539. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js +582 -0
  540. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js.map +1 -0
  541. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js +275 -0
  542. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js.map +1 -0
  543. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js +365 -0
  544. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js.map +1 -0
  545. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js +103 -0
  546. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js.map +1 -0
  547. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js +661 -0
  548. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js.map +1 -0
  549. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +113 -0
  550. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
  551. package/build/dist/Server/Utils/DataSource/EgressGuard.js +99 -15
  552. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  553. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +2 -0
  554. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  555. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +18 -0
  556. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
  557. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +31 -2
  558. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -1
  559. package/build/dist/Server/Utils/LogRedaction.js +2 -1
  560. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  561. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +1 -1
  562. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +219 -4
  563. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  564. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +12 -4
  565. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  566. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +5 -3
  567. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
  568. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +22 -9
  569. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
  570. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
  571. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  572. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +21 -0
  573. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  574. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +21 -6
  575. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  576. package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +3 -3
  577. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +9 -9
  578. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
  579. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +92 -71
  580. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
  581. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +428 -143
  582. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
  583. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +376 -0
  584. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -0
  585. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -0
  586. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  587. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
  588. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +136 -1
  589. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  590. package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js +933 -0
  591. package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js.map +1 -0
  592. package/build/dist/Types/AI/CodeFixTaskContext.js +40 -0
  593. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
  594. package/build/dist/Types/AI/CodeFixTaskType.js +57 -0
  595. package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -1
  596. package/build/dist/Types/Accounts/AccountsLanguage.js +1 -0
  597. package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
  598. package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +1 -0
  599. package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
  600. package/build/dist/Types/Cloud/CloudPlatform.js +277 -0
  601. package/build/dist/Types/Cloud/CloudPlatform.js.map +1 -0
  602. package/build/dist/Types/CodeRepository/GitHubCommand.js +52 -0
  603. package/build/dist/Types/CodeRepository/GitHubCommand.js.map +1 -0
  604. package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
  605. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  606. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  607. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  608. package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js +2 -0
  609. package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js.map +1 -0
  610. package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js +2 -0
  611. package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
  612. package/build/dist/Types/Dashboard/DashboardLanguage.js +1 -0
  613. package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
  614. package/build/dist/Types/Dashboard/DashboardTemplates.js +286 -0
  615. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  616. package/build/dist/Types/Docs/DocsLanguage.js +1 -0
  617. package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
  618. package/build/dist/Types/Exception/EgressGuardException.js +59 -0
  619. package/build/dist/Types/Exception/EgressGuardException.js.map +1 -0
  620. package/build/dist/Types/Icon/IconProp.js +1 -0
  621. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  622. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +1 -0
  623. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  624. package/build/dist/Types/Monitor/MonitorStep.js +61 -18
  625. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  626. package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js +1 -0
  627. package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js.map +1 -1
  628. package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js +71 -0
  629. package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js.map +1 -0
  630. package/build/dist/Types/Monitor/MonitorTemplateSyncField.js +211 -0
  631. package/build/dist/Types/Monitor/MonitorTemplateSyncField.js.map +1 -0
  632. package/build/dist/Types/Monitor/MonitorType.js +23 -0
  633. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  634. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +28 -0
  635. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  636. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +1 -0
  637. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  638. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +2 -0
  639. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  640. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +120 -0
  641. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -1
  642. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +60 -0
  643. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
  644. package/build/dist/Types/Monitor/VMwareAlertTemplates.js +775 -0
  645. package/build/dist/Types/Monitor/VMwareAlertTemplates.js.map +1 -0
  646. package/build/dist/Types/Monitor/VMwareMetricCatalog.js +799 -0
  647. package/build/dist/Types/Monitor/VMwareMetricCatalog.js.map +1 -0
  648. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +25 -0
  649. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
  650. package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js +5 -0
  651. package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js.map +1 -1
  652. package/build/dist/Types/Password.js +63 -5
  653. package/build/dist/Types/Password.js.map +1 -1
  654. package/build/dist/Types/Permission.js +234 -0
  655. package/build/dist/Types/Permission.js.map +1 -1
  656. package/build/dist/Types/Probe/RequestFailedDetails.js +7 -0
  657. package/build/dist/Types/Probe/RequestFailedDetails.js.map +1 -1
  658. package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +2 -0
  659. package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +1 -0
  660. package/build/dist/Types/StatusPage/StatusPageLanguage.js +1 -0
  661. package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
  662. package/build/dist/Types/Telemetry/EntityType.js +21 -0
  663. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  664. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  665. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  666. package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js +2 -2
  667. package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  668. package/build/dist/UI/Components/Calendar/Calendar.js +24 -4
  669. package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
  670. package/build/dist/UI/Components/Forms/BasicForm.js +28 -3
  671. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  672. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +1 -1
  673. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
  674. package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -3
  675. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  676. package/build/dist/UI/Components/Forms/ModelForm.js +89 -6
  677. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  678. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +5 -6
  679. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  680. package/build/dist/UI/Components/Icon/Icon.js +14 -0
  681. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  682. package/build/dist/UI/Components/Input/Input.js +37 -8
  683. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  684. package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +228 -0
  685. package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -0
  686. package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +102 -0
  687. package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -0
  688. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +15 -2
  689. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  690. package/build/dist/UI/Components/ModelTable/ModelTable.js +13 -5
  691. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  692. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +14 -15
  693. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  694. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +2 -0
  695. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  696. package/build/dist/UI/Components/Tooltip/Tooltip.js +33 -4
  697. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  698. package/build/dist/UI/Utils/DashboardStackingLayers.js +44 -0
  699. package/build/dist/UI/Utils/DashboardStackingLayers.js.map +1 -0
  700. package/build/dist/UI/Utils/LabelRuleImportExport.js +195 -0
  701. package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -0
  702. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +4 -4
  703. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  704. package/build/dist/UI/Utils/TelemetryService.js +3 -2
  705. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  706. package/build/dist/UI/Utils/UseDashboardGridDnd.js +2 -1
  707. package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -1
  708. package/build/dist/UI/Utils/UserEmailRegistrationStatus.js +21 -4
  709. package/build/dist/UI/Utils/UserEmailRegistrationStatus.js.map +1 -1
  710. package/build/dist/UI/Utils/WebAuthn.js +121 -0
  711. package/build/dist/UI/Utils/WebAuthn.js.map +1 -0
  712. package/build/dist/Utils/API.js +29 -0
  713. package/build/dist/Utils/API.js.map +1 -1
  714. package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js +33 -0
  715. package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js.map +1 -0
  716. package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js +54 -0
  717. package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js.map +1 -0
  718. package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js +60 -0
  719. package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
  720. package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
  721. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  722. package/build/dist/Utils/LabelRuleImportExport.js +356 -0
  723. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -0
  724. package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js +110 -0
  725. package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js.map +1 -0
  726. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +6 -0
  727. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -1
  728. package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js +88 -0
  729. package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js.map +1 -0
  730. package/build/dist/Utils/Telemetry/EntityKey.js +15 -0
  731. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  732. package/build/dist/Utils/Telemetry/EntityRelationship.js +13 -0
  733. package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
  734. package/package.json +1 -1
@@ -113,6 +113,7 @@ import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCom
113
113
  import PositiveNumber from "../../Types/PositiveNumber";
114
114
  import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
115
115
  import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
116
+ import { IsNull, UpdateResult } from "typeorm";
116
117
 
117
118
  export interface CurrentPlan {
118
119
  plan: PlanType | null;
@@ -2704,6 +2705,41 @@ These are no longer recorded against the project and have to be cancelled by han
2704
2705
  }
2705
2706
  }
2706
2707
 
2708
+ /**
2709
+ * Record seat synchronization state only for the subscription that was read.
2710
+ * The normal update path locates rows first and then writes by id, which can
2711
+ * overwrite a replacement subscription's state during a concurrent plan change.
2712
+ */
2713
+ @CaptureSpan()
2714
+ public async updateSubscriptionSeats(data: {
2715
+ projectId: ObjectID;
2716
+ subscriptionId: string;
2717
+ planId: string;
2718
+ seats: number | null;
2719
+ }): Promise<number> {
2720
+ const result: UpdateResult = await this.getRepository().update(
2721
+ {
2722
+ _id: data.projectId.toString(),
2723
+ paymentProviderSubscriptionId: data.subscriptionId,
2724
+ paymentProviderPlanId: data.planId,
2725
+ deletedAt: IsNull(),
2726
+ },
2727
+ {
2728
+ paymentProviderSubscriptionSeats:
2729
+ data.seats === null
2730
+ ? () => {
2731
+ return "NULL";
2732
+ }
2733
+ : data.seats,
2734
+ version: () => {
2735
+ return '"version" + 1';
2736
+ },
2737
+ },
2738
+ );
2739
+
2740
+ return result.affected || 0;
2741
+ }
2742
+
2707
2743
  @CaptureSpan()
2708
2744
  public async reactiveSubscription(projectId: ObjectID): Promise<void> {
2709
2745
  logger.debug("Reactivating subscription for project " + projectId, {
@@ -2744,7 +2780,15 @@ These are no longer recorded against the project and have to be cancelled by han
2744
2780
  );
2745
2781
  }
2746
2782
 
2747
- if (!project.paymentProviderSubscriptionSeats) {
2783
+ /*
2784
+ * A pending seat synchronization leaves the acknowledged count empty.
2785
+ * Reactivation can still use the memberships already stored in the project.
2786
+ */
2787
+ const seats: number =
2788
+ project.paymentProviderSubscriptionSeats ??
2789
+ (await TeamMemberService.getUniqueTeamMemberCountInProject(projectId));
2790
+
2791
+ if (!seats) {
2748
2792
  throw new BadDataException(
2749
2793
  "Payment Provider subscription seats not found",
2750
2794
  );
@@ -2792,7 +2836,7 @@ These are no longer recorded against the project and have to be cancelled by han
2792
2836
  meteredSubscriptionId: project.paymentProviderMeteredSubscriptionId,
2793
2837
  serverMeteredPlans: AllMeteredPlans,
2794
2838
  newPlan: subscriptionPlan,
2795
- quantity: project.paymentProviderSubscriptionSeats,
2839
+ quantity: seats,
2796
2840
  isYearly: SubscriptionPlan.isYearlyPlan(project.paymentProviderPlanId),
2797
2841
  endTrialAt: endTrialAt,
2798
2842
  });
@@ -2,6 +2,8 @@ import DatabaseService from "./DatabaseService";
2
2
  import Model from "../../Models/DatabaseModels/ServerlessFunctionInstance";
3
3
  import ObjectID from "../../Types/ObjectID";
4
4
  import OneUptimeDate from "../../Types/Date";
5
+ import LIMIT_MAX from "../../Types/Database/LimitMax";
6
+ import QueryHelper from "../Types/Database/QueryHelper";
5
7
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
6
8
  import logger from "../Utils/Logger";
7
9
 
@@ -58,6 +60,75 @@ export class Service extends DatabaseService<Model> {
58
60
  );
59
61
  }
60
62
  }
63
+
64
+ /**
65
+ * Hard-delete every instance of one serverless function whose
66
+ * lastSeenAt is older than olderThan. Returns the number of rows
67
+ * removed.
68
+ *
69
+ * faas.instance identifies a warm execution environment, and FaaS
70
+ * platforms recycle those constantly — every cold start mints a new
71
+ * one and nothing ever reports the old one as retired; it simply
72
+ * stops sending. Without this sweep the Instances tab counts every
73
+ * environment that ever ran the function. Called only by the
74
+ * Serverless:CleanupStaleResources worker, which anchors olderThan
75
+ * to the parent function's own lastSeenAt (see the job header for
76
+ * why wall-clock now is the wrong anchor).
77
+ */
78
+ @CaptureSpan()
79
+ public async deleteStaleForFunction(data: {
80
+ serverlessFunctionId: ObjectID;
81
+ olderThan: Date;
82
+ }): Promise<number> {
83
+ return await this.deleteBy({
84
+ query: {
85
+ serverlessFunctionId: data.serverlessFunctionId,
86
+ lastSeenAt: QueryHelper.lessThan(data.olderThan),
87
+ },
88
+ limit: LIMIT_MAX,
89
+ skip: 0,
90
+ props: { isRoot: true },
91
+ });
92
+ }
93
+
94
+ /**
95
+ * Helper for the cleanup worker: ingest-cadence aware cutoff.
96
+ * 3x the 5-minute OTel ingest maintenance fence by default. Tune via
97
+ * SERVERLESS_INSTANCE_STALE_MINUTES (min 10).
98
+ */
99
+ public getStaleThresholdDate(nowOverride?: Date): Date {
100
+ const minutes: number = this.getStaleThresholdMinutes();
101
+ return OneUptimeDate.addRemoveMinutes(
102
+ nowOverride || OneUptimeDate.getCurrentDate(),
103
+ -minutes,
104
+ );
105
+ }
106
+
107
+ /*
108
+ * Threshold must stay well above the 5-minute OTel ingest maintenance
109
+ * fence (MAINTENANCE_FENCE_TTL_SECONDS in OtelIngestBaseService).
110
+ * recordInstance sits behind that fence per (function, instance), so
111
+ * a live instance's lastSeenAt is legitimately up to ~5 minutes stale
112
+ * during continuous telemetry; a threshold at or below the fence
113
+ * would prune live instances between refreshes. 15 minutes gives 3x
114
+ * headroom and matches ServerlessFunctionService.markDisconnectedFunctions.
115
+ * The floor is 10 minutes, not the fence's nominal 5: the fence key is
116
+ * armed with jitter (300-375 s) behind a 30-second negative memo, so a
117
+ * live row's lastSeenAt can legitimately be close to 7 minutes old. A
118
+ * floor at the nominal TTL would let an override prune live rows.
119
+ * Anything unparseable falls back to the default.
120
+ */
121
+ public getStaleThresholdMinutes(): number {
122
+ const raw: string | undefined =
123
+ process.env["SERVERLESS_INSTANCE_STALE_MINUTES"];
124
+ if (raw) {
125
+ const parsed: number = parseInt(raw, 10);
126
+ if (!isNaN(parsed) && parsed >= 10) {
127
+ return parsed;
128
+ }
129
+ }
130
+ return 15;
131
+ }
61
132
  }
62
133
 
63
134
  export default new Service();
@@ -1,5 +1,6 @@
1
1
  import DatabaseConfig from "../DatabaseConfig";
2
2
  import { IsBillingEnabled } from "../EnvironmentConfig";
3
+ import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
3
4
  import CreateBy from "../Types/Database/CreateBy";
4
5
  import DeleteBy from "../Types/Database/DeleteBy";
5
6
  import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
@@ -174,18 +175,26 @@ export class TeamMemberService extends DatabaseService<TeamMember> {
174
175
  id: createBy.data.projectId!,
175
176
  select: {
176
177
  seatLimit: true,
177
- paymentProviderSubscriptionSeats: true,
178
178
  },
179
179
  props: {
180
180
  isRoot: true,
181
181
  },
182
182
  });
183
183
 
184
+ /*
185
+ * Billing can lag after a provider outage. Admission limits must use
186
+ * persisted memberships, including pending invitations.
187
+ */
188
+ const numberOfMembers: number =
189
+ project &&
190
+ (project.seatLimit || createBy.props.currentPlan === PlanType.Free)
191
+ ? await this.getUniqueTeamMemberCountInProject(projectId)
192
+ : 0;
193
+
184
194
  if (
185
195
  project &&
186
196
  project.seatLimit &&
187
- project.paymentProviderSubscriptionSeats &&
188
- project.paymentProviderSubscriptionSeats >= project.seatLimit
197
+ numberOfMembers >= project.seatLimit
189
198
  ) {
190
199
  throw new BadDataException(Errors.TeamMemberService.LIMIT_REACHED);
191
200
  }
@@ -193,8 +202,7 @@ export class TeamMemberService extends DatabaseService<TeamMember> {
193
202
  if (
194
203
  createBy.props.currentPlan === PlanType.Free &&
195
204
  project &&
196
- project.paymentProviderSubscriptionSeats &&
197
- project.paymentProviderSubscriptionSeats >= 1
205
+ numberOfMembers >= 1
198
206
  ) {
199
207
  throw new BadDataException(
200
208
  Errors.TeamMemberService.LIMIT_REACHED_FOR_FREE_PLAN,
@@ -535,7 +543,7 @@ export class TeamMemberService extends DatabaseService<TeamMember> {
535
543
  onCreate.createBy.data.projectId!,
536
544
  );
537
545
 
538
- await this.updateSubscriptionSeatsByUniqueTeamMembersInProject(
546
+ await this.syncSubscriptionSeatsAfterMembershipChange(
539
547
  onCreate.createBy.data.projectId!,
540
548
  );
541
549
 
@@ -726,9 +734,7 @@ export class TeamMemberService extends DatabaseService<TeamMember> {
726
734
 
727
735
  for (const item of onDelete.carryForward as Array<TeamMember>) {
728
736
  await this.refreshTokens(item.userId!, item.projectId!);
729
- await this.updateSubscriptionSeatsByUniqueTeamMembersInProject(
730
- item.projectId!,
731
- );
737
+ await this.syncSubscriptionSeatsAfterMembershipChange(item.projectId!);
732
738
 
733
739
  /*
734
740
  * Before the notification settings go: the "removed from on-call
@@ -1269,6 +1275,27 @@ export class TeamMemberService extends DatabaseService<TeamMember> {
1269
1275
  });
1270
1276
  }
1271
1277
 
1278
+ /**
1279
+ * The membership write has already committed. A payment-provider outage
1280
+ * must not report a failed invite or prevent removal cleanup. The scheduled
1281
+ * seat reconciliation retries projects whose acknowledged count is stale.
1282
+ */
1283
+ @CaptureSpan()
1284
+ private async syncSubscriptionSeatsAfterMembershipChange(
1285
+ projectId: ObjectID,
1286
+ ): Promise<void> {
1287
+ try {
1288
+ await this.updateSubscriptionSeatsByUniqueTeamMembersInProject(projectId);
1289
+ } catch (err) {
1290
+ logger.error(
1291
+ err as Error,
1292
+ {
1293
+ projectId: projectId.toString(),
1294
+ } as LogAttributes,
1295
+ );
1296
+ }
1297
+ }
1298
+
1272
1299
  @CaptureSpan()
1273
1300
  public async updateSubscriptionSeatsByUniqueTeamMembersInProject(
1274
1301
  projectId: ObjectID,
@@ -1277,47 +1304,80 @@ export class TeamMemberService extends DatabaseService<TeamMember> {
1277
1304
  return;
1278
1305
  }
1279
1306
 
1280
- const numberOfMembers: number =
1281
- await this.getUniqueTeamMemberCountInProject(projectId);
1282
- const project: Project | null = await ProjectService.findOneById({
1283
- id: projectId,
1284
- select: {
1285
- paymentProviderSubscriptionId: true,
1286
- paymentProviderPlanId: true,
1287
- },
1288
- props: {
1289
- isRoot: true,
1290
- },
1307
+ /*
1308
+ * Serialize the request and worker paths, then read the latest count so
1309
+ * an older synchronization cannot overwrite a newer seat quantity.
1310
+ */
1311
+ const mutex: SemaphoreMutex = await Semaphore.lock({
1312
+ key: projectId.toString(),
1313
+ namespace: "team-member-subscription-seats",
1314
+ lockTimeout: 60000,
1315
+ acquireTimeout: 5000,
1291
1316
  });
1292
1317
 
1293
- if (
1294
- project &&
1295
- project.paymentProviderSubscriptionId &&
1296
- project?.paymentProviderPlanId
1297
- ) {
1318
+ try {
1319
+ const project: Project | null = await ProjectService.findOneById({
1320
+ id: projectId,
1321
+ select: {
1322
+ paymentProviderSubscriptionId: true,
1323
+ paymentProviderPlanId: true,
1324
+ paymentProviderSubscriptionSeats: true,
1325
+ },
1326
+ props: {
1327
+ isRoot: true,
1328
+ },
1329
+ });
1330
+
1331
+ if (
1332
+ !project?.paymentProviderSubscriptionId ||
1333
+ !project.paymentProviderPlanId
1334
+ ) {
1335
+ return;
1336
+ }
1337
+
1298
1338
  const plan: SubscriptionPlan | undefined =
1299
- SubscriptionPlan.getSubscriptionPlanById(
1300
- project?.paymentProviderPlanId,
1301
- );
1339
+ SubscriptionPlan.getSubscriptionPlanById(project.paymentProviderPlanId);
1302
1340
 
1303
1341
  if (!plan) {
1304
1342
  return;
1305
1343
  }
1306
1344
 
1345
+ const numberOfMembers: number =
1346
+ await this.getUniqueTeamMemberCountInProject(projectId);
1347
+
1348
+ if (project.paymentProviderSubscriptionSeats === numberOfMembers) {
1349
+ return;
1350
+ }
1351
+
1352
+ /*
1353
+ * The provider may apply the quantity and then time out. Persist that
1354
+ * uncertainty before calling it, so even a later return to the previous
1355
+ * member count cannot make reconciliation mistake the seats for synced.
1356
+ */
1357
+ const invalidated: number = await ProjectService.updateSubscriptionSeats({
1358
+ projectId: projectId,
1359
+ subscriptionId: project.paymentProviderSubscriptionId,
1360
+ planId: project.paymentProviderPlanId,
1361
+ seats: null,
1362
+ });
1363
+
1364
+ if (invalidated === 0) {
1365
+ return;
1366
+ }
1367
+
1307
1368
  await BillingService.changeQuantity(
1308
1369
  project.paymentProviderSubscriptionId,
1309
1370
  numberOfMembers,
1310
1371
  );
1311
1372
 
1312
- await ProjectService.updateOneById({
1313
- id: projectId,
1314
- data: {
1315
- paymentProviderSubscriptionSeats: numberOfMembers,
1316
- },
1317
- props: {
1318
- isRoot: true,
1319
- },
1373
+ await ProjectService.updateSubscriptionSeats({
1374
+ projectId: projectId,
1375
+ subscriptionId: project.paymentProviderSubscriptionId,
1376
+ planId: project.paymentProviderPlanId,
1377
+ seats: numberOfMembers,
1320
1378
  });
1379
+ } finally {
1380
+ await Semaphore.release(mutex);
1321
1381
  }
1322
1382
  }
1323
1383
 
@@ -4,6 +4,8 @@ import Query from "../Types/Database/Query";
4
4
  import UpdateBy from "../Types/Database/UpdateBy";
5
5
  import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
6
6
  import DatabaseService from "./DatabaseService";
7
+ import PayAsYouGoBillingService from "./PayAsYouGoBillingService";
8
+ import { IsBillingEnabled } from "../EnvironmentConfig";
7
9
  import ObjectID from "../../Types/ObjectID";
8
10
  import OneUptimeDate from "../../Types/Date";
9
11
  import Model from "../../Models/DatabaseModels/TelemetryIngestionKey";
@@ -189,6 +191,19 @@ export class Service extends DatabaseService<Model> {
189
191
  data["expiresAt"] = this.validateExpiresAt(data["expiresAt"]);
190
192
  }
191
193
 
194
+ if (IsBillingEnabled) {
195
+ const projectId: ObjectID | undefined =
196
+ createBy.props.tenantId || createBy.data.projectId;
197
+
198
+ if (!projectId) {
199
+ throw new BadDataException(
200
+ "ProjectId required to create a telemetry ingestion key.",
201
+ );
202
+ }
203
+
204
+ await PayAsYouGoBillingService.requirePayAsYouGo(projectId);
205
+ }
206
+
192
207
  return { createBy, carryForward: null };
193
208
  }
194
209
 
@@ -252,9 +267,8 @@ export class Service extends DatabaseService<Model> {
252
267
  /*
253
268
  * Only an EMPTY new list needs to know what kind of keys are being
254
269
  * updated, so the extra read is paid for only then. A non-empty list is
255
- * valid on both key types, and the overwhelmingly common update (rename,
256
- * toggle isEnabled, set an expiry) does not touch allowedOrigins at all
257
- * and therefore reads nothing extra.
270
+ * valid on both key types. Renaming, disabling, or setting an expiry
271
+ * does not need this lookup; re-enabling has a separate billing check.
258
272
  */
259
273
  if (allowedOrigins.length === 0) {
260
274
  await this.assertNoBrowserKeyIsBeingUpdated(updateBy);
@@ -279,6 +293,33 @@ export class Service extends DatabaseService<Model> {
279
293
  data["expiresAt"] = this.validateExpiresAt(data["expiresAt"]);
280
294
  }
281
295
 
296
+ if (IsBillingEnabled && data["isEnabled"] === true) {
297
+ const keys: Array<Model> = await this.findBy({
298
+ query:
299
+ !updateBy.props.isRoot && updateBy.props.tenantId
300
+ ? { ...updateBy.query, projectId: updateBy.props.tenantId }
301
+ : updateBy.query,
302
+ select: { projectId: true },
303
+ limit: updateBy.limit,
304
+ skip: updateBy.skip,
305
+ props: { isRoot: true, ignoreHooks: true },
306
+ });
307
+ const checkedProjects: Set<string> = new Set<string>();
308
+
309
+ for (const key of keys) {
310
+ if (!key.projectId) {
311
+ throw new BadDataException(
312
+ "ProjectId required to enable a telemetry ingestion key.",
313
+ );
314
+ }
315
+
316
+ if (!checkedProjects.has(key.projectId.toString())) {
317
+ await PayAsYouGoBillingService.requirePayAsYouGo(key.projectId);
318
+ checkedProjects.add(key.projectId.toString());
319
+ }
320
+ }
321
+ }
322
+
282
323
  /*
283
324
  * Same reasoning as onBeforeDelete. The cached policy now carries the kill
284
325
  * switch, the expiry, the origin allowlist and the rate limit, so almost
@@ -296,9 +337,9 @@ export class Service extends DatabaseService<Model> {
296
337
  * Postgres. Returns null for unknown or malformed tokens (also cached, for a
297
338
  * shorter TTL).
298
339
  *
299
- * A returned policy is NOT a decision: a disabled or expired key still
300
- * resolves. Enforcement belongs to the caller, which knows which ingest
301
- * surface it is and can therefore say *why* a request was refused.
340
+ * A disabled or expired key still resolves so the caller can explain that
341
+ * refusal. An otherwise usable key requires payment setup here, so every
342
+ * transport and validation endpoint shares the same billing admission rule.
302
343
  */
303
344
  @CaptureSpan()
304
345
  public async getPolicyFromSecretKey(
@@ -316,7 +357,9 @@ export class Service extends DatabaseService<Model> {
316
357
  const cached: CachedIngestionKeyPolicy | null | undefined =
317
358
  this.policyCache.get(cacheKey);
318
359
  if (cached !== undefined) {
319
- return cached === null ? null : this.hydratePolicy(cached);
360
+ return cached === null
361
+ ? null
362
+ : this.requireBillingForPolicy(this.hydratePolicy(cached));
320
363
  }
321
364
 
322
365
  let secretKeyObjectId: ObjectID;
@@ -358,14 +401,41 @@ export class Service extends DatabaseService<Model> {
358
401
  );
359
402
 
360
403
  this.policyCache.set(cacheKey, snapshot, POSITIVE_TTL_MS);
361
- return this.hydratePolicy(snapshot);
404
+ return this.requireBillingForPolicy(this.hydratePolicy(snapshot));
405
+ }
406
+
407
+ private async requireBillingForPolicy(
408
+ policy: TelemetryIngestionKeyPolicy,
409
+ ): Promise<TelemetryIngestionKeyPolicy> {
410
+ if (
411
+ policy.isEnabled &&
412
+ (!policy.expiresAt || policy.expiresAt.getTime() > Date.now())
413
+ ) {
414
+ /*
415
+ * Check even on key-cache hits. Billing eligibility has its own bounded
416
+ * cache, and must not remain enabled for the lifetime of a live key.
417
+ *
418
+ * This runs for every ingested batch, so it is the one caller that may
419
+ * answer from a recently cached denial rather than re-reading the
420
+ * payment provider. Without that, an unpaid project ingesting telemetry
421
+ * turns every batch into provider reads and holds the whole Stripe
422
+ * account at its rate limit. The client retries, so a few seconds
423
+ * between adding a card and ingest being admitted costs nothing - and
424
+ * BillingPaymentMethodService clears the entry as soon as the card is
425
+ * read, which is what the billing page does right after one is added.
426
+ */
427
+ await PayAsYouGoBillingService.requirePayAsYouGo(policy.projectId, {
428
+ allowStaleDenial: true,
429
+ });
430
+ }
431
+
432
+ return policy;
362
433
  }
363
434
 
364
435
  /**
365
436
  * Resolve an ingestion token to its projectId.
366
437
  *
367
- * Unchanged in signature and in meaning: it is a LOOKUP, and it answers
368
- * "which project owns this token" for any token that exists. It deliberately
438
+ * Shares billing admission with getPolicyFromSecretKey. It deliberately
369
439
  * does NOT enforce the kill switch or the expiry.
370
440
  *
371
441
  * That restraint is the point. Several callers (gRPC, MQTT, session replay,
@@ -30,6 +30,7 @@ import DockerHostService from "./DockerHostService";
30
30
  import PodmanHostService from "./PodmanHostService";
31
31
  import KubernetesClusterService from "./KubernetesClusterService";
32
32
  import ProxmoxClusterService from "./ProxmoxClusterService";
33
+ import VMwareVCenterService from "./VMwareVCenterService";
33
34
  import CephClusterService from "./CephClusterService";
34
35
  import IoTFleetService from "./IoTFleetService";
35
36
  import Host from "../../Models/DatabaseModels/Host";
@@ -37,6 +38,7 @@ import DockerHost from "../../Models/DatabaseModels/DockerHost";
37
38
  import PodmanHost from "../../Models/DatabaseModels/PodmanHost";
38
39
  import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
39
40
  import ProxmoxCluster from "../../Models/DatabaseModels/ProxmoxCluster";
41
+ import VMwareVCenter from "../../Models/DatabaseModels/VMwareVCenter";
40
42
  import IoTFleet from "../../Models/DatabaseModels/IoTFleet";
41
43
  import CephCluster from "../../Models/DatabaseModels/CephCluster";
42
44
  import ServiceType from "../../Types/Telemetry/ServiceType";
@@ -52,6 +54,10 @@ import {
52
54
  IsBillingEnabled,
53
55
  } from "../EnvironmentConfig";
54
56
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
57
+ import QueryHelper from "../Types/Database/QueryHelper";
58
+ import PayAsYouGoBillingService, {
59
+ LiveUsageAuthorization,
60
+ } from "./PayAsYouGoBillingService";
55
61
 
56
62
  export class Service extends DatabaseService<Model> {
57
63
  public constructor() {
@@ -71,6 +77,7 @@ export class Service extends DatabaseService<Model> {
71
77
  projectId: data.projectId,
72
78
  productType: data.productType,
73
79
  isReportedToBillingProvider: false,
80
+ totalCostInUSD: QueryHelper.greaterThan(0),
74
81
  },
75
82
  skip: 0,
76
83
  limit: LIMIT_MAX, /// because a project can have MANY telemetry services.
@@ -84,20 +91,77 @@ export class Service extends DatabaseService<Model> {
84
91
  });
85
92
  }
86
93
 
94
+ public async waiveUnreportedUsageBilling(data: {
95
+ projectId: ObjectID;
96
+ productType: ProductType;
97
+ before?: Date;
98
+ }): Promise<void> {
99
+ let updated: number;
100
+ do {
101
+ updated = await this.updateBy({
102
+ query: {
103
+ projectId: data.projectId,
104
+ productType: data.productType,
105
+ isReportedToBillingProvider: false,
106
+ totalCostInUSD: QueryHelper.greaterThan(0),
107
+ ...(data.before
108
+ ? { createdAt: QueryHelper.lessThan(data.before) }
109
+ : {}),
110
+ },
111
+ data: { totalCostInUSD: new Decimal(0) },
112
+ skip: 0,
113
+ limit: LIMIT_MAX,
114
+ props: { isRoot: true, ignoreHooks: true },
115
+ });
116
+ } while (updated === LIMIT_MAX);
117
+ }
118
+
87
119
  @CaptureSpan()
88
120
  public async stageTelemetryUsageForProject(data: {
89
121
  projectId: ObjectID;
90
122
  productType: ProductType;
91
123
  usageDate?: Date;
124
+ liveAuthorization?: LiveUsageAuthorization | undefined;
92
125
  }): Promise<void> {
93
126
  if (!IsBillingEnabled) {
94
127
  return;
95
128
  }
96
129
 
130
+ /*
131
+ * A report that has just authorized this project live passes that answer
132
+ * down instead of having it read again. Anything else - a direct call, a
133
+ * token made for another project, one that has aged out - checks live,
134
+ * exactly as every staging call did before.
135
+ */
136
+ if (
137
+ !PayAsYouGoBillingService.isLiveAuthorizationFor(
138
+ data.liveAuthorization,
139
+ data.projectId,
140
+ ) &&
141
+ !(await PayAsYouGoBillingService.canUsePayAsYouGo(data.projectId, {
142
+ useCache: false,
143
+ }))
144
+ ) {
145
+ await this.waiveUnreportedUsageBilling(data);
146
+ return;
147
+ }
148
+
97
149
  const usageDate: Date = data.usageDate
98
150
  ? OneUptimeDate.fromString(data.usageDate)
99
151
  : OneUptimeDate.addRemoveDays(OneUptimeDate.getCurrentDate(), -1);
100
152
 
153
+ const billingStartsAt: Date | undefined =
154
+ await PayAsYouGoBillingService.getTelemetryBillingStartDate(
155
+ data.projectId,
156
+ );
157
+ if (
158
+ billingStartsAt &&
159
+ OneUptimeDate.getStartOfDay(usageDate, "UTC").getTime() <
160
+ billingStartsAt.getTime()
161
+ ) {
162
+ return;
163
+ }
164
+
101
165
  const averageRowSizeInBytes: number = this.getAverageRowSizeForProduct(
102
166
  data.productType,
103
167
  );
@@ -138,9 +202,9 @@ export class Service extends DatabaseService<Model> {
138
202
  return;
139
203
  }
140
204
 
141
- const usageDayString: string = OneUptimeDate.getDateString(usageDate);
142
- const startOfDay: Date = OneUptimeDate.getStartOfDay(usageDate);
143
- const endOfDay: Date = OneUptimeDate.getEndOfDay(usageDate);
205
+ const usageDayString: string = this.getUsageDayString(usageDate);
206
+ const startOfDay: Date = OneUptimeDate.getStartOfDay(usageDate, "UTC");
207
+ const endOfDay: Date = OneUptimeDate.getEndOfDay(usageDate, "UTC");
144
208
 
145
209
  /*
146
210
  * Enumerate usage from ClickHouse by (primaryEntityId, primaryEntityType) in a
@@ -390,7 +454,8 @@ export class Service extends DatabaseService<Model> {
390
454
  /*
391
455
  * Map of resourceId -> retainTelemetryDataForDays for every resource in
392
456
  * the project that can own telemetry (Service, Host, DockerHost,
393
- * KubernetesCluster, ProxmoxCluster, CephCluster). Used to scale billed
457
+ * KubernetesCluster, ProxmoxCluster, VMwareVCenter, CephCluster). Used to
458
+ * scale billed
394
459
  * cost by the actual retention applied to each resource's telemetry.
395
460
  * Resources without an override (and the unattributed bucket) fall back
396
461
  * to the project default.
@@ -499,6 +564,23 @@ export class Service extends DatabaseService<Model> {
499
564
  }
500
565
  }
501
566
 
567
+ const vmwareVCenters: Array<VMwareVCenter> =
568
+ await VMwareVCenterService.findBy({
569
+ query: { projectId: projectId },
570
+ select: { _id: true, retainTelemetryDataForDays: true },
571
+ skip: 0,
572
+ limit: LIMIT_MAX,
573
+ props: { isRoot: true },
574
+ });
575
+ for (const vmwareVCenter of vmwareVCenters) {
576
+ if (vmwareVCenter.id && vmwareVCenter.retainTelemetryDataForDays) {
577
+ retentionByServiceId.set(
578
+ vmwareVCenter.id.toString(),
579
+ vmwareVCenter.retainTelemetryDataForDays,
580
+ );
581
+ }
582
+ }
583
+
502
584
  const cephClusters: Array<CephCluster> = await CephClusterService.findBy({
503
585
  query: { projectId: projectId },
504
586
  select: { _id: true, retainTelemetryDataForDays: true },
@@ -580,7 +662,7 @@ export class Service extends DatabaseService<Model> {
580
662
  ? OneUptimeDate.fromString(data.usageDate)
581
663
  : OneUptimeDate.getCurrentDate();
582
664
 
583
- const usageDayString: string = OneUptimeDate.getDateString(usageDate);
665
+ const usageDayString: string = this.getUsageDayString(usageDate);
584
666
 
585
667
  const totalCostOfThisOperationInUSD: number =
586
668
  serverMeteredPlan.getTotalCostInUSD({
@@ -662,6 +744,14 @@ export class Service extends DatabaseService<Model> {
662
744
  }
663
745
  }
664
746
 
747
+ private getUsageDayString(usageDate: Date): string {
748
+ return OneUptimeDate.getDateAsCustomFormattedStringInTimezone({
749
+ date: usageDate,
750
+ timezone: "UTC",
751
+ format: "MMM DD, YYYY",
752
+ });
753
+ }
754
+
665
755
  private getAverageRowSizeForProduct(productType: ProductType): number {
666
756
  const fallbackSize: number = 1024;
667
757