@oneuptime/common 12.0.34 → 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 (952) 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/GlobalConfig.ts +12 -12
  5. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +57 -7
  6. package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +263 -0
  7. package/Models/DatabaseModels/Incident.ts +55 -0
  8. package/Models/DatabaseModels/Index.ts +16 -0
  9. package/Models/DatabaseModels/InventoryItem.ts +44 -1
  10. package/Models/DatabaseModels/NetworkDevice.ts +126 -0
  11. package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
  12. package/Models/DatabaseModels/User.ts +51 -2
  13. package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +43 -2
  14. package/Models/DatabaseModels/UserWebAuthn.ts +17 -0
  15. package/Models/DatabaseModels/VMwareResource.ts +1149 -0
  16. package/Models/DatabaseModels/VMwareVCenter.ts +1122 -0
  17. package/Models/DatabaseModels/VMwareVCenterFeed.ts +625 -0
  18. package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +514 -0
  19. package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +596 -0
  20. package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +485 -0
  21. package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +484 -0
  22. package/Models/DatabaseModels/WorkflowVariable.ts +22 -1
  23. package/Server/API/AIAgentDataAPI.ts +79 -4
  24. package/Server/API/AIAgentGitHubAPI.ts +523 -0
  25. package/Server/API/AIChatAPI.ts +20 -1
  26. package/Server/API/BillingAPI.ts +33 -0
  27. package/Server/API/DashboardAPI.ts +10 -0
  28. package/Server/API/GitHubAPI.ts +47 -5
  29. package/Server/API/GoogleSecOpsConnectionAPI.ts +79 -0
  30. package/Server/API/UserWebAuthnAPI.ts +21 -1
  31. package/Server/API/VMwareResourceAPI.ts +143 -0
  32. package/Server/EnvironmentConfig.ts +47 -16
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.ts +25 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.ts +68 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.ts +26 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.ts +636 -0
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.ts +47 -0
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.ts +17 -0
  39. package/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.ts +83 -0
  40. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  41. package/Server/Infrastructure/Redis.ts +8 -8
  42. package/Server/Infrastructure/Status.ts +10 -4
  43. package/Server/Middleware/IdentityRateLimit.ts +101 -0
  44. package/Server/Services/AIRunService.ts +13 -0
  45. package/Server/Services/BillingPaymentMethodService.ts +99 -28
  46. package/Server/Services/BillingService.ts +287 -20
  47. package/Server/Services/CloudResourceInstanceService.ts +70 -0
  48. package/Server/Services/DatabaseService.ts +65 -13
  49. package/Server/Services/ExceptionAggregationService.ts +1 -0
  50. package/Server/Services/GoogleSecOpsConnectionRunService.ts +10 -0
  51. package/Server/Services/GoogleSecOpsConnectionService.ts +12 -0
  52. package/Server/Services/Index.ts +16 -0
  53. package/Server/Services/InventoryItemService.ts +31 -1
  54. package/Server/Services/LogAggregationService.ts +1 -0
  55. package/Server/Services/MetricAggregationService.ts +1 -0
  56. package/Server/Services/MobilePasskeyLoginService.ts +216 -0
  57. package/Server/Services/MonitorService.ts +51 -1
  58. package/Server/Services/MonitorTemplateService.ts +218 -35
  59. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +481 -42
  60. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +176 -2
  61. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +87 -2
  62. package/Server/Services/NetworkDeviceService.ts +69 -0
  63. package/Server/Services/OpenTelemetryIngestService.ts +17 -0
  64. package/Server/Services/PayAsYouGoBillingService.ts +446 -0
  65. package/Server/Services/ProjectService.ts +46 -2
  66. package/Server/Services/ServerlessFunctionInstanceService.ts +71 -0
  67. package/Server/Services/TeamMemberService.ts +96 -36
  68. package/Server/Services/TelemetryIngestionKeyService.ts +80 -10
  69. package/Server/Services/TelemetryUsageBillingService.ts +95 -5
  70. package/Server/Services/TraceAggregationService.ts +5 -4
  71. package/Server/Services/UserNotificationRuleService.ts +76 -25
  72. package/Server/Services/UserWebAuthnService.ts +592 -133
  73. package/Server/Services/VMwareResourceService.ts +648 -0
  74. package/Server/Services/VMwareVCenterFeedService.ts +99 -0
  75. package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +240 -0
  76. package/Server/Services/VMwareVCenterLabelRuleService.ts +14 -0
  77. package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +252 -0
  78. package/Server/Services/VMwareVCenterOwnerRuleService.ts +14 -0
  79. package/Server/Services/VMwareVCenterOwnerTeamService.ts +139 -0
  80. package/Server/Services/VMwareVCenterOwnerUserService.ts +133 -0
  81. package/Server/Services/VMwareVCenterService.ts +629 -0
  82. package/Server/Services/WorkflowVariableService.ts +203 -0
  83. package/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.ts +17 -0
  84. package/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.ts +31 -1
  85. package/Server/Types/Database/Permissions/ReadPermission.ts +45 -5
  86. package/Server/Types/Database/QueryUtil.ts +56 -0
  87. package/Server/Types/Markdown.ts +93 -1
  88. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +7 -0
  89. package/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.ts +341 -0
  90. package/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.ts +274 -0
  91. package/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.ts +375 -0
  92. package/Server/Utils/CodeRepository/GitHub/GitHubConversation.ts +846 -0
  93. package/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.ts +360 -0
  94. package/Server/Utils/CodeRepository/GitHub/GitHubRunReply.ts +421 -0
  95. package/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.ts +140 -0
  96. package/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.ts +906 -0
  97. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +225 -17
  98. package/Server/Utils/DataSource/EgressGuard.ts +160 -15
  99. package/Server/Utils/Database/TruncateColumnValue.ts +1 -1
  100. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +12 -1
  101. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +35 -2
  102. package/Server/Utils/EmailRollup/EmailRollupWriter.ts +44 -0
  103. package/Server/Utils/LogRedaction.ts +2 -1
  104. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +82 -35
  105. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +31 -5
  106. package/Server/Utils/Monitor/MonitorAlert.ts +1 -1
  107. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +502 -38
  108. package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +82 -9
  109. package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +16 -7
  110. package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +29 -17
  111. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +107 -48
  112. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +26 -4
  113. package/Server/Utils/Monitor/MonitorResourceContext.ts +5 -3
  114. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +14 -0
  115. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
  116. package/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.ts +158 -0
  117. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +27 -0
  118. package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
  119. package/Server/Utils/Monitor/SeriesResourceLinker.ts +28 -5
  120. package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +3 -3
  121. package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +14 -9
  122. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +116 -84
  123. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +594 -195
  124. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +466 -0
  125. package/Server/Utils/Telemetry/EntityRegistry.ts +16 -1
  126. package/Server/Utils/Telemetry/ResourceHeartbeat.ts +2 -1
  127. package/Server/Utils/Telemetry/TelemetryEntity.ts +264 -10
  128. package/Server/Utils/Telemetry/VMwareSnapshotScan.ts +1352 -0
  129. package/Tests/App/Accounts/LoginPasskey.test.tsx +529 -0
  130. package/Tests/App/Accounts/MobilePasskey.test.tsx +620 -0
  131. package/Tests/App/Accounts/PasswordRequirements.test.tsx +254 -0
  132. package/Tests/App/Accounts/RegisterPassword.test.tsx +553 -0
  133. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +32 -0
  134. package/Tests/App/Dashboard/AdoptedDeviceDrawer.test.tsx +374 -0
  135. package/Tests/App/Dashboard/AskAiAvailability.test.ts +224 -0
  136. package/Tests/App/Dashboard/AskAiDisabled.test.tsx +432 -0
  137. package/Tests/App/Dashboard/BackupCodes.test.tsx +414 -0
  138. package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +530 -0
  139. package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +195 -0
  140. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +199 -0
  141. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +198 -0
  142. package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +215 -0
  143. package/Tests/App/Dashboard/CloudFleetSummary.test.ts +183 -0
  144. package/Tests/App/Dashboard/CloudFleetSummaryComponent.test.tsx +248 -0
  145. package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +215 -0
  146. package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +3 -0
  147. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +441 -0
  148. package/Tests/App/Dashboard/DashboardLabelVariables.test.tsx +580 -0
  149. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +458 -0
  150. package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +438 -0
  151. package/Tests/App/Dashboard/DashboardToolbarPopupLayering.test.tsx +566 -0
  152. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +5 -2
  153. package/Tests/App/Dashboard/DeviceAttachmentCard.test.tsx +273 -0
  154. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +505 -0
  155. package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +376 -0
  156. package/Tests/App/Dashboard/DiscoveryScanLiveUpdates.test.tsx +642 -0
  157. package/Tests/App/Dashboard/DiscoveryScanProgress.test.tsx +267 -0
  158. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +69 -231
  159. package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +163 -0
  160. package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +244 -0
  161. package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +724 -0
  162. package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +401 -0
  163. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +232 -0
  164. package/Tests/App/Dashboard/InventoryItems.test.tsx +201 -0
  165. package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +798 -0
  166. package/Tests/App/Dashboard/MonitorTemplateSyncFields.test.tsx +539 -0
  167. package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +320 -0
  168. package/Tests/App/Dashboard/NetworkTopologyToolbar.test.tsx +275 -0
  169. package/Tests/App/Dashboard/OnCallCalendarFeedEmptyState.test.tsx +975 -0
  170. package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +63 -0
  171. package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +24 -7
  172. package/Tests/App/Dashboard/OnCallOverridePresentation.test.ts +496 -0
  173. package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +677 -0
  174. package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +31 -3
  175. package/Tests/App/Dashboard/PaidUsageConsent.test.tsx +180 -0
  176. package/Tests/App/Dashboard/PasskeySettings.test.tsx +1220 -0
  177. package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +176 -275
  178. package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +380 -233
  179. package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +3 -23
  180. package/Tests/App/Dashboard/ResourceFeed.test.tsx +1 -0
  181. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
  182. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +626 -0
  183. package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +348 -0
  184. package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +331 -0
  185. package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +260 -0
  186. package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +603 -0
  187. package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +324 -0
  188. package/Tests/App/Dashboard/VMwareDashboardWidgets.test.ts +573 -0
  189. package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
  190. package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +768 -0
  191. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +13 -4
  192. package/Tests/App/StatusPage/StatusPageOidcOrigin.test.tsx +223 -0
  193. package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +532 -40
  194. package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +19 -2
  195. package/Tests/Fixtures/MobilePasskeyUser.json +8 -0
  196. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +25 -6
  197. package/Tests/Models/DatabaseModels/VMwareModels.test.ts +1134 -0
  198. package/Tests/Models/InventoryItemStatus.test.ts +147 -0
  199. package/Tests/Models/NetworkDeviceMacAddressColumn.test.ts +294 -0
  200. package/Tests/Models/RunnerVersionLabel.test.ts +4 -2
  201. package/Tests/Server/API/AIChatProvidersAIEnabled.test.ts +259 -0
  202. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +31 -2
  203. package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +116 -0
  204. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +158 -1
  205. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +13 -2
  206. package/Tests/Server/API/GitHubWebhookSignature.test.ts +368 -0
  207. package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +248 -0
  208. package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +330 -0
  209. package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +172 -0
  210. package/Tests/Server/API/VMwareResourceAPI.test.ts +546 -0
  211. package/Tests/Server/EnvironmentConfigValkey.test.ts +227 -0
  212. package/Tests/Server/Infrastructure/Postgres/AddMacAddressToNetworkDeviceMigration.test.ts +365 -0
  213. package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +62 -23
  214. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupMetadataMigration.test.ts +85 -0
  215. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +34 -3
  216. package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +265 -0
  217. package/Tests/Server/Middleware/HttpMetricsMiddleware.test.ts +382 -0
  218. package/Tests/Server/Middleware/PasskeyRateLimit.test.ts +141 -0
  219. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +525 -0
  220. package/Tests/Server/Services/AutoImportRuleRearmRecentScans.test.ts +343 -0
  221. package/Tests/Server/Services/AutoImportRuleWriteRearmsScans.test.ts +381 -0
  222. package/Tests/Server/Services/BillingPaymentMethodServiceSync.test.ts +175 -0
  223. package/Tests/Server/Services/BillingService.test.ts +26 -11
  224. package/Tests/Server/Services/BillingServiceMeteredPaymentAuthorization.test.ts +245 -0
  225. package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +362 -0
  226. package/Tests/Server/Services/CloudResourceInstanceStalePrune.test.ts +188 -0
  227. package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +291 -56
  228. package/Tests/Server/Services/DatabaseServiceSortTiebreaker.test.ts +151 -0
  229. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +16 -2
  230. package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +153 -0
  231. package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +13 -0
  232. package/Tests/Server/Services/InventoryItemManualCreate.test.ts +105 -0
  233. package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +183 -0
  234. package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +36 -0
  235. package/Tests/Server/Services/InventoryUpsertTruncationGuard.test.ts +151 -0
  236. package/Tests/Server/Services/MobilePasskeyLoginIntegration.test.ts +231 -0
  237. package/Tests/Server/Services/MobilePasskeyLoginService.test.ts +315 -0
  238. package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +302 -0
  239. package/Tests/Server/Services/MonitorTemplateServiceCustomFieldSync.test.ts +502 -0
  240. package/Tests/Server/Services/MonitorTemplateServiceFieldSync.test.ts +994 -0
  241. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1133 -81
  242. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +22 -0
  243. package/Tests/Server/Services/NetworkDeviceDiscoveryScanRegistration.test.ts +520 -0
  244. package/Tests/Server/Services/NetworkDeviceMacAddressNormalization.test.ts +572 -0
  245. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
  246. package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +857 -0
  247. package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +379 -0
  248. package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +99 -1
  249. package/Tests/Server/Services/ProjectServiceSubscriptionSeats.test.ts +134 -0
  250. package/Tests/Server/Services/ResourceFeedServices.test.ts +3 -2
  251. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +32 -6
  252. package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +363 -175
  253. package/Tests/Server/Services/ServerlessFunctionInstanceStalePrune.test.ts +200 -0
  254. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +3 -0
  255. package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +762 -0
  256. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +3 -0
  257. package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +72 -0
  258. package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +17 -4
  259. package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +355 -0
  260. package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +41 -4
  261. package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +37 -0
  262. package/Tests/Server/Services/UserWebAuthnPasskeyIntegration.test.ts +401 -0
  263. package/Tests/Server/Services/UserWebAuthnPasskeyService.test.ts +769 -0
  264. package/Tests/Server/Services/UserWebAuthnUserVerification.test.ts +649 -0
  265. package/Tests/Server/Services/VMwareResourceService.test.ts +945 -0
  266. package/Tests/Server/Services/VMwareVCenterService.test.ts +722 -0
  267. package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +842 -0
  268. package/Tests/Server/TestingUtils/PasskeyHttpIntegration.ts +102 -0
  269. package/Tests/Server/TestingUtils/SecurityKey.ts +464 -0
  270. package/Tests/Server/TestingUtils/WebAuthnServiceMocks.ts +60 -0
  271. package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +573 -0
  272. package/Tests/Server/Types/Database/InventoryStatusPostgres.test.ts +368 -0
  273. package/Tests/Server/Types/Database/Permissions/ProjectCustomerSupportAccessColumn.test.ts +261 -0
  274. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +261 -14
  275. package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +95 -0
  276. package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroups.test.ts +169 -0
  277. package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroupsPostgres.test.ts +297 -0
  278. package/Tests/Server/Types/Markdown.test.ts +194 -1
  279. package/Tests/Server/Types/Workflow/Components/IncomingWebhookUtils.test.ts +279 -0
  280. package/Tests/Server/Types/Workflow/Components/TextToJson.test.ts +212 -0
  281. package/Tests/Server/Utils/CodeRepository/GitHubAgentTaskTrigger.test.ts +2101 -0
  282. package/Tests/Server/Utils/CodeRepository/GitHubCommandAuthorizer.test.ts +883 -0
  283. package/Tests/Server/Utils/CodeRepository/GitHubCommandParser.test.ts +1474 -0
  284. package/Tests/Server/Utils/CodeRepository/GitHubConversation.test.ts +1526 -0
  285. package/Tests/Server/Utils/CodeRepository/GitHubReplyComposer.test.ts +1389 -0
  286. package/Tests/Server/Utils/CodeRepository/GitHubRunReply.test.ts +1707 -0
  287. package/Tests/Server/Utils/CodeRepository/GitHubWebhookHandler.test.ts +2202 -0
  288. package/Tests/Server/Utils/CustomField/CustomFieldMappingRegistry.test.ts +436 -0
  289. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +559 -0
  290. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +896 -0
  291. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
  292. package/Tests/Server/Utils/EmailRollup/EmailRollupMetadataIntegration.test.ts +246 -0
  293. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +309 -4
  294. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +6 -0
  295. package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +185 -0
  296. package/Tests/Server/Utils/EventLoop.test.ts +359 -0
  297. package/Tests/Server/Utils/JsonWebToken.test.ts +30 -0
  298. package/Tests/Server/Utils/LogRedaction.test.ts +33 -0
  299. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +2 -1
  300. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +242 -0
  301. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +13 -7
  302. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +29 -0
  303. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +30 -6
  304. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +246 -0
  305. package/Tests/Server/Utils/Monitor/Criteria/TelemetryStepMetricAlias.test.ts +10 -0
  306. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +66 -1
  307. package/Tests/Server/Utils/Monitor/MonitorCriteriaEmailEvalLogAgreement.test.ts +280 -0
  308. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +586 -10
  309. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +570 -0
  310. package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +30 -5
  311. package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +68 -21
  312. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +36 -19
  313. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
  314. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +60 -1
  315. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +60 -0
  316. package/Tests/Server/Utils/Monitor/MonitorRootCauseTargetResolution.test.ts +423 -0
  317. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +6 -0
  318. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
  319. package/Tests/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.test.ts +573 -0
  320. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +317 -0
  321. package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
  322. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +46 -2
  323. package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +81 -45
  324. package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +711 -0
  325. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClickhouseIntegration.test.ts +223 -0
  326. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +69 -1
  327. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +838 -0
  328. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsErrorHandling.test.ts +241 -28
  329. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +651 -0
  330. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +11 -0
  331. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +13 -12
  332. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +112 -127
  333. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsRequestContract.test.ts +12 -18
  334. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsResponseParsing.test.ts +43 -0
  335. package/Tests/Server/Utils/Telemetry/ContextSpanProcessor.test.ts +281 -0
  336. package/Tests/Server/Utils/Telemetry/InventoryDuplicateIdentity.test.ts +316 -0
  337. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +691 -8
  338. package/Tests/Server/Utils/Telemetry/VMwareSnapshotScan.test.ts +1748 -0
  339. package/Tests/Types/Cloud/CloudPlatform.test.ts +574 -0
  340. package/Tests/Types/Database/IncludesAnyOfGroups.test.ts +106 -0
  341. package/Tests/Types/JSONFunctions.test.ts +40 -0
  342. package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +2 -0
  343. package/Tests/Types/Monitor/MonitorCriteriaMetricVariables.test.ts +9 -0
  344. package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
  345. package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +53 -8
  346. package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +97 -0
  347. package/Tests/Types/Monitor/MonitorStepMetricViewConfigUtil.test.ts +1 -0
  348. package/Tests/Types/Monitor/MonitorStepTemplateSyncFields.test.ts +107 -0
  349. package/Tests/Types/Monitor/MonitorTemplateSyncField.test.ts +172 -0
  350. package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
  351. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +2 -0
  352. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +1 -0
  353. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +9 -0
  354. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
  355. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
  356. package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +131 -0
  357. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +10 -0
  358. package/Tests/Types/Monitor/VMwareAlertTemplates.test.ts +1608 -0
  359. package/Tests/Types/Monitor/VMwareMetricCatalog.test.ts +488 -0
  360. package/Tests/Types/NetworkAutomation/AutoImportRunMerge.test.ts +235 -0
  361. package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +66 -0
  362. package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +309 -1
  363. package/Tests/Types/OnCallDutyPolicy/OverrideProvenance.test.ts +295 -0
  364. package/Tests/Types/Runner/RunnerLiveStatus.test.ts +2 -2
  365. package/Tests/Types/SignupPassword.test.ts +205 -0
  366. package/Tests/Types/StatusPage/StatusPageLanguage.test.ts +44 -0
  367. package/Tests/Types/SupportedLanguages.test.ts +119 -0
  368. package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +19 -0
  369. package/Tests/Types/Telemetry/InventoryLiveness.test.ts +99 -0
  370. package/Tests/UI/ColorPickerBuild.test.ts +86 -0
  371. package/Tests/UI/Components/Breadcrumbs.test.tsx +32 -0
  372. package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +160 -0
  373. package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +937 -0
  374. package/Tests/UI/Components/Forms/ModelFormWriteOnlyColumnSelect.test.tsx +230 -0
  375. package/Tests/UI/Components/Forms/ValidationFormSteps.test.ts +3 -4
  376. package/Tests/UI/Components/LabelRuleImportExport.test.tsx +907 -0
  377. package/Tests/UI/Components/ModelTable/ModelTableCreateAfterEdit.test.tsx +514 -0
  378. package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +301 -0
  379. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +2 -1
  380. package/Tests/UI/Components/TooltipLazyContent.test.tsx +373 -0
  381. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsMessagingEndpointGuidance.test.tsx +43 -12
  382. package/Tests/UI/ReactDomBuild.test.ts +104 -0
  383. package/Tests/UI/ReactRouterSingletonBuild.test.ts +143 -0
  384. package/Tests/UI/Rum/ReplayHeader.test.tsx +10 -2
  385. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +514 -0
  386. package/Tests/UI/Rum/ReplayTimeFormat.test.ts +94 -0
  387. package/Tests/UI/Rum/ReplayUi.test.tsx +559 -0
  388. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +153 -0
  389. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +30 -0
  390. package/Tests/UI/Utils/DashboardStackingLayers.test.ts +197 -0
  391. package/Tests/UI/Utils/LabelRuleImportExport.test.ts +546 -0
  392. package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +109 -2
  393. package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +7 -2
  394. package/Tests/UI/Utils/UserEmailRegistrationStatus.test.tsx +295 -0
  395. package/Tests/UI/Utils/WebAuthn.test.ts +265 -0
  396. package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +5 -0
  397. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +11 -1
  398. package/Tests/Utils/Dashboard/Components/DashboardVMwareListComponents.test.ts +548 -0
  399. package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +17 -3
  400. package/Tests/Utils/Dashboard/LabelVariable.test.ts +257 -0
  401. package/Tests/Utils/Dashboard/VariableUrlState.test.ts +144 -14
  402. package/Tests/Utils/LabelRuleImportExport.test.ts +583 -0
  403. package/Tests/Utils/MetricUnitUtil.test.ts +81 -0
  404. package/Tests/Utils/Monitor/DeviceMacLearningUtil.test.ts +497 -0
  405. package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +546 -0
  406. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  407. package/Tests/Utils/Monitor/MonitorTemplateCustomFieldUtil.test.ts +218 -0
  408. package/Tests/Utils/Monitor/MonitorTemplateSyncUtil.test.ts +590 -0
  409. package/Tests/Utils/Monitor/NetworkTopologyEndpointAdoption.test.ts +1755 -0
  410. package/Tests/Utils/NetworkAutomation/AutoImportRunChain.test.ts +320 -0
  411. package/Tests/Utils/RequestFailedDetails.test.ts +325 -0
  412. package/Tests/Utils/Telemetry/CloudInstanceIdentity.test.ts +255 -0
  413. package/Tests/Utils/Telemetry/EntityRelationship.test.ts +167 -0
  414. package/Tests/Utils/WebAuthnTestUtil.ts +79 -0
  415. package/Tests/__mocks__/simplewebauthn.js +33 -4
  416. package/Types/AI/CodeFixTaskContext.ts +122 -0
  417. package/Types/AI/CodeFixTaskType.ts +62 -0
  418. package/Types/Accounts/AccountsLanguage.ts +1 -0
  419. package/Types/AdminDashboard/AdminDashboardLanguage.ts +1 -0
  420. package/Types/BaseDatabase/IncludesAnyOfGroups.ts +77 -0
  421. package/Types/Calendar/CalendarEvent.ts +16 -0
  422. package/Types/Cloud/CloudPlatform.ts +372 -0
  423. package/Types/CodeRepository/GitHubCommand.ts +69 -0
  424. package/Types/Dashboard/DashboardComponentType.ts +2 -0
  425. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
  426. package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +1 -0
  427. package/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.ts +23 -0
  428. package/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.ts +30 -0
  429. package/Types/Dashboard/DashboardLanguage.ts +1 -0
  430. package/Types/Dashboard/DashboardTemplates.ts +314 -0
  431. package/Types/Dashboard/DashboardVariable.ts +8 -0
  432. package/Types/Docs/DocsLanguage.ts +1 -0
  433. package/Types/Exception/EgressGuardException.ts +65 -0
  434. package/Types/Icon/IconProp.ts +1 -0
  435. package/Types/JSON.ts +4 -0
  436. package/Types/JSONFunctions.ts +16 -0
  437. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +36 -0
  438. package/Types/Monitor/MonitorCriteriaInstance.ts +1 -0
  439. package/Types/Monitor/MonitorStep.ts +78 -17
  440. package/Types/Monitor/MonitorStepMetricViewConfigUtil.ts +1 -0
  441. package/Types/Monitor/MonitorStepVMwareMonitor.ts +127 -0
  442. package/Types/Monitor/MonitorTemplateSyncField.ts +291 -0
  443. package/Types/Monitor/MonitorType.ts +24 -0
  444. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +33 -0
  445. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +2 -0
  446. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +3 -0
  447. package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +158 -0
  448. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +61 -0
  449. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
  450. package/Types/Monitor/VMwareAlertTemplates.ts +1070 -0
  451. package/Types/Monitor/VMwareMetricCatalog.ts +914 -0
  452. package/Types/NetworkAutomation/RuleRunResult.ts +402 -13
  453. package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +29 -0
  454. package/Types/OnCallDutyPolicy/UserOverrideUtil.ts +16 -0
  455. package/Types/Password.ts +84 -5
  456. package/Types/Permission.ts +265 -0
  457. package/Types/Probe/RequestFailedDetails.ts +7 -0
  458. package/Types/Runner/RunnerLiveStatus.ts +1 -1
  459. package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -0
  460. package/Types/SerializableObjectDictionary.ts +4 -0
  461. package/Types/StatusPage/StatusPageLanguage.ts +1 -0
  462. package/Types/Telemetry/EntityType.ts +21 -0
  463. package/Types/Telemetry/InventoryLiveness.ts +56 -0
  464. package/Types/Telemetry/ServiceType.ts +1 -0
  465. package/Typings/Index.d.ts +63 -0
  466. package/UI/Components/Breadcrumbs/Breadcrumbs.tsx +2 -2
  467. package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +9 -2
  468. package/UI/Components/Calendar/Calendar.css +78 -0
  469. package/UI/Components/Calendar/Calendar.tsx +28 -3
  470. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +46 -21
  471. package/UI/Components/Dashboard/DashboardVariableControl.tsx +285 -0
  472. package/UI/Components/Forms/BasicForm.tsx +44 -2
  473. package/UI/Components/Forms/Fields/ColorPicker.tsx +2 -1
  474. package/UI/Components/Forms/Fields/FormField.tsx +16 -3
  475. package/UI/Components/Forms/ModelForm.tsx +159 -5
  476. package/UI/Components/Forms/Types/Field.ts +8 -1
  477. package/UI/Components/Graphs/DayUptimeGraph.tsx +8 -10
  478. package/UI/Components/Icon/Icon.tsx +16 -0
  479. package/UI/Components/Input/Input.tsx +42 -7
  480. package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +441 -0
  481. package/UI/Components/LabelRule/LabelRuleTable.tsx +142 -0
  482. package/UI/Components/ModelTable/BaseModelTable.tsx +22 -5
  483. package/UI/Components/ModelTable/ModelTable.tsx +14 -6
  484. package/UI/Components/MonitorGraphs/Uptime.tsx +17 -27
  485. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +3 -1
  486. package/UI/Components/Tooltip/Tooltip.tsx +52 -6
  487. package/UI/Utils/DashboardStackingLayers.ts +85 -0
  488. package/UI/Utils/LabelRuleImportExport.ts +310 -0
  489. package/UI/Utils/ModelAPI/ModelAPI.ts +4 -3
  490. package/UI/Utils/TelemetryService.ts +4 -3
  491. package/UI/Utils/UseDashboardGridDnd.ts +4 -1
  492. package/UI/Utils/UserEmailRegistrationStatus.ts +33 -5
  493. package/UI/Utils/WebAuthn.ts +220 -0
  494. package/UI/esbuild-config.js +10 -0
  495. package/Utils/API.ts +34 -0
  496. package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +12 -1
  497. package/Utils/Dashboard/Components/DashboardVMwareHostListComponent.ts +38 -0
  498. package/Utils/Dashboard/Components/DashboardVMwareResourceListShared.ts +70 -0
  499. package/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.ts +76 -0
  500. package/Utils/Dashboard/Components/Index.ts +16 -0
  501. package/Utils/Dashboard/LabelVariable.ts +152 -0
  502. package/Utils/Dashboard/VariableUrlState.ts +27 -5
  503. package/Utils/LabelRuleImportExport.ts +496 -0
  504. package/Utils/MetricUnitUtil.ts +34 -0
  505. package/Utils/Monitor/DeviceMacLearningUtil.ts +177 -0
  506. package/Utils/Monitor/MetricValueFormatter.ts +342 -0
  507. package/Utils/Monitor/MonitorTemplateCustomFieldUtil.ts +124 -0
  508. package/Utils/Monitor/MonitorTemplateSyncUtil.ts +164 -0
  509. package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +7 -2
  510. package/Utils/Monitor/NetworkTopologyUtil.ts +693 -0
  511. package/Utils/NetworkAutomation/AutoImportRunChain.ts +138 -0
  512. package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +8 -0
  513. package/Utils/Telemetry/CloudInstanceIdentity.ts +94 -0
  514. package/Utils/Telemetry/EntityKey.ts +19 -0
  515. package/Utils/Telemetry/EntityRelationship.ts +19 -0
  516. package/build/dist/Models/DatabaseModels/Alert.js +54 -0
  517. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  518. package/build/dist/Models/DatabaseModels/CloudResource.js +44 -7
  519. package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
  520. package/build/dist/Models/DatabaseModels/CodeRepository.js +87 -0
  521. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  522. package/build/dist/Models/DatabaseModels/GlobalConfig.js +12 -12
  523. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  524. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +60 -7
  525. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  526. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +287 -0
  527. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +1 -0
  528. package/build/dist/Models/DatabaseModels/Incident.js +54 -0
  529. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  530. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  531. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  532. package/build/dist/Models/DatabaseModels/InventoryItem.js +34 -1
  533. package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
  534. package/build/dist/Models/DatabaseModels/NetworkDevice.js +128 -0
  535. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  536. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
  537. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  538. package/build/dist/Models/DatabaseModels/User.js +57 -4
  539. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  540. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +47 -2
  541. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -1
  542. package/build/dist/Models/DatabaseModels/UserWebAuthn.js +18 -0
  543. package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
  544. package/build/dist/Models/DatabaseModels/VMwareResource.js +1201 -0
  545. package/build/dist/Models/DatabaseModels/VMwareResource.js.map +1 -0
  546. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +1149 -0
  547. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -0
  548. package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js +648 -0
  549. package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js.map +1 -0
  550. package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +522 -0
  551. package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -0
  552. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +603 -0
  553. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -0
  554. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +503 -0
  555. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -0
  556. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +502 -0
  557. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -0
  558. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +22 -1
  559. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  560. package/build/dist/Server/API/AIAgentDataAPI.js +63 -3
  561. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  562. package/build/dist/Server/API/AIAgentGitHubAPI.js +363 -0
  563. package/build/dist/Server/API/AIAgentGitHubAPI.js.map +1 -0
  564. package/build/dist/Server/API/AIChatAPI.js +19 -1
  565. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  566. package/build/dist/Server/API/BillingAPI.js +22 -0
  567. package/build/dist/Server/API/BillingAPI.js.map +1 -1
  568. package/build/dist/Server/API/DashboardAPI.js +10 -0
  569. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  570. package/build/dist/Server/API/GitHubAPI.js +33 -5
  571. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  572. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +56 -0
  573. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -0
  574. package/build/dist/Server/API/UserWebAuthnAPI.js +17 -1
  575. package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
  576. package/build/dist/Server/API/VMwareResourceAPI.js +106 -0
  577. package/build/dist/Server/API/VMwareResourceAPI.js.map +1 -0
  578. package/build/dist/Server/EnvironmentConfig.js +44 -12
  579. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  580. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js +14 -0
  581. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js.map +1 -0
  582. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js +41 -0
  583. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js.map +1 -0
  584. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js +14 -0
  585. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js.map +1 -0
  586. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js +241 -0
  587. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js.map +1 -0
  588. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js +36 -0
  589. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js.map +1 -0
  590. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js +12 -0
  591. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js.map +1 -0
  592. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js +34 -0
  593. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js.map +1 -0
  594. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  595. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  596. package/build/dist/Server/Infrastructure/Redis.js +8 -8
  597. package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
  598. package/build/dist/Server/Infrastructure/Status.js +10 -4
  599. package/build/dist/Server/Infrastructure/Status.js.map +1 -1
  600. package/build/dist/Server/Middleware/IdentityRateLimit.js +80 -0
  601. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
  602. package/build/dist/Server/Services/AIRunService.js +14 -1
  603. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  604. package/build/dist/Server/Services/BillingPaymentMethodService.js +71 -21
  605. package/build/dist/Server/Services/BillingPaymentMethodService.js.map +1 -1
  606. package/build/dist/Server/Services/BillingService.js +210 -22
  607. package/build/dist/Server/Services/BillingService.js.map +1 -1
  608. package/build/dist/Server/Services/CloudResourceInstanceService.js +66 -0
  609. package/build/dist/Server/Services/CloudResourceInstanceService.js.map +1 -1
  610. package/build/dist/Server/Services/DatabaseService.js +58 -13
  611. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  612. package/build/dist/Server/Services/ExceptionAggregationService.js +1 -0
  613. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  614. package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +9 -0
  615. package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +1 -0
  616. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +7 -0
  617. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -1
  618. package/build/dist/Server/Services/Index.js +16 -0
  619. package/build/dist/Server/Services/Index.js.map +1 -1
  620. package/build/dist/Server/Services/InventoryItemService.js +28 -1
  621. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  622. package/build/dist/Server/Services/LogAggregationService.js +1 -0
  623. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  624. package/build/dist/Server/Services/MetricAggregationService.js +1 -0
  625. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  626. package/build/dist/Server/Services/MobilePasskeyLoginService.js +137 -0
  627. package/build/dist/Server/Services/MobilePasskeyLoginService.js.map +1 -0
  628. package/build/dist/Server/Services/MonitorService.js +34 -1
  629. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  630. package/build/dist/Server/Services/MonitorTemplateService.js +167 -30
  631. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  632. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +394 -38
  633. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  634. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +142 -2
  635. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  636. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +65 -0
  637. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  638. package/build/dist/Server/Services/NetworkDeviceService.js +54 -0
  639. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  640. package/build/dist/Server/Services/OpenTelemetryIngestService.js +28 -13
  641. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  642. package/build/dist/Server/Services/PayAsYouGoBillingService.js +297 -0
  643. package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -0
  644. package/build/dist/Server/Services/ProjectService.js +38 -2
  645. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  646. package/build/dist/Server/Services/ServerlessFunctionInstanceService.js +66 -0
  647. package/build/dist/Server/Services/ServerlessFunctionInstanceService.js.map +1 -1
  648. package/build/dist/Server/Services/TeamMemberService.js +85 -28
  649. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  650. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +61 -10
  651. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  652. package/build/dist/Server/Services/TelemetryUsageBillingService.js +62 -5
  653. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  654. package/build/dist/Server/Services/TraceAggregationService.js +5 -4
  655. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  656. package/build/dist/Server/Services/UserNotificationRuleService.js +60 -25
  657. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  658. package/build/dist/Server/Services/UserWebAuthnService.js +345 -113
  659. package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
  660. package/build/dist/Server/Services/VMwareResourceService.js +395 -0
  661. package/build/dist/Server/Services/VMwareResourceService.js.map +1 -0
  662. package/build/dist/Server/Services/VMwareVCenterFeedService.js +89 -0
  663. package/build/dist/Server/Services/VMwareVCenterFeedService.js.map +1 -0
  664. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +197 -0
  665. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -0
  666. package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js +13 -0
  667. package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js.map +1 -0
  668. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +214 -0
  669. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -0
  670. package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js +13 -0
  671. package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js.map +1 -0
  672. package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js +129 -0
  673. package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js.map +1 -0
  674. package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js +122 -0
  675. package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js.map +1 -0
  676. package/build/dist/Server/Services/VMwareVCenterService.js +533 -0
  677. package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -0
  678. package/build/dist/Server/Services/WorkflowVariableService.js +169 -0
  679. package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
  680. package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js +12 -1
  681. package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js.map +1 -1
  682. package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js +25 -2
  683. package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js.map +1 -1
  684. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +29 -4
  685. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
  686. package/build/dist/Server/Types/Database/QueryUtil.js +36 -0
  687. package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
  688. package/build/dist/Server/Types/Markdown.js +75 -0
  689. package/build/dist/Server/Types/Markdown.js.map +1 -1
  690. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  691. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js +275 -0
  692. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js.map +1 -0
  693. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js +226 -0
  694. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js.map +1 -0
  695. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js +297 -0
  696. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js.map +1 -0
  697. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js +582 -0
  698. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js.map +1 -0
  699. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js +275 -0
  700. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js.map +1 -0
  701. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js +365 -0
  702. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js.map +1 -0
  703. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js +103 -0
  704. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js.map +1 -0
  705. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js +661 -0
  706. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js.map +1 -0
  707. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +166 -18
  708. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
  709. package/build/dist/Server/Utils/DataSource/EgressGuard.js +99 -15
  710. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  711. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +12 -1
  712. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  713. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +20 -2
  714. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
  715. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +31 -2
  716. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -1
  717. package/build/dist/Server/Utils/LogRedaction.js +2 -1
  718. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  719. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +58 -35
  720. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  721. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +29 -5
  722. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  723. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +1 -1
  724. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +382 -36
  725. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  726. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +58 -9
  727. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
  728. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +9 -3
  729. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
  730. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +26 -12
  731. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
  732. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +74 -33
  733. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  734. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +12 -4
  735. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  736. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +5 -3
  737. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
  738. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +22 -9
  739. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
  740. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
  741. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  742. package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js +114 -0
  743. package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js.map +1 -0
  744. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +25 -0
  745. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  746. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +21 -0
  747. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  748. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +21 -6
  749. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  750. package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +3 -3
  751. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +9 -9
  752. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
  753. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +92 -71
  754. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
  755. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +428 -143
  756. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
  757. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +376 -0
  758. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -0
  759. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +14 -1
  760. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  761. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
  762. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +206 -14
  763. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  764. package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js +933 -0
  765. package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js.map +1 -0
  766. package/build/dist/Types/AI/CodeFixTaskContext.js +40 -0
  767. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
  768. package/build/dist/Types/AI/CodeFixTaskType.js +57 -0
  769. package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -1
  770. package/build/dist/Types/Accounts/AccountsLanguage.js +1 -0
  771. package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
  772. package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +1 -0
  773. package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
  774. package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js +54 -0
  775. package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js.map +1 -0
  776. package/build/dist/Types/Cloud/CloudPlatform.js +277 -0
  777. package/build/dist/Types/Cloud/CloudPlatform.js.map +1 -0
  778. package/build/dist/Types/CodeRepository/GitHubCommand.js +52 -0
  779. package/build/dist/Types/CodeRepository/GitHubCommand.js.map +1 -0
  780. package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
  781. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  782. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
  783. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  784. package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js +2 -0
  785. package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js.map +1 -0
  786. package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js +2 -0
  787. package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
  788. package/build/dist/Types/Dashboard/DashboardLanguage.js +1 -0
  789. package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
  790. package/build/dist/Types/Dashboard/DashboardTemplates.js +286 -0
  791. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  792. package/build/dist/Types/Dashboard/DashboardVariable.js +1 -0
  793. package/build/dist/Types/Dashboard/DashboardVariable.js.map +1 -1
  794. package/build/dist/Types/Docs/DocsLanguage.js +1 -0
  795. package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
  796. package/build/dist/Types/Exception/EgressGuardException.js +59 -0
  797. package/build/dist/Types/Exception/EgressGuardException.js.map +1 -0
  798. package/build/dist/Types/Icon/IconProp.js +1 -0
  799. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  800. package/build/dist/Types/JSON.js +1 -0
  801. package/build/dist/Types/JSON.js.map +1 -1
  802. package/build/dist/Types/JSONFunctions.js +13 -0
  803. package/build/dist/Types/JSONFunctions.js.map +1 -1
  804. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +1 -0
  805. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  806. package/build/dist/Types/Monitor/MonitorStep.js +61 -18
  807. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  808. package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js +1 -0
  809. package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js.map +1 -1
  810. package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js +71 -0
  811. package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js.map +1 -0
  812. package/build/dist/Types/Monitor/MonitorTemplateSyncField.js +211 -0
  813. package/build/dist/Types/Monitor/MonitorTemplateSyncField.js.map +1 -0
  814. package/build/dist/Types/Monitor/MonitorType.js +23 -0
  815. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  816. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +28 -0
  817. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  818. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +1 -0
  819. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  820. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +2 -0
  821. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  822. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +120 -0
  823. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -1
  824. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +60 -0
  825. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
  826. package/build/dist/Types/Monitor/VMwareAlertTemplates.js +775 -0
  827. package/build/dist/Types/Monitor/VMwareAlertTemplates.js.map +1 -0
  828. package/build/dist/Types/Monitor/VMwareMetricCatalog.js +799 -0
  829. package/build/dist/Types/Monitor/VMwareMetricCatalog.js.map +1 -0
  830. package/build/dist/Types/NetworkAutomation/RuleRunResult.js +291 -6
  831. package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
  832. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +25 -0
  833. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
  834. package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js +5 -0
  835. package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js.map +1 -1
  836. package/build/dist/Types/Password.js +63 -5
  837. package/build/dist/Types/Password.js.map +1 -1
  838. package/build/dist/Types/Permission.js +234 -0
  839. package/build/dist/Types/Permission.js.map +1 -1
  840. package/build/dist/Types/Probe/RequestFailedDetails.js +7 -0
  841. package/build/dist/Types/Probe/RequestFailedDetails.js.map +1 -1
  842. package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +2 -0
  843. package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +1 -0
  844. package/build/dist/Types/SerializableObjectDictionary.js +4 -0
  845. package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
  846. package/build/dist/Types/StatusPage/StatusPageLanguage.js +1 -0
  847. package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
  848. package/build/dist/Types/Telemetry/EntityType.js +21 -0
  849. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  850. package/build/dist/Types/Telemetry/InventoryLiveness.js +37 -0
  851. package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -0
  852. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  853. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  854. package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js +2 -2
  855. package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  856. package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +7 -0
  857. package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
  858. package/build/dist/UI/Components/Calendar/Calendar.js +24 -4
  859. package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
  860. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +9 -2
  861. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  862. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +137 -0
  863. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -0
  864. package/build/dist/UI/Components/Forms/BasicForm.js +28 -3
  865. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  866. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +1 -1
  867. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
  868. package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -3
  869. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  870. package/build/dist/UI/Components/Forms/ModelForm.js +89 -6
  871. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  872. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +5 -6
  873. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  874. package/build/dist/UI/Components/Icon/Icon.js +14 -0
  875. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  876. package/build/dist/UI/Components/Input/Input.js +37 -8
  877. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  878. package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +228 -0
  879. package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -0
  880. package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +102 -0
  881. package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -0
  882. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +15 -2
  883. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  884. package/build/dist/UI/Components/ModelTable/ModelTable.js +13 -5
  885. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  886. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +14 -15
  887. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  888. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +2 -0
  889. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  890. package/build/dist/UI/Components/Tooltip/Tooltip.js +33 -4
  891. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  892. package/build/dist/UI/Utils/DashboardStackingLayers.js +44 -0
  893. package/build/dist/UI/Utils/DashboardStackingLayers.js.map +1 -0
  894. package/build/dist/UI/Utils/LabelRuleImportExport.js +195 -0
  895. package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -0
  896. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +4 -4
  897. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  898. package/build/dist/UI/Utils/TelemetryService.js +3 -2
  899. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  900. package/build/dist/UI/Utils/UseDashboardGridDnd.js +2 -1
  901. package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -1
  902. package/build/dist/UI/Utils/UserEmailRegistrationStatus.js +21 -4
  903. package/build/dist/UI/Utils/UserEmailRegistrationStatus.js.map +1 -1
  904. package/build/dist/UI/Utils/WebAuthn.js +121 -0
  905. package/build/dist/UI/Utils/WebAuthn.js.map +1 -0
  906. package/build/dist/Utils/API.js +29 -0
  907. package/build/dist/Utils/API.js.map +1 -1
  908. package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +9 -1
  909. package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
  910. package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js +33 -0
  911. package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js.map +1 -0
  912. package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js +54 -0
  913. package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js.map +1 -0
  914. package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js +60 -0
  915. package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
  916. package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
  917. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  918. package/build/dist/Utils/Dashboard/LabelVariable.js +96 -0
  919. package/build/dist/Utils/Dashboard/LabelVariable.js.map +1 -0
  920. package/build/dist/Utils/Dashboard/VariableUrlState.js +19 -4
  921. package/build/dist/Utils/Dashboard/VariableUrlState.js.map +1 -1
  922. package/build/dist/Utils/LabelRuleImportExport.js +356 -0
  923. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -0
  924. package/build/dist/Utils/MetricUnitUtil.js +26 -0
  925. package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
  926. package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js +112 -0
  927. package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js.map +1 -0
  928. package/build/dist/Utils/Monitor/MetricValueFormatter.js +276 -0
  929. package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -0
  930. package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js +101 -0
  931. package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js.map +1 -0
  932. package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js +110 -0
  933. package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js.map +1 -0
  934. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +7 -2
  935. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
  936. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +484 -0
  937. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  938. package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js +59 -0
  939. package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js.map +1 -0
  940. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +6 -0
  941. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -1
  942. package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js +88 -0
  943. package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js.map +1 -0
  944. package/build/dist/Utils/Telemetry/EntityKey.js +15 -0
  945. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  946. package/build/dist/Utils/Telemetry/EntityRelationship.js +13 -0
  947. package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
  948. package/jest.config.json +2 -0
  949. package/package.json +1 -1
  950. package/test-setup.sh +9 -9
  951. package/tsconfig.json +51 -11
  952. package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +0 -399
@@ -0,0 +1,1352 @@
1
+ import ColumnLength from "../../../Types/Database/ColumnLength";
2
+ import OneUptimeDate from "../../../Types/Date";
3
+ import { JSONArray, JSONObject, JSONValue } from "../../../Types/JSON";
4
+ import { VMwareResourceKind } from "../../../Types/Monitor/MonitorStepVMwareMonitor";
5
+ import logger from "../Logger";
6
+ import crypto from "crypto";
7
+
8
+ /*
9
+ * ------------------------------------------------------------------
10
+ * VMware snapshot scan — pure fold & derive helpers
11
+ * ------------------------------------------------------------------
12
+ *
13
+ * Modelled on ProxmoxCephSnapshotScan.ts (the Proxmox half). The
14
+ * ingest service owns the I/O: it walks the OTLP payload, calls
15
+ * bufferVMwareSnapshotMetric per datapoint, and at flush time maps the
16
+ * folded buffers through computeVMwareIsPoweredOn /
17
+ * deriveVMwareResourceLatestMetric / deriveVMwareVCenterSnapshotExtras
18
+ * before handing the results to VMwareResourceService /
19
+ * VMwareVCenterService. Everything in this module is pure (Map/object
20
+ * mutation only — no DB, no network), which is what makes the
21
+ * snapshot-scan semantics unit-testable:
22
+ *
23
+ * - identity attributes fold first-non-null-wins; status/metric
24
+ * fields fold newest-observedAt-wins,
25
+ * - count metrics that fan out over datapoint attributes (status,
26
+ * power_state, effective) are SUMMED across the datapoints of the
27
+ * newest timestamp — never "newest datapoint wins",
28
+ * - vCenter count columns are only derived when the batch carried at
29
+ * least one resource of that kind (never zero a count on a partial
30
+ * batch — the COALESCE-per-column contract),
31
+ * - non-allow-listed metric names are skipped via the exported
32
+ * VMWARE_SNAPSHOT_METRIC_NAMES set,
33
+ * - every externalId is length-bound to VMwareResource.externalId's
34
+ * ShortText (100) column by boundVMwareExternalId: an id longer
35
+ * than 100 chars becomes an 83-char prefix + "~" + the first 16 hex
36
+ * chars of the sha1 of the FULL id, so two distinct long inventory
37
+ * paths (sibling sub-pools under a deep cluster path, the
38
+ * vm/<dc>/<host>/<name> fallback) can never clamp to the same
39
+ * unique-index key downstream. The full path stays in the LongText
40
+ * resourcePoolPath column for display.
41
+ *
42
+ * KEY DIFFERENCE from Proxmox: the OpenTelemetry Collector `vcenter`
43
+ * receiver emits one OTLP resource per vSphere object and carries the
44
+ * object's identity in that resource's attributes
45
+ * (vcenter.datacenter.name, vcenter.cluster.name, vcenter.host.name,
46
+ * vcenter.vm.name / vcenter.vm.id, vcenter.vm_template.*,
47
+ * vcenter.datastore.name, vcenter.resource_pool.*, vcenter.virtual_app.*)
48
+ * — not in datapoint labels the way pve-exporter does. The buffer
49
+ * function therefore takes the resource attribute map alongside the
50
+ * datapoint; the datapoint attributes only carry the fan-out
51
+ * dimensions (disk_state, power_state, status, effective, type).
52
+ */
53
+
54
+ /*
55
+ * Every metric the §3 metric → column table references. The ingest
56
+ * service gates on this Set before calling bufferVMwareSnapshotMetric so
57
+ * the ~40 perf series (latency, throughput, packet rates, vSAN, …) that
58
+ * only live in ClickHouse never pay for a fold.
59
+ *
60
+ * vcenter.vm.cpu.* are also the powered-on signal: the receiver emits
61
+ * them ONLY for powered-on virtual machines (see computeVMwareIsPoweredOn).
62
+ */
63
+ export const VMWARE_SNAPSHOT_METRIC_NAMES: ReadonlySet<string> = new Set([
64
+ // ESXi host
65
+ "vcenter.host.cpu.utilization",
66
+ "vcenter.host.cpu.usage",
67
+ "vcenter.host.cpu.capacity",
68
+ "vcenter.host.memory.usage",
69
+ "vcenter.host.memory.capacity",
70
+ "vcenter.host.memory.utilization",
71
+ // Virtual machine (and VM template: vcenter.vm.disk.usage only)
72
+ "vcenter.vm.cpu.utilization",
73
+ "vcenter.vm.cpu.usage",
74
+ "vcenter.vm.cpu.readiness",
75
+ "vcenter.vm.memory.usage",
76
+ "vcenter.vm.memory.utilization",
77
+ "vcenter.vm.memory.ballooned",
78
+ "vcenter.vm.memory.swapped",
79
+ "vcenter.vm.disk.usage",
80
+ "vcenter.vm.disk.utilization",
81
+ // Datastore
82
+ "vcenter.datastore.disk.usage",
83
+ "vcenter.datastore.disk.utilization",
84
+ // Cluster
85
+ "vcenter.cluster.cpu.limit",
86
+ "vcenter.cluster.cpu.effective",
87
+ "vcenter.cluster.memory.limit",
88
+ "vcenter.cluster.memory.effective",
89
+ "vcenter.cluster.host.count",
90
+ "vcenter.cluster.vm.count",
91
+ "vcenter.cluster.vm_template.count",
92
+ // Datacenter
93
+ "vcenter.datacenter.cpu.limit",
94
+ "vcenter.datacenter.memory.limit",
95
+ "vcenter.datacenter.disk.space",
96
+ "vcenter.datacenter.host.count",
97
+ "vcenter.datacenter.vm.count",
98
+ "vcenter.datacenter.cluster.count",
99
+ "vcenter.datacenter.datastore.count",
100
+ // Resource pool
101
+ "vcenter.resource_pool.cpu.usage",
102
+ "vcenter.resource_pool.memory.usage",
103
+ "vcenter.resource_pool.memory.ballooned",
104
+ "vcenter.resource_pool.memory.swapped",
105
+ ]);
106
+
107
+ // The receiver reports host / VM / resource-pool memory in MiBy.
108
+ const MEBIBYTE: number = 1024 * 1024;
109
+
110
+ /*
111
+ * A count that fans out over datapoint attribute values (one datapoint
112
+ * per status × power_state, per effective flag, …). Folded per
113
+ * (resource, column): a newer timestamp resets the sum, an equal
114
+ * timestamp adds, an older one is ignored — so the column always holds
115
+ * the complete sum of the newest collection in the batch.
116
+ */
117
+ export interface VMwareSummedCount {
118
+ value: number;
119
+ observedAt: Date;
120
+ }
121
+
122
+ /*
123
+ * The identity of one vSphere object, resolved from the OTLP resource
124
+ * attributes the vcenter receiver stamps. `kind` / `externalId` are the
125
+ * buffer key and the unique-index members of VMwareResource.
126
+ */
127
+ export interface VMwareResourceIdentity {
128
+ kind: string; // VMwareResourceKind
129
+ externalId: string;
130
+ name: string | null;
131
+ datacenterName: string | null;
132
+ clusterName: string | null;
133
+ hostName: string | null;
134
+ resourcePoolName: string | null;
135
+ resourcePoolPath: string | null;
136
+ virtualAppName: string | null;
137
+ vmInstanceUuid: string | null;
138
+ isTemplate: boolean | null; // VirtualMachine rows only
139
+ }
140
+
141
+ /*
142
+ * One VMware resource (Datacenter / Cluster / Host / VirtualMachine /
143
+ * Datastore / ResourcePool) folded across a batch. Identity attributes
144
+ * are first-non-null-wins (stable for the lifetime of the object);
145
+ * status / metric fields are newest-observedAt-wins; count fields are
146
+ * summed per VMwareSummedCount.
147
+ */
148
+ export interface VMwareResourceBufferEntry extends VMwareResourceIdentity {
149
+ /*
150
+ * Powered-on inference inputs (VirtualMachine rows only). The receiver
151
+ * emits vcenter.vm.cpu.* solely for powered-on VMs, and the agent
152
+ * config forbids splitting one collection across exports, so within
153
+ * one batch "carried a CPU point" ⇔ "powered on". See
154
+ * computeVMwareIsPoweredOn.
155
+ */
156
+ sawCpuMetric: boolean;
157
+ sawNonCpuMetric: boolean;
158
+ // Latest-metric mirror (VMwareResource columns).
159
+ latestCpuPercent: number | null;
160
+ latestCpuMhz: number | null;
161
+ cpuCapacityMhz: number | null;
162
+ cpuEffectiveMhz: number | null;
163
+ latestMemoryBytes: number | null;
164
+ /*
165
+ * host.memory.capacity / cluster|datacenter.memory.limit as reported.
166
+ * Host and VM rows may derive a fallback from usage ÷ utilization at
167
+ * flush time — see deriveVMwareResourceLatestMetric.
168
+ */
169
+ maxMemoryBytes: number | null;
170
+ memoryEffectiveBytes: number | null;
171
+ latestMemoryPercent: number | null;
172
+ /*
173
+ * vm|datastore.disk.usage / datacenter.disk.space fan out over
174
+ * disk_state (used | available); kept separately so the pair can
175
+ * arrive in either order. latestDiskBytes = used, maxDiskBytes =
176
+ * used + available (derived at flush).
177
+ */
178
+ diskUsedBytes: number | null;
179
+ diskAvailableBytes: number | null;
180
+ latestDiskPercent: number | null;
181
+ cpuReadinessPercent: number | null;
182
+ memoryBalloonedBytes: number | null;
183
+ memorySwappedBytes: number | null;
184
+ // Summed counts (Cluster / Datacenter rows).
185
+ hostCount: VMwareSummedCount | null;
186
+ effectiveHostCount: VMwareSummedCount | null;
187
+ poweredOnHostCount: VMwareSummedCount | null;
188
+ vmCount: VMwareSummedCount | null;
189
+ poweredOnVmCount: VMwareSummedCount | null;
190
+ vmTemplateCount: VMwareSummedCount | null;
191
+ datastoreCount: VMwareSummedCount | null;
192
+ clusterCount: VMwareSummedCount | null;
193
+ observedAt: Date;
194
+ }
195
+
196
+ /*
197
+ * Per-vCenter snapshot state. The saw* flags implement the
198
+ * never-zero-a-count-on-a-partial-batch contract: a vCenter count
199
+ * column is only written when the batch carried at least one resource
200
+ * of that kind.
201
+ */
202
+ export interface VMwareVCenterSnapshotBufferEntry {
203
+ sawDatacenter: boolean;
204
+ sawCluster: boolean;
205
+ sawHost: boolean;
206
+ sawVirtualMachine: boolean; // VM or template rows
207
+ sawDatastore: boolean;
208
+ sawResourcePool: boolean;
209
+ }
210
+
211
+ // The VMwareVCenter snapshot columns derived from one folded batch.
212
+ export interface VMwareVCenterSnapshotExtras {
213
+ datacenterCount?: number | undefined;
214
+ clusterCount?: number | undefined;
215
+ hostCount?: number | undefined;
216
+ vmCount?: number | undefined;
217
+ poweredOnVmCount?: number | undefined;
218
+ datastoreCount?: number | undefined;
219
+ resourcePoolCount?: number | undefined;
220
+ datastoreCapacityBytes?: number | undefined;
221
+ datastoreUsedBytes?: number | undefined;
222
+ }
223
+
224
+ /*
225
+ * The latest-metric mirror derived from one folded entry — structurally
226
+ * identical to VMwareResourceService's VMwareResourceLatestMetric, kept
227
+ * local so this module stays free of service imports.
228
+ */
229
+ export interface VMwareResourceLatestMetricSnapshot {
230
+ kind: string;
231
+ externalId: string;
232
+ cpuPercent: number | null;
233
+ cpuMhz: number | null;
234
+ cpuCapacityMhz: number | null;
235
+ cpuEffectiveMhz: number | null;
236
+ memoryBytes: number | null;
237
+ maxMemoryBytes: number | null;
238
+ memoryEffectiveBytes: number | null;
239
+ memoryPercent: number | null;
240
+ diskBytes: number | null;
241
+ maxDiskBytes: number | null;
242
+ diskPercent: number | null;
243
+ cpuReadinessPercent: number | null;
244
+ memoryBalloonedBytes: number | null;
245
+ memorySwappedBytes: number | null;
246
+ hostCount: number | null;
247
+ effectiveHostCount: number | null;
248
+ poweredOnHostCount: number | null;
249
+ vmCount: number | null;
250
+ poweredOnVmCount: number | null;
251
+ vmTemplateCount: number | null;
252
+ datastoreCount: number | null;
253
+ clusterCount: number | null;
254
+ observedAt: Date;
255
+ }
256
+
257
+ /*
258
+ * Same finite-or-null coercion contract as the ingest service's
259
+ * toNumberOrNull (NaN / ±Infinity fold to null so a malformed
260
+ * datapoint is skipped rather than poisoning a snapshot column).
261
+ */
262
+ function toNumberOrNull(value: unknown): number | null {
263
+ if (typeof value === "number") {
264
+ return Number.isFinite(value) ? value : null;
265
+ }
266
+
267
+ if (typeof value === "string") {
268
+ const parsed: number = Number.parseFloat(value);
269
+ return Number.isFinite(parsed) ? parsed : null;
270
+ }
271
+
272
+ return null;
273
+ }
274
+
275
+ /*
276
+ * Same fall-back-to-now parse contract as the ingest service's
277
+ * safeParseUnixNano — only the Date is needed on the snapshot path.
278
+ */
279
+ function parseUnixNanoToDate(
280
+ value: string | number | undefined,
281
+ context: string,
282
+ ): Date {
283
+ if (value !== undefined && value !== null) {
284
+ try {
285
+ if (typeof value === "string") {
286
+ const trimmed: string = value.trim();
287
+ if (trimmed === "" || isNaN(Number(trimmed))) {
288
+ throw new Error(`Invalid timestamp string: ${value}`);
289
+ }
290
+ /*
291
+ * Hand the raw nanosecond string to fromUnixNano so it can divide
292
+ * with BigInt — nanosecond epochs exceed Number.MAX_SAFE_INTEGER, so
293
+ * parsing to a float here would drop up to a full millisecond.
294
+ */
295
+ return OneUptimeDate.fromUnixNano(trimmed);
296
+ }
297
+ if (typeof value === "number") {
298
+ if (!Number.isFinite(value)) {
299
+ throw new Error(`Invalid timestamp number: ${value}`);
300
+ }
301
+ return OneUptimeDate.fromUnixNano(value);
302
+ }
303
+ } catch (error) {
304
+ logger.warn(
305
+ `Error processing ${context}: ${error instanceof Error ? error.message : String(error)}, using current time`,
306
+ );
307
+ }
308
+ }
309
+
310
+ return OneUptimeDate.getCurrentDate();
311
+ }
312
+
313
+ /*
314
+ * Read one OTLP AnyValue as a trimmed string. Unlike the Proxmox reader
315
+ * this also accepts boolValue / intValue / doubleValue: the vcenter
316
+ * receiver's `effective` dimension is a real boolean on the wire and
317
+ * OneUptime stores it as the string "true" / "false" (which is also how
318
+ * monitor criteria filter it).
319
+ */
320
+ function anyValueToString(value: JSONValue | undefined): string | null {
321
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
322
+ return null;
323
+ }
324
+ const anyValue: JSONObject = value as JSONObject;
325
+ if (typeof anyValue["stringValue"] === "string") {
326
+ const trimmed: string = (anyValue["stringValue"] as string).trim();
327
+ return trimmed ? trimmed : null;
328
+ }
329
+ if (typeof anyValue["boolValue"] === "boolean") {
330
+ return anyValue["boolValue"] ? "true" : "false";
331
+ }
332
+ if (
333
+ typeof anyValue["intValue"] === "number" ||
334
+ typeof anyValue["intValue"] === "string"
335
+ ) {
336
+ const trimmed: string = String(anyValue["intValue"]).trim();
337
+ return trimmed ? trimmed : null;
338
+ }
339
+ if (typeof anyValue["doubleValue"] === "number") {
340
+ return String(anyValue["doubleValue"]);
341
+ }
342
+ return null;
343
+ }
344
+
345
+ // Same trim-or-null read contract as OtelIngestBaseService.getStringAttribute.
346
+ function getDatapointAttribute(
347
+ attributes: JSONArray,
348
+ key: string,
349
+ ): string | null {
350
+ for (const attribute of attributes) {
351
+ if (attribute["key"] === key) {
352
+ const parsed: string | null = anyValueToString(attribute["value"]);
353
+ if (parsed !== null) {
354
+ return parsed;
355
+ }
356
+ }
357
+ }
358
+ return null;
359
+ }
360
+
361
+ /*
362
+ * Build the UNprefixed resource attribute map the buffer function reads
363
+ * from the raw OTLP resource attribute array. Only scalar values are
364
+ * kept (identity attributes are all strings); nested / array values are
365
+ * not vSphere identity and are dropped.
366
+ */
367
+ export function toVMwareResourceAttributeMap(
368
+ attributes: JSONArray | undefined | null,
369
+ ): Record<string, unknown> {
370
+ const map: Record<string, unknown> = {};
371
+ if (!attributes) {
372
+ return map;
373
+ }
374
+ for (const attribute of attributes) {
375
+ const key: JSONValue | undefined = attribute["key"];
376
+ if (typeof key !== "string" || !key) {
377
+ continue;
378
+ }
379
+ const parsed: string | null = anyValueToString(attribute["value"]);
380
+ if (parsed !== null) {
381
+ map[key] = parsed;
382
+ }
383
+ }
384
+ return map;
385
+ }
386
+
387
+ /*
388
+ * Read a resource attribute by its semconv-native key. Accepts both the
389
+ * bare key (the map toVMwareResourceAttributeMap builds) and the
390
+ * `resource.`-prefixed spelling (the merged metricAttributes map the
391
+ * K8s / cloud scans read), so either input shape resolves identically.
392
+ */
393
+ function readResourceAttribute(
394
+ attributes: Record<string, unknown>,
395
+ key: string,
396
+ ): string | null {
397
+ const candidates: Array<unknown> = [
398
+ attributes[key],
399
+ attributes[`resource.${key}`],
400
+ ];
401
+ for (const raw of candidates) {
402
+ if (typeof raw === "string") {
403
+ const trimmed: string = raw.trim();
404
+ if (trimmed) {
405
+ return trimmed;
406
+ }
407
+ } else if (typeof raw === "number" && Number.isFinite(raw)) {
408
+ return String(raw);
409
+ } else if (typeof raw === "boolean") {
410
+ return raw ? "true" : "false";
411
+ }
412
+ }
413
+ return null;
414
+ }
415
+
416
+ /*
417
+ * Hex chars of sha1 kept in a bound externalId. 16 hex = 64 bits: the
418
+ * chance of two distinct paths in one vCenter sharing a prefix AND a
419
+ * suffix is negligible, and the id stays readable at a glance.
420
+ */
421
+ const BOUND_EXTERNAL_ID_HASH_CHARS: number = 16;
422
+ const BOUND_EXTERNAL_ID_SEPARATOR: string = "~";
423
+
424
+ /*
425
+ * Bound an externalId to VMwareResource.externalId's ShortText (100)
426
+ * column WITHOUT letting two distinct ids collapse onto the same key.
427
+ *
428
+ * VMwareResourceService clamps identity to 100 chars with
429
+ * truncateShortText, and the ingest buffer keys on the raw id, so a
430
+ * plain clamp would let two vSphere objects whose ids only differ past
431
+ * character 100 (sibling sub-pools under a long
432
+ * `/<dc>/host/<cluster>/Resources/<pool>/<subpool>` path — vSphere
433
+ * allows 80-char datacenter / cluster / pool names — or the
434
+ * vm/<dc>/<host>/<name> fallback) share one row: bulkUpsert would merge
435
+ * them (or, when both land in the same INSERT chunk, fail the whole
436
+ * chunk with Postgres 21000 "ON CONFLICT DO UPDATE command cannot
437
+ * affect row a second time"), and the vCenter resourcePoolCount would
438
+ * disagree with the inventory list.
439
+ *
440
+ * Ids of <= 100 chars are returned unchanged (every Proxmox-style short
441
+ * id, every vm/<instance uuid>). Longer ids become a deterministic
442
+ * `<first 83 chars>~<first 16 hex of sha1(full id)>` — exactly 100
443
+ * chars, stable across calls and processes, collision-resistant because
444
+ * the suffix hashes the FULL id. The full inventory path is still
445
+ * stored in the LongText resourcePoolPath column for display.
446
+ */
447
+ export function boundVMwareExternalId(id: string): string {
448
+ const maxLength: number = ColumnLength.ShortText;
449
+ if (id.length <= maxLength) {
450
+ return id;
451
+ }
452
+
453
+ const digest: string = crypto
454
+ .createHash("sha1")
455
+ .update(id)
456
+ .digest("hex")
457
+ .substring(0, BOUND_EXTERNAL_ID_HASH_CHARS);
458
+ const prefixLength: number =
459
+ maxLength - BOUND_EXTERNAL_ID_SEPARATOR.length - digest.length;
460
+
461
+ return `${id.substring(0, prefixLength)}${BOUND_EXTERNAL_ID_SEPARATOR}${digest}`;
462
+ }
463
+
464
+ /*
465
+ * externalId scheme (immutable, collision-free within a vCenter; the
466
+ * detail route URL-encodes it as a path param):
467
+ * datacenter/<dc> cluster/<dc>/<cluster>
468
+ * host/<dc>/<host> vm/<vcenter.vm.id | vcenter.vm_template.id>
469
+ * datastore/<dc>/<datastore> resourcepool/<inventory path>
470
+ * A missing component (a receiver build that omits an attribute) is
471
+ * dropped rather than rendered as an empty segment, so the id stays
472
+ * deterministic and readable ("host/esx1" instead of "host//esx1").
473
+ * The joined id is then passed through boundVMwareExternalId, so every
474
+ * kind — not just resource pools — fits the 100-char column without
475
+ * two long ids ever clamping to the same key.
476
+ */
477
+ function joinExternalId(
478
+ prefix: string,
479
+ ...parts: Array<string | null>
480
+ ): string {
481
+ const present: Array<string> = parts.filter((part: string | null) => {
482
+ return part !== null && part !== "";
483
+ }) as Array<string>;
484
+ return boundVMwareExternalId([prefix, ...present].join("/"));
485
+ }
486
+
487
+ /*
488
+ * Resolve which vSphere object an OTLP resource describes, most specific
489
+ * first (a VM resource also carries vcenter.host.name, a host resource
490
+ * also carries vcenter.cluster.name, and everything carries
491
+ * vcenter.datacenter.name):
492
+ * 1. vcenter.vm.id / vcenter.vm.name → VirtualMachine (isTemplate=false)
493
+ * 2. vcenter.vm_template.id / .name → VirtualMachine (isTemplate=true)
494
+ * 3. vcenter.resource_pool.inventory_path → ResourcePool
495
+ * 4. vcenter.host.name → Host
496
+ * 5. vcenter.datastore.name → Datastore
497
+ * 6. vcenter.cluster.name → Cluster
498
+ * 7. only vcenter.datacenter.name → Datacenter
499
+ * Anything with none of these is not an inventory row (null).
500
+ */
501
+ export function resolveVMwareResourceIdentity(
502
+ resourceAttributes: Record<string, unknown>,
503
+ ): VMwareResourceIdentity | null {
504
+ const read: (key: string) => string | null = (key: string) => {
505
+ return readResourceAttribute(resourceAttributes, key);
506
+ };
507
+
508
+ const datacenterName: string | null = read("vcenter.datacenter.name");
509
+ const clusterName: string | null = read("vcenter.cluster.name");
510
+ const hostName: string | null = read("vcenter.host.name");
511
+ const resourcePoolName: string | null = read("vcenter.resource_pool.name");
512
+ const resourcePoolPath: string | null = read(
513
+ "vcenter.resource_pool.inventory_path",
514
+ );
515
+ const virtualAppName: string | null = read("vcenter.virtual_app.name");
516
+ const virtualAppPath: string | null = read(
517
+ "vcenter.virtual_app.inventory_path",
518
+ );
519
+
520
+ const base: Omit<VMwareResourceIdentity, "kind" | "externalId" | "name"> = {
521
+ datacenterName,
522
+ clusterName,
523
+ hostName,
524
+ resourcePoolName,
525
+ /*
526
+ * The inventory path column doubles for vApps: a VM inside a vApp
527
+ * carries vcenter.virtual_app.* instead of vcenter.resource_pool.*.
528
+ */
529
+ resourcePoolPath: resourcePoolPath ?? virtualAppPath,
530
+ virtualAppName,
531
+ vmInstanceUuid: null,
532
+ isTemplate: null,
533
+ };
534
+
535
+ // 1. Virtual machine.
536
+ const vmId: string | null = read("vcenter.vm.id");
537
+ const vmName: string | null = read("vcenter.vm.name");
538
+ if (vmId || vmName) {
539
+ return {
540
+ ...base,
541
+ kind: VMwareResourceKind.VirtualMachine,
542
+ externalId: vmId
543
+ ? joinExternalId("vm", vmId)
544
+ : joinExternalId("vm", datacenterName, hostName, vmName),
545
+ name: vmName,
546
+ vmInstanceUuid: vmId,
547
+ isTemplate: false,
548
+ };
549
+ }
550
+
551
+ // 2. VM template.
552
+ const templateId: string | null = read("vcenter.vm_template.id");
553
+ const templateName: string | null = read("vcenter.vm_template.name");
554
+ if (templateId || templateName) {
555
+ return {
556
+ ...base,
557
+ kind: VMwareResourceKind.VirtualMachine,
558
+ externalId: templateId
559
+ ? joinExternalId("vm", templateId)
560
+ : joinExternalId("vm", datacenterName, hostName, templateName),
561
+ name: templateName,
562
+ vmInstanceUuid: templateId,
563
+ isTemplate: true,
564
+ };
565
+ }
566
+
567
+ // 3. Resource pool (under a cluster, or on a standalone ESXi host).
568
+ if (resourcePoolPath) {
569
+ return {
570
+ ...base,
571
+ kind: VMwareResourceKind.ResourcePool,
572
+ externalId: joinExternalId("resourcepool", resourcePoolPath),
573
+ name: resourcePoolName,
574
+ };
575
+ }
576
+
577
+ // 4. ESXi host.
578
+ if (hostName) {
579
+ return {
580
+ ...base,
581
+ kind: VMwareResourceKind.Host,
582
+ externalId: joinExternalId("host", datacenterName, hostName),
583
+ name: hostName,
584
+ };
585
+ }
586
+
587
+ // 5. Datastore.
588
+ const datastoreName: string | null = read("vcenter.datastore.name");
589
+ if (datastoreName) {
590
+ return {
591
+ ...base,
592
+ kind: VMwareResourceKind.Datastore,
593
+ externalId: joinExternalId("datastore", datacenterName, datastoreName),
594
+ name: datastoreName,
595
+ };
596
+ }
597
+
598
+ // 6. Cluster.
599
+ if (clusterName) {
600
+ return {
601
+ ...base,
602
+ kind: VMwareResourceKind.Cluster,
603
+ externalId: joinExternalId("cluster", datacenterName, clusterName),
604
+ name: clusterName,
605
+ };
606
+ }
607
+
608
+ // 7. Datacenter.
609
+ if (datacenterName) {
610
+ return {
611
+ ...base,
612
+ kind: VMwareResourceKind.Datacenter,
613
+ externalId: joinExternalId("datacenter", datacenterName),
614
+ name: datacenterName,
615
+ };
616
+ }
617
+
618
+ return null;
619
+ }
620
+
621
+ export function getOrCreateVMwareVCenterSnapshot(
622
+ buffer: Map<string, VMwareVCenterSnapshotBufferEntry>,
623
+ vcenterIdStr: string,
624
+ ): VMwareVCenterSnapshotBufferEntry {
625
+ let entry: VMwareVCenterSnapshotBufferEntry | undefined =
626
+ buffer.get(vcenterIdStr);
627
+ if (!entry) {
628
+ entry = {
629
+ sawDatacenter: false,
630
+ sawCluster: false,
631
+ sawHost: false,
632
+ sawVirtualMachine: false,
633
+ sawDatastore: false,
634
+ sawResourcePool: false,
635
+ };
636
+ buffer.set(vcenterIdStr, entry);
637
+ }
638
+ return entry;
639
+ }
640
+
641
+ function emptyPatch(
642
+ identity: VMwareResourceIdentity,
643
+ observedAt: Date,
644
+ ): VMwareResourceBufferEntry {
645
+ return {
646
+ ...identity,
647
+ sawCpuMetric: false,
648
+ sawNonCpuMetric: false,
649
+ latestCpuPercent: null,
650
+ latestCpuMhz: null,
651
+ cpuCapacityMhz: null,
652
+ cpuEffectiveMhz: null,
653
+ latestMemoryBytes: null,
654
+ maxMemoryBytes: null,
655
+ memoryEffectiveBytes: null,
656
+ latestMemoryPercent: null,
657
+ diskUsedBytes: null,
658
+ diskAvailableBytes: null,
659
+ latestDiskPercent: null,
660
+ cpuReadinessPercent: null,
661
+ memoryBalloonedBytes: null,
662
+ memorySwappedBytes: null,
663
+ hostCount: null,
664
+ effectiveHostCount: null,
665
+ poweredOnHostCount: null,
666
+ vmCount: null,
667
+ poweredOnVmCount: null,
668
+ vmTemplateCount: null,
669
+ datastoreCount: null,
670
+ clusterCount: null,
671
+ observedAt,
672
+ };
673
+ }
674
+
675
+ function wholeBytes(value: number): number {
676
+ return Math.max(0, Math.trunc(value));
677
+ }
678
+
679
+ function mebibytesToBytes(value: number): number {
680
+ return wholeBytes(value * MEBIBYTE);
681
+ }
682
+
683
+ function wholeCount(value: number): number {
684
+ return Math.max(0, Math.trunc(value));
685
+ }
686
+
687
+ /*
688
+ * The vSphere object kind a metric name belongs to, by its second
689
+ * segment. A metric folded onto a resource of another kind (impossible
690
+ * from the stock receiver, but cheap to guard) is dropped rather than
691
+ * mis-mapped: a VM resource carries vcenter.host.name too, so the guard
692
+ * is what keeps a hand-rolled vcenter.host.* series from polluting a
693
+ * VM row.
694
+ */
695
+ function metricKindOf(metricName: string): string | null {
696
+ if (metricName.startsWith("vcenter.host.")) {
697
+ return VMwareResourceKind.Host;
698
+ }
699
+ if (metricName.startsWith("vcenter.vm.")) {
700
+ return VMwareResourceKind.VirtualMachine;
701
+ }
702
+ if (metricName.startsWith("vcenter.datastore.")) {
703
+ return VMwareResourceKind.Datastore;
704
+ }
705
+ if (metricName.startsWith("vcenter.cluster.")) {
706
+ return VMwareResourceKind.Cluster;
707
+ }
708
+ if (metricName.startsWith("vcenter.datacenter.")) {
709
+ return VMwareResourceKind.Datacenter;
710
+ }
711
+ if (metricName.startsWith("vcenter.resource_pool.")) {
712
+ return VMwareResourceKind.ResourcePool;
713
+ }
714
+ return null;
715
+ }
716
+
717
+ function markKindSeen(
718
+ snap: VMwareVCenterSnapshotBufferEntry,
719
+ kind: string,
720
+ ): void {
721
+ switch (kind) {
722
+ case VMwareResourceKind.Datacenter:
723
+ snap.sawDatacenter = true;
724
+ break;
725
+ case VMwareResourceKind.Cluster:
726
+ snap.sawCluster = true;
727
+ break;
728
+ case VMwareResourceKind.Host:
729
+ snap.sawHost = true;
730
+ break;
731
+ case VMwareResourceKind.VirtualMachine:
732
+ snap.sawVirtualMachine = true;
733
+ break;
734
+ case VMwareResourceKind.Datastore:
735
+ snap.sawDatastore = true;
736
+ break;
737
+ case VMwareResourceKind.ResourcePool:
738
+ snap.sawResourcePool = true;
739
+ break;
740
+ default:
741
+ break;
742
+ }
743
+ }
744
+
745
+ /*
746
+ * Fold one vcenter.* datapoint into the per-vCenter buffers. Identity
747
+ * comes from the RESOURCE attributes (pass the raw, unprefixed map from
748
+ * toVMwareResourceAttributeMap — the `resource.`-prefixed spelling is
749
+ * accepted too); the datapoint attributes only carry fan-out dimensions.
750
+ */
751
+ export function bufferVMwareSnapshotMetric(data: {
752
+ vcenterIdStr: string;
753
+ metricName: string;
754
+ resourceAttributes: Record<string, unknown>;
755
+ datapoint: JSONObject;
756
+ resourceBuffer: Map<string, Map<string, VMwareResourceBufferEntry>>;
757
+ vcenterBuffer: Map<string, VMwareVCenterSnapshotBufferEntry>;
758
+ }): void {
759
+ const valueFromInt: number | null = toNumberOrNull(data.datapoint["asInt"]);
760
+ const valueFromDouble: number | null = toNumberOrNull(
761
+ data.datapoint["asDouble"],
762
+ );
763
+ const rawValue: number | null = valueFromDouble ?? valueFromInt;
764
+ if (rawValue === null) {
765
+ return;
766
+ }
767
+
768
+ const identity: VMwareResourceIdentity | null = resolveVMwareResourceIdentity(
769
+ data.resourceAttributes,
770
+ );
771
+ if (!identity) {
772
+ return;
773
+ }
774
+
775
+ const metricKind: string | null = metricKindOf(data.metricName);
776
+ if (metricKind === null || metricKind !== identity.kind) {
777
+ return;
778
+ }
779
+
780
+ const observedAt: Date = parseUnixNanoToDate(
781
+ data.datapoint["timeUnixNano"] as string | number | undefined,
782
+ "vcenter snapshot timeUnixNano",
783
+ );
784
+
785
+ const dpAttributes: JSONArray =
786
+ (data.datapoint["attributes"] as JSONArray) || [];
787
+
788
+ const patch: VMwareResourceBufferEntry = emptyPatch(identity, observedAt);
789
+ const summed: (matches: boolean) => VMwareSummedCount = (
790
+ matches: boolean,
791
+ ) => {
792
+ return { value: matches ? wholeCount(rawValue) : 0, observedAt };
793
+ };
794
+
795
+ switch (data.metricName) {
796
+ // ---- ESXi host -------------------------------------------------
797
+ case "vcenter.host.cpu.utilization": {
798
+ patch.latestCpuPercent = rawValue;
799
+ break;
800
+ }
801
+ case "vcenter.host.cpu.usage": {
802
+ patch.latestCpuMhz = wholeCount(rawValue);
803
+ break;
804
+ }
805
+ case "vcenter.host.cpu.capacity": {
806
+ patch.cpuCapacityMhz = wholeCount(rawValue);
807
+ break;
808
+ }
809
+ case "vcenter.host.memory.usage": {
810
+ patch.latestMemoryBytes = mebibytesToBytes(rawValue);
811
+ break;
812
+ }
813
+ case "vcenter.host.memory.capacity": {
814
+ patch.maxMemoryBytes = mebibytesToBytes(rawValue);
815
+ break;
816
+ }
817
+ case "vcenter.host.memory.utilization": {
818
+ patch.latestMemoryPercent = rawValue;
819
+ break;
820
+ }
821
+
822
+ // ---- Virtual machine ------------------------------------------
823
+ case "vcenter.vm.cpu.utilization": {
824
+ patch.latestCpuPercent = rawValue;
825
+ patch.sawCpuMetric = true;
826
+ break;
827
+ }
828
+ case "vcenter.vm.cpu.usage": {
829
+ patch.latestCpuMhz = wholeCount(rawValue);
830
+ patch.sawCpuMetric = true;
831
+ break;
832
+ }
833
+ case "vcenter.vm.cpu.readiness": {
834
+ patch.cpuReadinessPercent = rawValue;
835
+ patch.sawCpuMetric = true;
836
+ break;
837
+ }
838
+ case "vcenter.vm.memory.usage": {
839
+ patch.latestMemoryBytes = mebibytesToBytes(rawValue);
840
+ patch.sawNonCpuMetric = true;
841
+ break;
842
+ }
843
+ case "vcenter.vm.memory.utilization": {
844
+ patch.latestMemoryPercent = rawValue;
845
+ patch.sawNonCpuMetric = true;
846
+ break;
847
+ }
848
+ case "vcenter.vm.memory.ballooned": {
849
+ patch.memoryBalloonedBytes = mebibytesToBytes(rawValue);
850
+ patch.sawNonCpuMetric = true;
851
+ break;
852
+ }
853
+ case "vcenter.vm.memory.swapped": {
854
+ patch.memorySwappedBytes = mebibytesToBytes(rawValue);
855
+ patch.sawNonCpuMetric = true;
856
+ break;
857
+ }
858
+ case "vcenter.vm.disk.usage":
859
+ case "vcenter.datastore.disk.usage":
860
+ case "vcenter.datacenter.disk.space": {
861
+ /*
862
+ * Fan-out over disk_state: one datapoint for `used`, one for
863
+ * `available`. Any other (or missing) state carries no signal.
864
+ */
865
+ const diskState: string | null = getDatapointAttribute(
866
+ dpAttributes,
867
+ "disk_state",
868
+ );
869
+ if (diskState === "used") {
870
+ patch.diskUsedBytes = wholeBytes(rawValue);
871
+ } else if (diskState === "available") {
872
+ patch.diskAvailableBytes = wholeBytes(rawValue);
873
+ } else {
874
+ return;
875
+ }
876
+ if (identity.kind === VMwareResourceKind.VirtualMachine) {
877
+ patch.sawNonCpuMetric = true;
878
+ }
879
+ break;
880
+ }
881
+ case "vcenter.vm.disk.utilization":
882
+ case "vcenter.datastore.disk.utilization": {
883
+ patch.latestDiskPercent = rawValue;
884
+ if (identity.kind === VMwareResourceKind.VirtualMachine) {
885
+ patch.sawNonCpuMetric = true;
886
+ }
887
+ break;
888
+ }
889
+
890
+ // ---- Cluster ---------------------------------------------------
891
+ case "vcenter.cluster.cpu.limit":
892
+ case "vcenter.datacenter.cpu.limit": {
893
+ patch.cpuCapacityMhz = wholeCount(rawValue);
894
+ break;
895
+ }
896
+ case "vcenter.cluster.cpu.effective": {
897
+ patch.cpuEffectiveMhz = wholeCount(rawValue);
898
+ break;
899
+ }
900
+ case "vcenter.cluster.memory.limit":
901
+ case "vcenter.datacenter.memory.limit": {
902
+ // Already bytes (unlike host / VM memory, which is MiBy).
903
+ patch.maxMemoryBytes = wholeBytes(rawValue);
904
+ break;
905
+ }
906
+ case "vcenter.cluster.memory.effective": {
907
+ patch.memoryEffectiveBytes = wholeBytes(rawValue);
908
+ break;
909
+ }
910
+ case "vcenter.cluster.host.count": {
911
+ const effective: string | null = getDatapointAttribute(
912
+ dpAttributes,
913
+ "effective",
914
+ );
915
+ patch.hostCount = summed(true);
916
+ patch.effectiveHostCount = summed(effective === "true");
917
+ break;
918
+ }
919
+ case "vcenter.cluster.vm.count": {
920
+ const powerState: string | null = getDatapointAttribute(
921
+ dpAttributes,
922
+ "power_state",
923
+ );
924
+ patch.vmCount = summed(true);
925
+ patch.poweredOnVmCount = summed(powerState === "on");
926
+ break;
927
+ }
928
+ case "vcenter.cluster.vm_template.count": {
929
+ patch.vmTemplateCount = summed(true);
930
+ break;
931
+ }
932
+
933
+ // ---- Datacenter ------------------------------------------------
934
+ case "vcenter.datacenter.host.count": {
935
+ const powerState: string | null = getDatapointAttribute(
936
+ dpAttributes,
937
+ "power_state",
938
+ );
939
+ patch.hostCount = summed(true);
940
+ patch.poweredOnHostCount = summed(powerState === "on");
941
+ break;
942
+ }
943
+ case "vcenter.datacenter.vm.count": {
944
+ const powerState: string | null = getDatapointAttribute(
945
+ dpAttributes,
946
+ "power_state",
947
+ );
948
+ patch.vmCount = summed(true);
949
+ patch.poweredOnVmCount = summed(powerState === "on");
950
+ break;
951
+ }
952
+ case "vcenter.datacenter.cluster.count": {
953
+ patch.clusterCount = summed(true);
954
+ break;
955
+ }
956
+ case "vcenter.datacenter.datastore.count": {
957
+ patch.datastoreCount = summed(true);
958
+ break;
959
+ }
960
+
961
+ // ---- Resource pool ---------------------------------------------
962
+ case "vcenter.resource_pool.cpu.usage": {
963
+ patch.latestCpuMhz = wholeCount(rawValue);
964
+ break;
965
+ }
966
+ case "vcenter.resource_pool.memory.usage": {
967
+ /*
968
+ * Fans out over `type` (guest | host | overhead). The guest
969
+ * consumption is the pool's memory usage; a receiver build without
970
+ * the dimension reports the same number untyped.
971
+ */
972
+ const type: string | null = getDatapointAttribute(dpAttributes, "type");
973
+ if (type !== null && type !== "guest") {
974
+ return;
975
+ }
976
+ patch.latestMemoryBytes = mebibytesToBytes(rawValue);
977
+ break;
978
+ }
979
+ case "vcenter.resource_pool.memory.ballooned": {
980
+ patch.memoryBalloonedBytes = mebibytesToBytes(rawValue);
981
+ break;
982
+ }
983
+ case "vcenter.resource_pool.memory.swapped": {
984
+ patch.memorySwappedBytes = mebibytesToBytes(rawValue);
985
+ break;
986
+ }
987
+ default: {
988
+ return;
989
+ }
990
+ }
991
+
992
+ const snap: VMwareVCenterSnapshotBufferEntry =
993
+ getOrCreateVMwareVCenterSnapshot(data.vcenterBuffer, data.vcenterIdStr);
994
+ markKindSeen(snap, identity.kind);
995
+
996
+ foldVMwareResourceSnapshot({
997
+ buffer: data.resourceBuffer,
998
+ vcenterIdStr: data.vcenterIdStr,
999
+ patch,
1000
+ });
1001
+ }
1002
+
1003
+ /*
1004
+ * Summed-count fold: a newer timestamp resets the sum, an equal
1005
+ * timestamp adds, an older one is ignored.
1006
+ */
1007
+ function foldSummedCount(
1008
+ existing: VMwareSummedCount | null,
1009
+ patch: VMwareSummedCount | null,
1010
+ ): VMwareSummedCount | null {
1011
+ if (patch === null) {
1012
+ return existing;
1013
+ }
1014
+ if (existing === null) {
1015
+ return { value: patch.value, observedAt: patch.observedAt };
1016
+ }
1017
+ if (patch.observedAt > existing.observedAt) {
1018
+ return { value: patch.value, observedAt: patch.observedAt };
1019
+ }
1020
+ if (patch.observedAt.getTime() === existing.observedAt.getTime()) {
1021
+ existing.value += patch.value;
1022
+ }
1023
+ return existing;
1024
+ }
1025
+
1026
+ /*
1027
+ * Merge a patch into the per-vCenter buffer: identity attributes are
1028
+ * first-non-null-wins (stable, and a batch missing an attribute must
1029
+ * not blank them), status/metric fields are newest-observedAt-wins
1030
+ * (K8s buffer semantics), counts fold per foldSummedCount, and the
1031
+ * powered-on flags are sticky for the batch.
1032
+ */
1033
+ export function foldVMwareResourceSnapshot(data: {
1034
+ buffer: Map<string, Map<string, VMwareResourceBufferEntry>>;
1035
+ vcenterIdStr: string;
1036
+ patch: VMwareResourceBufferEntry;
1037
+ }): void {
1038
+ let perVCenter: Map<string, VMwareResourceBufferEntry> | undefined =
1039
+ data.buffer.get(data.vcenterIdStr);
1040
+ if (!perVCenter) {
1041
+ perVCenter = new Map();
1042
+ data.buffer.set(data.vcenterIdStr, perVCenter);
1043
+ }
1044
+ const key: string = `${data.patch.kind}|${data.patch.externalId}`;
1045
+ const existing: VMwareResourceBufferEntry | undefined = perVCenter.get(key);
1046
+ if (!existing) {
1047
+ perVCenter.set(key, data.patch);
1048
+ return;
1049
+ }
1050
+
1051
+ const patch: VMwareResourceBufferEntry = data.patch;
1052
+ const newer: boolean = patch.observedAt >= existing.observedAt;
1053
+
1054
+ // Identity: first-non-null wins.
1055
+ const identityFields: Array<
1056
+ | "name"
1057
+ | "datacenterName"
1058
+ | "clusterName"
1059
+ | "hostName"
1060
+ | "resourcePoolName"
1061
+ | "resourcePoolPath"
1062
+ | "virtualAppName"
1063
+ | "vmInstanceUuid"
1064
+ > = [
1065
+ "name",
1066
+ "datacenterName",
1067
+ "clusterName",
1068
+ "hostName",
1069
+ "resourcePoolName",
1070
+ "resourcePoolPath",
1071
+ "virtualAppName",
1072
+ "vmInstanceUuid",
1073
+ ];
1074
+ for (const field of identityFields) {
1075
+ if (existing[field] === null && patch[field] !== null) {
1076
+ existing[field] = patch[field];
1077
+ }
1078
+ }
1079
+ if (existing.isTemplate === null && patch.isTemplate !== null) {
1080
+ existing.isTemplate = patch.isTemplate;
1081
+ }
1082
+
1083
+ // Powered-on evidence accumulates across the batch.
1084
+ existing.sawCpuMetric = existing.sawCpuMetric || patch.sawCpuMetric;
1085
+ existing.sawNonCpuMetric = existing.sawNonCpuMetric || patch.sawNonCpuMetric;
1086
+
1087
+ // Status / metrics: newest observation wins.
1088
+ const metricFields: Array<
1089
+ | "latestCpuPercent"
1090
+ | "latestCpuMhz"
1091
+ | "cpuCapacityMhz"
1092
+ | "cpuEffectiveMhz"
1093
+ | "latestMemoryBytes"
1094
+ | "maxMemoryBytes"
1095
+ | "memoryEffectiveBytes"
1096
+ | "latestMemoryPercent"
1097
+ | "diskUsedBytes"
1098
+ | "diskAvailableBytes"
1099
+ | "latestDiskPercent"
1100
+ | "cpuReadinessPercent"
1101
+ | "memoryBalloonedBytes"
1102
+ | "memorySwappedBytes"
1103
+ > = [
1104
+ "latestCpuPercent",
1105
+ "latestCpuMhz",
1106
+ "cpuCapacityMhz",
1107
+ "cpuEffectiveMhz",
1108
+ "latestMemoryBytes",
1109
+ "maxMemoryBytes",
1110
+ "memoryEffectiveBytes",
1111
+ "latestMemoryPercent",
1112
+ "diskUsedBytes",
1113
+ "diskAvailableBytes",
1114
+ "latestDiskPercent",
1115
+ "cpuReadinessPercent",
1116
+ "memoryBalloonedBytes",
1117
+ "memorySwappedBytes",
1118
+ ];
1119
+ for (const field of metricFields) {
1120
+ if (patch[field] !== null && newer) {
1121
+ existing[field] = patch[field];
1122
+ }
1123
+ }
1124
+
1125
+ // Counts: summed across the newest timestamp.
1126
+ existing.hostCount = foldSummedCount(existing.hostCount, patch.hostCount);
1127
+ existing.effectiveHostCount = foldSummedCount(
1128
+ existing.effectiveHostCount,
1129
+ patch.effectiveHostCount,
1130
+ );
1131
+ existing.poweredOnHostCount = foldSummedCount(
1132
+ existing.poweredOnHostCount,
1133
+ patch.poweredOnHostCount,
1134
+ );
1135
+ existing.vmCount = foldSummedCount(existing.vmCount, patch.vmCount);
1136
+ existing.poweredOnVmCount = foldSummedCount(
1137
+ existing.poweredOnVmCount,
1138
+ patch.poweredOnVmCount,
1139
+ );
1140
+ existing.vmTemplateCount = foldSummedCount(
1141
+ existing.vmTemplateCount,
1142
+ patch.vmTemplateCount,
1143
+ );
1144
+ existing.datastoreCount = foldSummedCount(
1145
+ existing.datastoreCount,
1146
+ patch.datastoreCount,
1147
+ );
1148
+ existing.clusterCount = foldSummedCount(
1149
+ existing.clusterCount,
1150
+ patch.clusterCount,
1151
+ );
1152
+
1153
+ if (patch.observedAt > existing.observedAt) {
1154
+ existing.observedAt = patch.observedAt;
1155
+ }
1156
+ }
1157
+
1158
+ /*
1159
+ * Power state is inferred, not reported: the vcenter receiver emits
1160
+ * vcenter.vm.cpu.usage / .cpu.utilization / .cpu.readiness ONLY for
1161
+ * powered-on virtual machines, and the agent config forbids splitting a
1162
+ * collection across exports (no send_batch_max_size), so within one
1163
+ * batch:
1164
+ * - a VM whose resource carried any vcenter.vm.cpu.* point → true,
1165
+ * - a VM whose resource carried memory / disk points but no CPU
1166
+ * point → false (off or suspended — the receiver does not
1167
+ * distinguish; the UI says "Powered off"),
1168
+ * - a template, a non-VM row, or a VM with no VM points at all →
1169
+ * null (the upsert COALESCE keeps the last-known value).
1170
+ */
1171
+ export function computeVMwareIsPoweredOn(
1172
+ entry: VMwareResourceBufferEntry,
1173
+ ): boolean | null {
1174
+ if (entry.kind !== VMwareResourceKind.VirtualMachine) {
1175
+ return null;
1176
+ }
1177
+ if (entry.isTemplate === true) {
1178
+ return null;
1179
+ }
1180
+ if (entry.sawCpuMetric) {
1181
+ return true;
1182
+ }
1183
+ if (entry.sawNonCpuMetric) {
1184
+ return false;
1185
+ }
1186
+ return null;
1187
+ }
1188
+
1189
+ function countValue(count: VMwareSummedCount | null): number | null {
1190
+ return count === null ? null : count.value;
1191
+ }
1192
+
1193
+ /*
1194
+ * Project one folded entry onto the VMwareResource latest-metric mirror
1195
+ * columns, applying the derivations the §3 table specifies:
1196
+ * - maxDiskBytes = used + available (null unless both arrived),
1197
+ * - Datacenter latestDiskPercent = used ÷ (used + available) × 100,
1198
+ * - Host maxMemoryBytes falls back to usage × 100 ÷ utilization when
1199
+ * vcenter.host.memory.capacity is not enabled on the receiver,
1200
+ * - VirtualMachine maxMemoryBytes is always that derivation (the
1201
+ * receiver has no vm.memory.capacity metric).
1202
+ */
1203
+ export function deriveVMwareResourceLatestMetric(
1204
+ entry: VMwareResourceBufferEntry,
1205
+ ): VMwareResourceLatestMetricSnapshot {
1206
+ const diskBytes: number | null = entry.diskUsedBytes;
1207
+ const maxDiskBytes: number | null =
1208
+ entry.diskUsedBytes !== null && entry.diskAvailableBytes !== null
1209
+ ? entry.diskUsedBytes + entry.diskAvailableBytes
1210
+ : null;
1211
+
1212
+ let diskPercent: number | null = entry.latestDiskPercent;
1213
+ if (
1214
+ diskPercent === null &&
1215
+ entry.kind === VMwareResourceKind.Datacenter &&
1216
+ diskBytes !== null &&
1217
+ maxDiskBytes !== null &&
1218
+ maxDiskBytes > 0
1219
+ ) {
1220
+ diskPercent = (diskBytes / maxDiskBytes) * 100;
1221
+ }
1222
+
1223
+ let maxMemoryBytes: number | null = entry.maxMemoryBytes;
1224
+ if (
1225
+ maxMemoryBytes === null &&
1226
+ (entry.kind === VMwareResourceKind.Host ||
1227
+ entry.kind === VMwareResourceKind.VirtualMachine) &&
1228
+ entry.latestMemoryBytes !== null &&
1229
+ entry.latestMemoryPercent !== null &&
1230
+ entry.latestMemoryPercent > 0
1231
+ ) {
1232
+ maxMemoryBytes = Math.trunc(
1233
+ (entry.latestMemoryBytes * 100) / entry.latestMemoryPercent,
1234
+ );
1235
+ }
1236
+
1237
+ return {
1238
+ kind: entry.kind,
1239
+ externalId: entry.externalId,
1240
+ cpuPercent: entry.latestCpuPercent,
1241
+ cpuMhz: entry.latestCpuMhz,
1242
+ cpuCapacityMhz: entry.cpuCapacityMhz,
1243
+ cpuEffectiveMhz: entry.cpuEffectiveMhz,
1244
+ memoryBytes: entry.latestMemoryBytes,
1245
+ maxMemoryBytes,
1246
+ memoryEffectiveBytes: entry.memoryEffectiveBytes,
1247
+ memoryPercent: entry.latestMemoryPercent,
1248
+ diskBytes,
1249
+ maxDiskBytes,
1250
+ diskPercent,
1251
+ cpuReadinessPercent: entry.cpuReadinessPercent,
1252
+ memoryBalloonedBytes: entry.memoryBalloonedBytes,
1253
+ memorySwappedBytes: entry.memorySwappedBytes,
1254
+ hostCount: countValue(entry.hostCount),
1255
+ effectiveHostCount: countValue(entry.effectiveHostCount),
1256
+ poweredOnHostCount: countValue(entry.poweredOnHostCount),
1257
+ vmCount: countValue(entry.vmCount),
1258
+ poweredOnVmCount: countValue(entry.poweredOnVmCount),
1259
+ vmTemplateCount: countValue(entry.vmTemplateCount),
1260
+ datastoreCount: countValue(entry.datastoreCount),
1261
+ clusterCount: countValue(entry.clusterCount),
1262
+ observedAt: entry.observedAt,
1263
+ };
1264
+ }
1265
+
1266
+ /*
1267
+ * Derive the VMwareVCenter snapshot columns from one folded batch.
1268
+ * Every count is only set when the batch carried at least one resource
1269
+ * of that kind (the saw* flags) — never zero a count on a partial
1270
+ * batch. Datastore capacity / used totals additionally require at
1271
+ * least one datastore row that actually carried a disk_state series,
1272
+ * so a batch of utilization-only datastore points cannot collapse the
1273
+ * totals to 0. Returns an object whose keys are exactly the columns to
1274
+ * write (empty object = nothing to write).
1275
+ */
1276
+ export function deriveVMwareVCenterSnapshotExtras(
1277
+ entries: Array<VMwareResourceBufferEntry>,
1278
+ snap: VMwareVCenterSnapshotBufferEntry | undefined,
1279
+ ): VMwareVCenterSnapshotExtras {
1280
+ const extras: VMwareVCenterSnapshotExtras = {};
1281
+
1282
+ const ofKind: (kind: string) => Array<VMwareResourceBufferEntry> = (
1283
+ kind: string,
1284
+ ) => {
1285
+ return entries.filter((e: VMwareResourceBufferEntry) => {
1286
+ return e.kind === kind;
1287
+ });
1288
+ };
1289
+
1290
+ if (snap?.sawDatacenter) {
1291
+ extras.datacenterCount = ofKind(VMwareResourceKind.Datacenter).length;
1292
+ }
1293
+ if (snap?.sawCluster) {
1294
+ extras.clusterCount = ofKind(VMwareResourceKind.Cluster).length;
1295
+ }
1296
+ if (snap?.sawHost) {
1297
+ extras.hostCount = ofKind(VMwareResourceKind.Host).length;
1298
+ }
1299
+ if (snap?.sawVirtualMachine) {
1300
+ const vms: Array<VMwareResourceBufferEntry> = ofKind(
1301
+ VMwareResourceKind.VirtualMachine,
1302
+ ).filter((e: VMwareResourceBufferEntry) => {
1303
+ return e.isTemplate !== true;
1304
+ });
1305
+ extras.vmCount = vms.length;
1306
+ extras.poweredOnVmCount = vms.filter((e: VMwareResourceBufferEntry) => {
1307
+ return computeVMwareIsPoweredOn(e) === true;
1308
+ }).length;
1309
+ }
1310
+ if (snap?.sawDatastore) {
1311
+ const datastores: Array<VMwareResourceBufferEntry> = ofKind(
1312
+ VMwareResourceKind.Datastore,
1313
+ );
1314
+ extras.datastoreCount = datastores.length;
1315
+
1316
+ const withCapacity: Array<VMwareResourceLatestMetricSnapshot> = datastores
1317
+ .map((e: VMwareResourceBufferEntry) => {
1318
+ return deriveVMwareResourceLatestMetric(e);
1319
+ })
1320
+ .filter((m: VMwareResourceLatestMetricSnapshot) => {
1321
+ return m.maxDiskBytes !== null;
1322
+ });
1323
+ if (withCapacity.length > 0) {
1324
+ extras.datastoreCapacityBytes = withCapacity.reduce(
1325
+ (sum: number, m: VMwareResourceLatestMetricSnapshot) => {
1326
+ return sum + (m.maxDiskBytes as number);
1327
+ },
1328
+ 0,
1329
+ );
1330
+ }
1331
+ const withUsed: Array<VMwareResourceLatestMetricSnapshot> = datastores
1332
+ .map((e: VMwareResourceBufferEntry) => {
1333
+ return deriveVMwareResourceLatestMetric(e);
1334
+ })
1335
+ .filter((m: VMwareResourceLatestMetricSnapshot) => {
1336
+ return m.diskBytes !== null;
1337
+ });
1338
+ if (withUsed.length > 0) {
1339
+ extras.datastoreUsedBytes = withUsed.reduce(
1340
+ (sum: number, m: VMwareResourceLatestMetricSnapshot) => {
1341
+ return sum + (m.diskBytes as number);
1342
+ },
1343
+ 0,
1344
+ );
1345
+ }
1346
+ }
1347
+ if (snap?.sawResourcePool) {
1348
+ extras.resourcePoolCount = ofKind(VMwareResourceKind.ResourcePool).length;
1349
+ }
1350
+
1351
+ return extras;
1352
+ }