@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
@@ -0,0 +1,188 @@
1
+ import type { FindOperator } from "../../../Server/Types/Database/QueryHelper";
2
+ import CloudResourceInstanceService from "../../../Server/Services/CloudResourceInstanceService";
3
+ import LIMIT_MAX from "../../../Types/Database/LimitMax";
4
+ import OneUptimeDate from "../../../Types/Date";
5
+ import ObjectID from "../../../Types/ObjectID";
6
+
7
+ /*
8
+ * Stale-instance pruning for the cloud environment inventory.
9
+ *
10
+ * CloudResourceInstance rows are created by ingest and refreshed behind
11
+ * the 5-minute maintenance fence, but nothing ever removed them — the
12
+ * Instances tab and the overview's "running tasks" count grew forever.
13
+ * The Cloud:CleanupStaleResources worker now ages them out through the
14
+ * three helpers pinned here:
15
+ *
16
+ * - deleteStaleForResource issues ONE hard delete scoped to the given
17
+ * environment AND a strictly-less-than lastSeenAt cutoff, as root
18
+ * (the worker has no tenant context), and returns the row count. A
19
+ * missing environment predicate would prune every environment in
20
+ * the table; a missing cutoff would prune live tasks.
21
+ * - getStaleThresholdMinutes parses CLOUD_INSTANCE_STALE_MINUTES with
22
+ * a 15-minute default and a 5-minute floor. The floor is the ingest
23
+ * maintenance fence TTL: a threshold at or below it would delete a
24
+ * live task between two fence-gated refreshes.
25
+ * - getStaleThresholdDate subtracts that threshold from the anchor
26
+ * the worker passes (the environment's own lastSeenAt), falling
27
+ * back to the wall clock only when no anchor is given. The worker
28
+ * relies on the anchor winning over the clock: that is what freezes
29
+ * the prune cutoff during a collector outage.
30
+ */
31
+
32
+ const ENV_KEY: string = "CLOUD_INSTANCE_STALE_MINUTES";
33
+ const RESOURCE_ID: ObjectID = ObjectID.generate();
34
+ const CUTOFF: Date = new Date("2026-09-08T10:00:00.000Z");
35
+ const MINUTE_MS: number = 60 * 1000;
36
+
37
+ interface DeleteByArgs {
38
+ query: {
39
+ cloudResourceId?: ObjectID;
40
+ lastSeenAt?: FindOperator<Date>;
41
+ };
42
+ limit: number;
43
+ skip: number;
44
+ props: { isRoot?: boolean };
45
+ }
46
+
47
+ let savedEnv: string | undefined;
48
+
49
+ beforeEach(() => {
50
+ savedEnv = process.env[ENV_KEY];
51
+ delete process.env[ENV_KEY];
52
+ });
53
+
54
+ afterEach(() => {
55
+ if (savedEnv === undefined) {
56
+ delete process.env[ENV_KEY];
57
+ } else {
58
+ process.env[ENV_KEY] = savedEnv;
59
+ }
60
+ jest.restoreAllMocks();
61
+ });
62
+
63
+ describe("CloudResourceInstanceService.deleteStaleForResource", () => {
64
+ test("issues one root hard-delete scoped to the environment with a lastSeenAt < cutoff predicate", async () => {
65
+ const deleteBy: jest.SpyInstance = jest
66
+ .spyOn(CloudResourceInstanceService, "deleteBy")
67
+ .mockResolvedValue(4);
68
+
69
+ const deleted: number =
70
+ await CloudResourceInstanceService.deleteStaleForResource({
71
+ cloudResourceId: RESOURCE_ID,
72
+ olderThan: CUTOFF,
73
+ });
74
+
75
+ expect(deleted).toBe(4);
76
+ expect(deleteBy).toHaveBeenCalledTimes(1);
77
+
78
+ const args: DeleteByArgs = deleteBy.mock
79
+ .calls[0]![0] as unknown as DeleteByArgs;
80
+
81
+ // Scoped to exactly this environment — never a table-wide sweep.
82
+ expect(args.query.cloudResourceId).toBe(RESOURCE_ID);
83
+
84
+ // Strictly older than the cutoff: a row refreshed AT the cutoff survives.
85
+ const filter: FindOperator<Date> = args.query.lastSeenAt!;
86
+ expect(filter.getSql!("lastSeenAt")).toMatch(/lastSeenAt < :/);
87
+ expect(Object.values(filter.objectLiteralParameters!)).toEqual([CUTOFF]);
88
+
89
+ // The worker has no tenant context, and one tick must cover the whole table.
90
+ expect(args.props.isRoot).toBe(true);
91
+ expect(args.limit).toBe(LIMIT_MAX);
92
+ expect(args.skip).toBe(0);
93
+ });
94
+
95
+ test("reports zero when nothing was stale", async () => {
96
+ jest.spyOn(CloudResourceInstanceService, "deleteBy").mockResolvedValue(0);
97
+
98
+ const deleted: number =
99
+ await CloudResourceInstanceService.deleteStaleForResource({
100
+ cloudResourceId: RESOURCE_ID,
101
+ olderThan: CUTOFF,
102
+ });
103
+
104
+ expect(deleted).toBe(0);
105
+ });
106
+
107
+ test("lets a delete failure propagate so the worker can log it per environment and continue", async () => {
108
+ jest
109
+ .spyOn(CloudResourceInstanceService, "deleteBy")
110
+ .mockRejectedValue(new Error("db connection reset"));
111
+
112
+ await expect(
113
+ CloudResourceInstanceService.deleteStaleForResource({
114
+ cloudResourceId: RESOURCE_ID,
115
+ olderThan: CUTOFF,
116
+ }),
117
+ ).rejects.toThrow("db connection reset");
118
+ });
119
+ });
120
+
121
+ describe("CloudResourceInstanceService.getStaleThresholdMinutes", () => {
122
+ test("defaults to 15 minutes — 3x the 5-minute ingest maintenance fence", () => {
123
+ expect(CloudResourceInstanceService.getStaleThresholdMinutes()).toBe(15);
124
+ });
125
+
126
+ test("honours an override above the floor", () => {
127
+ process.env[ENV_KEY] = "30";
128
+ expect(CloudResourceInstanceService.getStaleThresholdMinutes()).toBe(30);
129
+ });
130
+
131
+ test("accepts the 10-minute floor itself", () => {
132
+ process.env[ENV_KEY] = "10";
133
+ expect(CloudResourceInstanceService.getStaleThresholdMinutes()).toBe(10);
134
+ });
135
+
136
+ test("ignores an override below the floor — it would prune live tasks", () => {
137
+ /*
138
+ * 5 is the fence's nominal TTL, but the armed key carries jitter and a
139
+ * negative memo sits in front of it, so a live row can be ~7 minutes
140
+ * old; anything under 10 falls back to the default.
141
+ */
142
+ for (const below of ["9", "5", "3"]) {
143
+ process.env[ENV_KEY] = below;
144
+ expect(CloudResourceInstanceService.getStaleThresholdMinutes()).toBe(15);
145
+ }
146
+ });
147
+
148
+ test("ignores an unparseable or empty override", () => {
149
+ process.env[ENV_KEY] = "garbage";
150
+ expect(CloudResourceInstanceService.getStaleThresholdMinutes()).toBe(15);
151
+ process.env[ENV_KEY] = "";
152
+ expect(CloudResourceInstanceService.getStaleThresholdMinutes()).toBe(15);
153
+ });
154
+ });
155
+
156
+ describe("CloudResourceInstanceService.getStaleThresholdDate", () => {
157
+ test("subtracts the threshold from the anchor the worker passes, not from the wall clock", () => {
158
+ const anchor: Date = new Date("2026-09-08T09:00:00.000Z");
159
+ // A wall clock years away from the anchor proves the anchor wins.
160
+ jest
161
+ .spyOn(OneUptimeDate, "getCurrentDate")
162
+ .mockReturnValue(new Date("2030-01-01T00:00:00.000Z"));
163
+
164
+ const cutoff: Date =
165
+ CloudResourceInstanceService.getStaleThresholdDate(anchor);
166
+
167
+ expect(cutoff.getTime()).toBe(anchor.getTime() - 15 * MINUTE_MS);
168
+ });
169
+
170
+ test("falls back to the wall clock when no anchor is given", () => {
171
+ const now: Date = new Date("2026-09-08T10:00:00.000Z");
172
+ jest.spyOn(OneUptimeDate, "getCurrentDate").mockReturnValue(now);
173
+
174
+ const cutoff: Date = CloudResourceInstanceService.getStaleThresholdDate();
175
+
176
+ expect(cutoff.getTime()).toBe(now.getTime() - 15 * MINUTE_MS);
177
+ });
178
+
179
+ test("applies the env override to the anchored cutoff", () => {
180
+ process.env[ENV_KEY] = "30";
181
+ const anchor: Date = new Date("2026-09-08T09:00:00.000Z");
182
+
183
+ const cutoff: Date =
184
+ CloudResourceInstanceService.getStaleThresholdDate(anchor);
185
+
186
+ expect(cutoff.getTime()).toBe(anchor.getTime() - 30 * MINUTE_MS);
187
+ });
188
+ });
@@ -3,6 +3,7 @@ import NetworkDeviceDiscoveryScanService, {
3
3
  } from "../../../Server/Services/NetworkDeviceDiscoveryScanService";
4
4
  import DatabaseService from "../../../Server/Services/DatabaseService";
5
5
  import NetworkDeviceDiscoveryScan from "../../../Models/DatabaseModels/NetworkDeviceDiscoveryScan";
6
+ import { DISCOVERY_SCAN_STARTED_MESSAGE } from "../../../Utils/NetworkDiscovery/DiscoveryScanStatus";
6
7
  import {
7
8
  afterEach,
8
9
  beforeEach,
@@ -15,7 +16,7 @@ import {
15
16
  /*
16
17
  * The /probe-ingest/probe/discovery-scan/list route hands the requesting
17
18
  * probe its pending subnet scans and claims them (status "In Progress" +
18
- * startedAt, and a cleared statusMessage) via
19
+ * startedAt, and a current-run statusMessage) via
19
20
  * DatabaseService.updateColumnsByIdWithoutHooks — one raw
20
21
  * parameterized UPDATE that skips ALL on-update hooks: workflow HTTP
21
22
  * triggers, audit-log inserts, realtime events, service
@@ -74,6 +75,17 @@ const PROGRESS_WRITE_COLUMNS: Array<string> = [
74
75
  "autoImportProcessedAt",
75
76
  ];
76
77
 
78
+ /*
79
+ * The stale-scan reaper also writes atomically so a new progress report cannot
80
+ * race with its decision to fail a silent run. It skips the same service hooks.
81
+ */
82
+ const REAPER_WRITE_COLUMNS: Array<string> = [
83
+ "status",
84
+ "statusMessage",
85
+ "completedAt",
86
+ "nextScanAt",
87
+ ];
88
+
77
89
  describe("discovery-scan claim hookless write safety preconditions", () => {
78
90
  describe("NetworkDeviceDiscoveryScan model (claim write in DiscoveryScan.ts)", () => {
79
91
  /*
@@ -115,6 +127,7 @@ describe("discovery-scan claim hookless write safety preconditions", () => {
115
127
  "statusMessage",
116
128
  // ...and every column the running-sweep progress write stamps.
117
129
  ...PROGRESS_WRITE_COLUMNS,
130
+ ...REAPER_WRITE_COLUMNS,
118
131
  ];
119
132
  for (const column of fastPathColumns) {
120
133
  expect(scan.isTableColumn(column)).toBe(true);
@@ -219,6 +232,7 @@ describe("discovery-scan claim hookless write safety preconditions", () => {
219
232
  * skipping it.
220
233
  */
221
234
  ...PROGRESS_WRITE_COLUMNS,
235
+ ...REAPER_WRITE_COLUMNS,
222
236
  ];
223
237
 
224
238
  for (const column of claimWriteColumns) {
@@ -324,7 +338,7 @@ describe("discovery-scan claim hookless write safety preconditions", () => {
324
338
  data: {
325
339
  status: "In Progress",
326
340
  startedAt: new Date(0),
327
- statusMessage: null,
341
+ statusMessage: DISCOVERY_SCAN_STARTED_MESSAGE,
328
342
  },
329
343
  props: { isRoot: true },
330
344
  limit: 1,
@@ -0,0 +1,153 @@
1
+ import GoogleSecOpsConnection from "../../../Models/DatabaseModels/GoogleSecOpsConnection";
2
+ import GoogleSecOpsConnectionRun from "../../../Models/DatabaseModels/GoogleSecOpsConnectionRun";
3
+ import GoogleSecOpsConnectionService from "../../../Server/Services/GoogleSecOpsConnectionService";
4
+ import GoogleSecOpsClient from "../../../Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient";
5
+ import Permission from "../../../Types/Permission";
6
+ import { afterEach, describe, expect, jest, test } from "@jest/globals";
7
+
8
+ interface ConnectionHooks {
9
+ onBeforeCreate: (data: unknown) => Promise<unknown>;
10
+ onBeforeUpdate: (data: unknown) => Promise<unknown>;
11
+ }
12
+
13
+ const hooks: ConnectionHooks =
14
+ GoogleSecOpsConnectionService as unknown as ConnectionHooks;
15
+
16
+ afterEach(() => {
17
+ jest.restoreAllMocks();
18
+ });
19
+
20
+ describe("Google SecOps diagnostics access boundaries", () => {
21
+ test("run history is tenant scoped and cannot be created, changed or deleted through CRUD", () => {
22
+ const run: GoogleSecOpsConnectionRun = new GoogleSecOpsConnectionRun();
23
+ expect(run.getTenantColumn()).toBe("projectId");
24
+ expect(run.getCrudApiPath()?.toString()).toBe(
25
+ "/google-secops-connection-run",
26
+ );
27
+ expect(run.createRecordPermissions).toEqual([]);
28
+ expect(run.updateRecordPermissions).toEqual([]);
29
+ expect(run.deleteRecordPermissions).toEqual([]);
30
+ expect(run.readRecordPermissions).toEqual([
31
+ Permission.ProjectOwner,
32
+ Permission.ProjectAdmin,
33
+ Permission.SecurityAdmin,
34
+ Permission.SecurityMember,
35
+ Permission.SecurityViewer,
36
+ ]);
37
+ expect(run.readRecordPermissions).not.toContain(Permission.Public);
38
+ });
39
+
40
+ test.each([
41
+ "projectId",
42
+ "googleSecOpsConnectionId",
43
+ "requestedByUserId",
44
+ "type",
45
+ "status",
46
+ "request",
47
+ "result",
48
+ "error",
49
+ "startedAt",
50
+ "completedAt",
51
+ ])(
52
+ "run field %s is readable by security viewers and writable only internally",
53
+ (field: string) => {
54
+ const control: ReturnType<
55
+ GoogleSecOpsConnection["getColumnAccessControlFor"]
56
+ > = new GoogleSecOpsConnectionRun().getColumnAccessControlFor(field);
57
+ expect(control?.create).toEqual([]);
58
+ expect(control?.update).toEqual([]);
59
+ expect(control?.read).toContain(Permission.SecurityViewer);
60
+ },
61
+ );
62
+
63
+ test.each(["lastSuccessfulPollAt", "lastEventIngestedAt", "lastPollResult"])(
64
+ "clients cannot forge the connection's %s",
65
+ (field: string) => {
66
+ const control: ReturnType<
67
+ GoogleSecOpsConnection["getColumnAccessControlFor"]
68
+ > = new GoogleSecOpsConnection().getColumnAccessControlFor(field);
69
+ expect(control?.create).toEqual([]);
70
+ expect(control?.update).toEqual([]);
71
+ expect(control?.read).toContain(Permission.SecurityMember);
72
+ },
73
+ );
74
+
75
+ test("only connector administrators can change the detection scope", () => {
76
+ const control: ReturnType<
77
+ GoogleSecOpsConnection["getColumnAccessControlFor"]
78
+ > = new GoogleSecOpsConnection().getColumnAccessControlFor(
79
+ "includeNonAlertingDetections",
80
+ );
81
+ expect(control?.update).toEqual([
82
+ Permission.ProjectOwner,
83
+ Permission.ProjectAdmin,
84
+ Permission.SecurityAdmin,
85
+ ]);
86
+ expect(control?.create).toEqual(control?.update);
87
+ expect(control?.read).toContain(Permission.SecurityViewer);
88
+ });
89
+
90
+ test("diagnostics do not make the service account readable or add it to run history", () => {
91
+ const connection: GoogleSecOpsConnection = new GoogleSecOpsConnection();
92
+ expect(
93
+ connection.getColumnAccessControlFor("serviceAccountJson")?.read,
94
+ ).toEqual([]);
95
+ expect(Object.keys(new GoogleSecOpsConnectionRun())).not.toContain(
96
+ "serviceAccountJson",
97
+ );
98
+ });
99
+ });
100
+
101
+ describe("Google SecOps detection scope validation", () => {
102
+ test.each([true, false, undefined])(
103
+ "accepts scope %s on update",
104
+ async (value: boolean | undefined) => {
105
+ await expect(
106
+ hooks.onBeforeUpdate({ data: { includeNonAlertingDetections: value } }),
107
+ ).resolves.toBeDefined();
108
+ },
109
+ );
110
+
111
+ test.each([null, "true", "false", "", 0, 1, [], {}])(
112
+ "rejects non-boolean scope %p on update",
113
+ async (value: unknown) => {
114
+ await expect(
115
+ hooks.onBeforeUpdate({ data: { includeNonAlertingDetections: value } }),
116
+ ).rejects.toThrow("must be true or false");
117
+ },
118
+ );
119
+
120
+ test.each([true, false])(
121
+ "accepts scope %s when creating a connection",
122
+ async (value: boolean) => {
123
+ jest
124
+ .spyOn(GoogleSecOpsClient, "parseServiceAccountJson")
125
+ .mockReturnValue({
126
+ clientEmail: "test@example.com",
127
+ privateKey: "test",
128
+ tokenUri: "https://oauth2.googleapis.com/token",
129
+ });
130
+ await expect(
131
+ hooks.onBeforeCreate({
132
+ data: {
133
+ serviceAccountJson: "{}",
134
+ includeNonAlertingDetections: value,
135
+ },
136
+ }),
137
+ ).resolves.toBeDefined();
138
+ },
139
+ );
140
+
141
+ test("rejects invalid scope on create before processing credentials", async () => {
142
+ jest.spyOn(GoogleSecOpsClient, "parseServiceAccountJson");
143
+ await expect(
144
+ hooks.onBeforeCreate({
145
+ data: {
146
+ serviceAccountJson: "{}",
147
+ includeNonAlertingDetections: "false",
148
+ },
149
+ }),
150
+ ).rejects.toThrow("must be true or false");
151
+ expect(GoogleSecOpsClient.parseServiceAccountJson).not.toHaveBeenCalled();
152
+ });
153
+ });
@@ -8,6 +8,7 @@ import IoTFleetService from "../../../Server/Services/IoTFleetService";
8
8
  import KubernetesClusterService from "../../../Server/Services/KubernetesClusterService";
9
9
  import PodmanHostService from "../../../Server/Services/PodmanHostService";
10
10
  import ProxmoxClusterService from "../../../Server/Services/ProxmoxClusterService";
11
+ import VMwareVCenterService from "../../../Server/Services/VMwareVCenterService";
11
12
  import RumApplicationService from "../../../Server/Services/RumApplicationService";
12
13
  import ServerlessFunctionService from "../../../Server/Services/ServerlessFunctionService";
13
14
  import CephCluster from "../../../Models/DatabaseModels/CephCluster";
@@ -20,6 +21,7 @@ import IoTFleet from "../../../Models/DatabaseModels/IoTFleet";
20
21
  import KubernetesCluster from "../../../Models/DatabaseModels/KubernetesCluster";
21
22
  import PodmanHost from "../../../Models/DatabaseModels/PodmanHost";
22
23
  import ProxmoxCluster from "../../../Models/DatabaseModels/ProxmoxCluster";
24
+ import VMwareVCenter from "../../../Models/DatabaseModels/VMwareVCenter";
23
25
  import RumApplication from "../../../Models/DatabaseModels/RumApplication";
24
26
  import ServerlessFunction from "../../../Models/DatabaseModels/ServerlessFunction";
25
27
  import LogDropFilter from "../../../Models/DatabaseModels/LogDropFilter";
@@ -200,6 +202,17 @@ const CLAMP_CASES: Array<ClampCase> = [
200
202
  model: new ProxmoxCluster(),
201
203
  columns: ["pveVersion", "agentVersion"],
202
204
  },
205
+ {
206
+ /*
207
+ * The vcenter receiver does not report the vSphere version, so
208
+ * agentVersion is the only collector-supplied string this heartbeat
209
+ * can write.
210
+ */
211
+ name: "VMwareVCenterService",
212
+ service: VMwareVCenterService,
213
+ model: new VMwareVCenter(),
214
+ columns: ["agentVersion"],
215
+ },
203
216
  {
204
217
  name: "IoTFleetService",
205
218
  service: IoTFleetService,
@@ -168,6 +168,11 @@ describe("promoted entities still become rows", () => {
168
168
  EntityType.ProxmoxCluster,
169
169
  EntityType.CephCluster,
170
170
  EntityType.DockerSwarmCluster,
171
+ EntityType.VMwareVCenter,
172
+ EntityType.VMwareCluster,
173
+ EntityType.VMwareHost,
174
+ EntityType.VMwareVirtualMachine,
175
+ EntityType.VMwareDatastore,
171
176
  ])("%s is created as a discovered row", async (entityType: EntityType) => {
172
177
  await reconcile([entity(entityType)]);
173
178
 
@@ -7,6 +7,7 @@ import KubernetesContainer from "../../../Models/DatabaseModels/KubernetesContai
7
7
  import KubernetesResource from "../../../Models/DatabaseModels/KubernetesResource";
8
8
  import PodmanResource from "../../../Models/DatabaseModels/PodmanResource";
9
9
  import ProxmoxResource from "../../../Models/DatabaseModels/ProxmoxResource";
10
+ import VMwareResource from "../../../Models/DatabaseModels/VMwareResource";
10
11
  import CephResourceService from "../../../Server/Services/CephResourceService";
11
12
  import DockerResourceService from "../../../Server/Services/DockerResourceService";
12
13
  import DockerSwarmResourceService from "../../../Server/Services/DockerSwarmResourceService";
@@ -15,6 +16,7 @@ import KubernetesContainerService from "../../../Server/Services/KubernetesConta
15
16
  import KubernetesResourceService from "../../../Server/Services/KubernetesResourceService";
16
17
  import PodmanResourceService from "../../../Server/Services/PodmanResourceService";
17
18
  import ProxmoxResourceService from "../../../Server/Services/ProxmoxResourceService";
19
+ import VMwareResourceService from "../../../Server/Services/VMwareResourceService";
18
20
  import { getMaxLengthFromTableColumnType } from "../../../Types/Database/ColumnLength";
19
21
  import { TableColumnMetadata } from "../../../Types/Database/TableColumn";
20
22
  import ObjectID from "../../../Types/ObjectID";
@@ -373,6 +375,40 @@ const CASES: Array<UpsertCase> = [
373
375
  });
374
376
  },
375
377
  },
378
+ {
379
+ /*
380
+ * Ten bounded text columns: nine ShortText plus resourcePoolPath,
381
+ * which is LongText because vSphere inventory paths nest.
382
+ */
383
+ label: "VMwareResourceService.bulkUpsert",
384
+ service: VMwareResourceService,
385
+ model: new VMwareResource(),
386
+ boundedColumnCount: 10,
387
+ jsonPayloadColumnCount: 0,
388
+ invoke: async (): Promise<void> => {
389
+ await VMwareResourceService.bulkUpsert({
390
+ projectId: PROJECT_ID,
391
+ vmwareVCenterId: PARENT_ID,
392
+ resources: [
393
+ {
394
+ kind: OVERSIZED,
395
+ externalId: OVERSIZED,
396
+ name: OVERSIZED,
397
+ datacenterName: OVERSIZED,
398
+ clusterName: OVERSIZED,
399
+ hostName: OVERSIZED,
400
+ resourcePoolName: OVERSIZED,
401
+ resourcePoolPath: OVERSIZED,
402
+ virtualAppName: OVERSIZED,
403
+ vmInstanceUuid: OVERSIZED,
404
+ isTemplate: false,
405
+ isPoweredOn: true,
406
+ lastSeenAt: OBSERVED_AT,
407
+ },
408
+ ],
409
+ });
410
+ },
411
+ },
376
412
  {
377
413
  label: "CephResourceService.bulkUpsert",
378
414
  service: CephResourceService,
@@ -23,6 +23,9 @@ import PodmanResourceService, {
23
23
  import ProxmoxResourceService, {
24
24
  ParsedProxmoxResource,
25
25
  } from "../../../Server/Services/ProxmoxResourceService";
26
+ import VMwareResourceService, {
27
+ ParsedVMwareResource,
28
+ } from "../../../Server/Services/VMwareResourceService";
26
29
  import logger from "../../../Server/Utils/Logger";
27
30
  import ColumnLength from "../../../Types/Database/ColumnLength";
28
31
  import ObjectID from "../../../Types/ObjectID";
@@ -637,6 +640,104 @@ describe("ProxmoxResourceService — oversized values can't drop the chunk", ()
637
640
  });
638
641
  });
639
642
 
643
+ describe("VMwareResourceService — oversized values can't drop the chunk", () => {
644
+ function vmwareResource(
645
+ overrides: Partial<ParsedVMwareResource> = {},
646
+ ): ParsedVMwareResource {
647
+ return {
648
+ kind: "VirtualMachine",
649
+ externalId: "vm/5029f9a1-2b3c-4d5e-8f60-71a2b3c4d5e6",
650
+ name: "web-01",
651
+ datacenterName: "dc-east",
652
+ clusterName: "prod-cluster",
653
+ hostName: "esx-01.example.com",
654
+ resourcePoolName: "Resources",
655
+ resourcePoolPath: "/dc-east/host/prod-cluster/Resources",
656
+ virtualAppName: null,
657
+ vmInstanceUuid: "5029f9a1-2b3c-4d5e-8f60-71a2b3c4d5e6",
658
+ isTemplate: false,
659
+ isPoweredOn: true,
660
+ lastSeenAt: OBSERVED_AT,
661
+ ...overrides,
662
+ };
663
+ }
664
+
665
+ test("bulkUpsert clamps an oversized externalId and keeps its sibling row", async () => {
666
+ const query: jest.Mock = mockQueryRunner(VMwareResourceService);
667
+
668
+ await VMwareResourceService.bulkUpsert({
669
+ projectId: PROJECT_ID,
670
+ vmwareVCenterId: PARENT_ID,
671
+ resources: [vmwareResource({ externalId: OVERSIZED }), vmwareResource()],
672
+ });
673
+
674
+ expect(query).toHaveBeenCalledTimes(1);
675
+ const params: Array<unknown> = paramsOf(query);
676
+
677
+ expect(params).toContain(CLAMPED_TO_SHORT_TEXT);
678
+ expect(params).not.toContain(OVERSIZED);
679
+ expect(params).toContain("vm/5029f9a1-2b3c-4d5e-8f60-71a2b3c4d5e6");
680
+ expectNoParamExceedsLongText(params);
681
+ });
682
+
683
+ test("bulkUpsert clamps a deep resource-pool inventory path to LongText, not ShortText", async () => {
684
+ const query: jest.Mock = mockQueryRunner(VMwareResourceService);
685
+
686
+ await VMwareResourceService.bulkUpsert({
687
+ projectId: PROJECT_ID,
688
+ vmwareVCenterId: PARENT_ID,
689
+ resources: [vmwareResource({ resourcePoolPath: OVERSIZED })],
690
+ });
691
+
692
+ const params: Array<unknown> = paramsOf(query);
693
+ expect(params).toContain(CLAMPED_TO_LONG_TEXT);
694
+ expect(params).not.toContain(OVERSIZED);
695
+ expectNoParamExceedsLongText(params);
696
+ });
697
+
698
+ test("bulkUpdateLatestMetrics clamps identity the same way bulkUpsert does", async () => {
699
+ const query: jest.Mock = mockQueryRunner(VMwareResourceService);
700
+
701
+ await VMwareResourceService.bulkUpdateLatestMetrics({
702
+ projectId: PROJECT_ID,
703
+ vmwareVCenterId: PARENT_ID,
704
+ metrics: [
705
+ {
706
+ kind: "VirtualMachine",
707
+ externalId: OVERSIZED,
708
+ cpuPercent: null,
709
+ cpuMhz: null,
710
+ cpuCapacityMhz: null,
711
+ cpuEffectiveMhz: null,
712
+ memoryBytes: null,
713
+ maxMemoryBytes: null,
714
+ memoryEffectiveBytes: null,
715
+ memoryPercent: null,
716
+ diskBytes: null,
717
+ maxDiskBytes: null,
718
+ diskPercent: null,
719
+ cpuReadinessPercent: null,
720
+ memoryBalloonedBytes: null,
721
+ memorySwappedBytes: null,
722
+ hostCount: null,
723
+ effectiveHostCount: null,
724
+ poweredOnHostCount: null,
725
+ vmCount: null,
726
+ poweredOnVmCount: null,
727
+ vmTemplateCount: null,
728
+ datastoreCount: null,
729
+ clusterCount: null,
730
+ observedAt: OBSERVED_AT,
731
+ },
732
+ ],
733
+ });
734
+
735
+ const params: Array<unknown> = paramsOf(query);
736
+ expect(params).toContain(CLAMPED_TO_SHORT_TEXT);
737
+ expect(params).not.toContain(OVERSIZED);
738
+ });
739
+ });
740
+
640
741
  describe("CephResourceService — oversized values can't drop the chunk", () => {
641
742
  function cephResource(
642
743
  overrides: Partial<ParsedCephResource> = {},
@@ -1001,6 +1102,45 @@ describe("NULL stays NULL through the clamp", () => {
1001
1102
  }
1002
1103
  });
1003
1104
 
1105
+ test("VMwareResource passes its nullable identity columns through as null", async () => {
1106
+ const query: jest.Mock = mockQueryRunner(VMwareResourceService);
1107
+
1108
+ // A standalone ESXi host: no cluster, no VM-only attributes.
1109
+ await VMwareResourceService.bulkUpsert({
1110
+ projectId: PROJECT_ID,
1111
+ vmwareVCenterId: PARENT_ID,
1112
+ resources: [
1113
+ {
1114
+ kind: "Host",
1115
+ externalId: "host/dc-east/esx-01.example.com",
1116
+ name: "esx-01.example.com",
1117
+ datacenterName: "dc-east",
1118
+ clusterName: null,
1119
+ hostName: null,
1120
+ resourcePoolName: null,
1121
+ resourcePoolPath: null,
1122
+ virtualAppName: null,
1123
+ vmInstanceUuid: null,
1124
+ isTemplate: null,
1125
+ isPoweredOn: null,
1126
+ lastSeenAt: OBSERVED_AT,
1127
+ },
1128
+ ],
1129
+ });
1130
+
1131
+ const params: Array<unknown> = paramsOf(query);
1132
+ /*
1133
+ * Tuple: projectId, vmwareVCenterId, kind, externalId, name,
1134
+ * datacenterName, clusterName(6), hostName(7), resourcePoolName(8),
1135
+ * resourcePoolPath(9), virtualAppName(10), vmInstanceUuid(11),
1136
+ * isTemplate(12), isPoweredOn(13), lastSeenAt, version.
1137
+ */
1138
+ for (const index of [6, 7, 8, 9, 10, 11, 12, 13]) {
1139
+ expect(params[index]).toBeNull();
1140
+ }
1141
+ expect(params).not.toContain("");
1142
+ });
1143
+
1004
1144
  test("PodmanResource keeps a null imageName null rather than empty", async () => {
1005
1145
  const query: jest.Mock = mockQueryRunner(PodmanResourceService);
1006
1146
 
@@ -1216,6 +1356,17 @@ describe("an empty batch still short-circuits", () => {
1216
1356
  });
1217
1357
  },
1218
1358
  ],
1359
+ [
1360
+ "VMwareResourceService.bulkUpsert",
1361
+ VMwareResourceService,
1362
+ async (): Promise<void> => {
1363
+ await VMwareResourceService.bulkUpsert({
1364
+ projectId: PROJECT_ID,
1365
+ vmwareVCenterId: PARENT_ID,
1366
+ resources: [],
1367
+ });
1368
+ },
1369
+ ],
1219
1370
  [
1220
1371
  "CephResourceService.bulkUpsert",
1221
1372
  CephResourceService,