@oneuptime/common 14.0.8 → 14.0.9

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 (639) hide show
  1. package/Models/DatabaseModels/Index.ts +2 -0
  2. package/Models/DatabaseModels/KubernetesAiAgent.ts +364 -0
  3. package/Models/DatabaseModels/KubernetesCluster.ts +3 -3
  4. package/Models/DatabaseModels/Project.ts +55 -5
  5. package/Models/DatabaseModels/ProxmoxResource.ts +49 -1
  6. package/Models/DatabaseModels/RunnerJob.ts +75 -0
  7. package/Models/DatabaseModels/TeamComplianceSetting.ts +143 -2
  8. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +17 -0
  9. package/Server/API/AIChatAPI.ts +6 -3
  10. package/Server/API/AIInvestigationAPI.ts +17 -10
  11. package/Server/API/AutoRemediationAPI.ts +207 -25
  12. package/Server/API/KubernetesClusterAiAccessAPI.ts +623 -21
  13. package/Server/API/MicrosoftTeamsAPI.ts +93 -14
  14. package/Server/API/ProxmoxResourceAPI.ts +244 -14
  15. package/Server/Infrastructure/GlobalCache.ts +32 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.ts +99 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.ts +137 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.ts +42 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  20. package/Server/Middleware/TelemetryIngest.ts +41 -18
  21. package/Server/Services/AIService.ts +70 -1
  22. package/Server/Services/AlertService.ts +352 -11
  23. package/Server/Services/AlertSeverityService.ts +65 -15
  24. package/Server/Services/AutoRemediationRuleService.ts +1 -1
  25. package/Server/Services/IncidentService.ts +280 -104
  26. package/Server/Services/IncidentSeverityService.ts +66 -15
  27. package/Server/Services/KubernetesAiAgentJobService.ts +185 -0
  28. package/Server/Services/KubernetesAiAgentService.ts +1634 -0
  29. package/Server/Services/KubernetesClusterAiAccessService.ts +1118 -451
  30. package/Server/Services/KubernetesClusterService.ts +129 -21
  31. package/Server/Services/ProjectService.ts +32 -0
  32. package/Server/Services/ProxmoxResourceService.ts +322 -5
  33. package/Server/Services/RunnerJobService.ts +241 -104
  34. package/Server/Services/RunnerService.ts +1 -1
  35. package/Server/Services/ScheduledMaintenanceService.ts +737 -1
  36. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +414 -56
  37. package/Server/Services/TeamComplianceSettingService.ts +1125 -9
  38. package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +67 -9
  39. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +39 -10
  40. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +14 -3
  41. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +37 -15
  42. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +67 -24
  43. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +48 -5
  44. package/Server/Utils/AI/SRE/IncidentPostmortemRunner.ts +40 -8
  45. package/Server/Utils/AI/SRE/InvestigationEligibility.ts +13 -2
  46. package/Server/Utils/AI/SRE/InvestigationGrader.ts +1 -1
  47. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +6 -1
  48. package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +133 -7
  49. package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +58 -4
  50. package/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.ts +447 -0
  51. package/Server/Utils/Telemetry/ProxmoxNativePush.ts +903 -0
  52. package/Server/Utils/Telemetry/TelemetryEntity.ts +87 -27
  53. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +684 -47
  54. package/Tests/App/AdminDashboard/RowActionPlacementOverrides.test.tsx +278 -0
  55. package/Tests/App/Dashboard/AIChatChartWidgetZoom.test.tsx +738 -0
  56. package/Tests/App/Dashboard/AIFeaturesSettingsPointers.test.tsx +147 -0
  57. package/Tests/App/Dashboard/AIInsightsKubernetesClusterPage.test.tsx +1523 -0
  58. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +463 -3
  59. package/Tests/App/Dashboard/AffectedResourcesPickerDropdownPlacement.test.tsx +958 -0
  60. package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +595 -0
  61. package/Tests/App/Dashboard/AskAiAvailability.test.ts +20 -3
  62. package/Tests/App/Dashboard/AskAiDisabled.test.tsx +8 -3
  63. package/Tests/App/Dashboard/CephRateChartReload.test.tsx +1456 -0
  64. package/Tests/App/Dashboard/CephTimeRangeZoom.test.tsx +1229 -0
  65. package/Tests/App/Dashboard/ChartCardTimeRangeZoom.test.tsx +151 -0
  66. package/Tests/App/Dashboard/ChartCardZoomAffordances.test.tsx +257 -0
  67. package/Tests/App/Dashboard/ChartRefetchFrame.test.tsx +141 -0
  68. package/Tests/App/Dashboard/ChartZoomHarness.tsx +249 -0
  69. package/Tests/App/Dashboard/ChartZoomStandIn.tsx +131 -0
  70. package/Tests/App/Dashboard/CloudServerlessSlowLoads.test.tsx +628 -0
  71. package/Tests/App/Dashboard/CloudServerlessTimeRangeZoom.test.tsx +607 -0
  72. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +91 -19
  73. package/Tests/App/Dashboard/CompanionMetricsTabZoom.test.tsx +632 -0
  74. package/Tests/App/Dashboard/ContainerChartZoomStandIn.tsx +195 -0
  75. package/Tests/App/Dashboard/ContainerHostOverviewSlowLoads.test.tsx +542 -0
  76. package/Tests/App/Dashboard/ContainerHostOverviewTimeRangeZoom.test.tsx +848 -0
  77. package/Tests/App/Dashboard/ContainerMetricsTimeRangeZoom.test.tsx +561 -0
  78. package/Tests/App/Dashboard/DashboardBoardWideZoomShell.test.tsx +1147 -0
  79. package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +3 -2
  80. package/Tests/App/Dashboard/DashboardHistogramWidgetDragCursor.test.tsx +399 -0
  81. package/Tests/App/Dashboard/DashboardHistogramWidgetZoom.test.tsx +985 -0
  82. package/Tests/App/Dashboard/DashboardHistogramWidgetZoomHint.test.tsx +803 -0
  83. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +1 -0
  84. package/Tests/App/Dashboard/DashboardSettingsPreviewZoom.test.tsx +679 -0
  85. package/Tests/App/Dashboard/DashboardSloAndDataSourceChartZoom.test.tsx +881 -0
  86. package/Tests/App/Dashboard/DashboardTraceStatusWidgets.test.tsx +878 -0
  87. package/Tests/App/Dashboard/DatabaseMetricChartModalTimeRangeZoom.test.tsx +442 -0
  88. package/Tests/App/Dashboard/DatabaseOverviewTimeRangeZoom.test.tsx +831 -0
  89. package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +43 -0
  90. package/Tests/App/Dashboard/DockerSwarmInsightsTimeRangeZoom.test.tsx +524 -0
  91. package/Tests/App/Dashboard/DockerSwarmRateChartRefresh.test.tsx +259 -0
  92. package/Tests/App/Dashboard/EdgeDetailPanelHistory.test.tsx +763 -0
  93. package/Tests/App/Dashboard/EdgeDetailPanelTimeRangeZoom.test.tsx +547 -0
  94. package/Tests/App/Dashboard/EdgeHistoryBucketsCases.tsx +565 -0
  95. package/Tests/App/Dashboard/EdgeHistoryBucketsKathmandu.test.tsx +73 -0
  96. package/Tests/App/Dashboard/EdgeHistoryBucketsKolkata.test.tsx +74 -0
  97. package/Tests/App/Dashboard/EdgeHistoryBucketsNewYork.test.tsx +72 -0
  98. package/Tests/App/Dashboard/EdgeHistoryBucketsUtc.test.tsx +72 -0
  99. package/Tests/App/Dashboard/EmbeddedMetricCardRefresh.test.tsx +310 -0
  100. package/Tests/App/Dashboard/EmbeddedMetricCardTimeRangeZoom.test.tsx +536 -0
  101. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +3 -1
  102. package/Tests/App/Dashboard/EscalationRuleRowActions.test.tsx +660 -0
  103. package/Tests/App/Dashboard/EventNotes.test.tsx +2 -2
  104. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +587 -13
  105. package/Tests/App/Dashboard/EventOverviewSnapshotExplorerZoom.test.tsx +1139 -0
  106. package/Tests/App/Dashboard/EventOverviewSnapshotZoomAcrossTabs.test.tsx +1057 -0
  107. package/Tests/App/Dashboard/EventOverviewTelemetrySnapshotZoom.test.tsx +757 -0
  108. package/Tests/App/Dashboard/ExceptionOccurrenceTrendZoom.test.tsx +675 -0
  109. package/Tests/App/Dashboard/ExceptionOccurrencesZoomSurvivesViewSwitch.test.tsx +405 -0
  110. package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +67 -3
  111. package/Tests/App/Dashboard/ExceptionTablesSpanStatus.test.tsx +515 -0
  112. package/Tests/App/Dashboard/ExplorerOwnZoomRegression.test.tsx +739 -0
  113. package/Tests/App/Dashboard/FlowBandwidthAxisCases.tsx +461 -0
  114. package/Tests/App/Dashboard/FlowBandwidthAxisKathmandu.test.tsx +25 -0
  115. package/Tests/App/Dashboard/FlowBandwidthAxisKolkata.test.tsx +25 -0
  116. package/Tests/App/Dashboard/FlowBandwidthAxisNewYork.test.tsx +25 -0
  117. package/Tests/App/Dashboard/FlowBandwidthAxisUtc.test.tsx +24 -0
  118. package/Tests/App/Dashboard/FlowTopTalkersZoomRefetch.test.tsx +722 -0
  119. package/Tests/App/Dashboard/FlowViewportGuard.test.tsx +2526 -0
  120. package/Tests/App/Dashboard/HostPagesSlowLoads.test.tsx +872 -0
  121. package/Tests/App/Dashboard/HostPagesTimeRangeZoom.test.tsx +1208 -0
  122. package/Tests/App/Dashboard/IncidentRootCauseTimeRangeZoom.test.tsx +358 -0
  123. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +100 -9
  124. package/Tests/App/Dashboard/InfrastructureMetricsTabTimeRangeZoom.test.tsx +485 -0
  125. package/Tests/App/Dashboard/InvestigationDrawerCompanionZoom.test.tsx +655 -0
  126. package/Tests/App/Dashboard/InvestigationDrawerZoom.test.tsx +830 -0
  127. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +338 -2
  128. package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +454 -16
  129. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +799 -819
  130. package/Tests/App/Dashboard/KubernetesClusterAiAgentOverviewCard.test.tsx +367 -0
  131. package/Tests/App/Dashboard/KubernetesClusterAiAgentStatus.test.ts +1202 -0
  132. package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +106 -0
  133. package/Tests/App/Dashboard/KubernetesClusterAiNavigation.test.tsx +354 -0
  134. package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +1884 -2054
  135. package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +478 -179
  136. package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +50 -0
  137. package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +2 -1
  138. package/Tests/App/Dashboard/KubernetesClusterOverviewZoom.test.tsx +1217 -0
  139. package/Tests/App/Dashboard/KubernetesClusterPagesZoom.test.tsx +731 -0
  140. package/Tests/App/Dashboard/KubernetesCostsLoadRecovery.test.tsx +869 -0
  141. package/Tests/App/Dashboard/KubernetesCostsZoom.test.tsx +1214 -0
  142. package/Tests/App/Dashboard/KubernetesCostsZoomExactHours.test.tsx +692 -0
  143. package/Tests/App/Dashboard/KubernetesNetworkThroughputReload.test.tsx +902 -0
  144. package/Tests/App/Dashboard/KubernetesNetworkZoomBucketEdges.test.tsx +571 -0
  145. package/Tests/App/Dashboard/KubernetesOverviewZoomBucketEdges.test.tsx +697 -0
  146. package/Tests/App/Dashboard/KubernetesResourceMetricsTabZoom.test.tsx +633 -0
  147. package/Tests/App/Dashboard/LogsExplorerTimeRangeZoom.test.tsx +470 -0
  148. package/Tests/App/Dashboard/LogsInsightsTimeRangeZoom.test.tsx +948 -0
  149. package/Tests/App/Dashboard/LogsViewerPinnedWindowZoom.test.tsx +486 -0
  150. package/Tests/App/Dashboard/MetricChartsBucketInspectorDoubleClick.test.tsx +1001 -0
  151. package/Tests/App/Dashboard/MetricExplorerInvestigationAutoRefresh.test.tsx +514 -0
  152. package/Tests/App/Dashboard/MetricExplorerSavedViewZoomRoundTrip.test.tsx +581 -0
  153. package/Tests/App/Dashboard/MetricExplorerTimeRangeZoom.test.tsx +1162 -0
  154. package/Tests/App/Dashboard/MetricMonitorPreviewZoomLabel.test.ts +72 -0
  155. package/Tests/App/Dashboard/MetricRowSparklineTimeRangeZoom.test.tsx +204 -0
  156. package/Tests/App/Dashboard/MetricViewFirstResultLands.test.tsx +408 -0
  157. package/Tests/App/Dashboard/MetricViewOwnZoomResetPlacement.test.tsx +952 -0
  158. package/Tests/App/Dashboard/MetricViewTimeRange.test.ts +139 -0
  159. package/Tests/App/Dashboard/MetricViewTimeRangeZoom.test.tsx +556 -0
  160. package/Tests/App/Dashboard/MonitorMetricsChartWrappersZoom.test.tsx +552 -0
  161. package/Tests/App/Dashboard/MonitorMetricsTabsTimeRangeZoom.test.tsx +740 -0
  162. package/Tests/App/Dashboard/MonitorOverviewChartsTimeRangeZoom.test.tsx +735 -0
  163. package/Tests/App/Dashboard/MonitorStepPreviewsTimeRangeZoom.test.tsx +835 -0
  164. package/Tests/App/Dashboard/NetworkDeviceTimeRangeZoom.test.tsx +1115 -0
  165. package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +186 -17
  166. package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +155 -46
  167. package/Tests/App/Dashboard/PasskeySettings.test.tsx +87 -2
  168. package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +884 -0
  169. package/Tests/App/Dashboard/ProxmoxNodeRemove.test.tsx +621 -0
  170. package/Tests/App/Dashboard/ProxmoxOverviewSlowLoads.test.tsx +584 -0
  171. package/Tests/App/Dashboard/ProxmoxPagesTimeRangeZoom.test.tsx +823 -0
  172. package/Tests/App/Dashboard/ProxmoxRateChartReload.test.tsx +1253 -0
  173. package/Tests/App/Dashboard/PublicDashboardBoardWideZoom.test.tsx +605 -0
  174. package/Tests/App/Dashboard/RealRowsLineChart.tsx +250 -0
  175. package/Tests/App/Dashboard/RechartsHostsPlotCursor.test.tsx +513 -0
  176. package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +865 -0
  177. package/Tests/App/Dashboard/RumOverviewTimeRangeZoom.test.tsx +877 -0
  178. package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +20 -4
  179. package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +296 -0
  180. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +146 -36
  181. package/Tests/App/Dashboard/ServiceDatabaseSlowLoads.test.tsx +1166 -0
  182. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +1243 -104
  183. package/Tests/App/Dashboard/ServiceOverviewTimeRangeZoom.test.tsx +792 -0
  184. package/Tests/App/Dashboard/SloBudgetBurnDownZoom.test.tsx +771 -0
  185. package/Tests/App/Dashboard/SloBudgetBurnDownZoomAffordances.test.tsx +380 -0
  186. package/Tests/App/Dashboard/SloEventMetricsBarChartZoom.test.tsx +369 -0
  187. package/Tests/App/Dashboard/SloHistoryChartsTimeRangeZoom.test.tsx +694 -0
  188. package/Tests/App/Dashboard/SloHistoryChartsZoomAffordances.test.tsx +497 -0
  189. package/Tests/App/Dashboard/SloMetricsTimeRangeZoom.test.tsx +541 -0
  190. package/Tests/App/Dashboard/SlowLoadHarness.ts +123 -0
  191. package/Tests/App/Dashboard/SnapshotExplorerPrimaryZoom.test.tsx +1194 -0
  192. package/Tests/App/Dashboard/SnapshotViewerPinnedWindow.test.tsx +620 -0
  193. package/Tests/App/Dashboard/TelemetrySnapshotPanelTimeRangeZoom.test.tsx +765 -0
  194. package/Tests/App/Dashboard/TelemetrySnapshotZoom.test.tsx +516 -0
  195. package/Tests/App/Dashboard/TelemetrySnapshotZoomAcrossTabs.test.tsx +827 -0
  196. package/Tests/App/Dashboard/TimeRangeZoomPageHarness.tsx +463 -0
  197. package/Tests/App/Dashboard/TraceChartEditorStatusSplit.test.tsx +543 -0
  198. package/Tests/App/Dashboard/TraceStatusPresentation.test.tsx +967 -0
  199. package/Tests/App/Dashboard/TraceTimelineMinimapZoom.test.tsx +315 -0
  200. package/Tests/App/Dashboard/TracesAnalyticsStatusSplit.test.tsx +778 -0
  201. package/Tests/App/Dashboard/TracesAnalyticsViewZoom.test.tsx +349 -0
  202. package/Tests/App/Dashboard/TracesExplorerTimeRangeZoom.test.tsx +551 -0
  203. package/Tests/App/Dashboard/TracesStatusChartAndFacet.test.tsx +687 -0
  204. package/Tests/App/Dashboard/TracesViewerStaleResponses.test.tsx +458 -0
  205. package/Tests/App/Dashboard/UptimeStripsExcludedFromZoom.test.tsx +406 -0
  206. package/Tests/App/Dashboard/VMwareOverviewSlowLoads.test.tsx +535 -0
  207. package/Tests/App/Dashboard/VMwarePagesTimeRangeZoom.test.tsx +606 -0
  208. package/Tests/App/Dashboard/ValueWidgetSparklineStaleHover.test.tsx +1292 -0
  209. package/Tests/App/Dashboard/ValueWidgetSparklineZoom.test.tsx +765 -0
  210. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +98 -0
  211. package/Tests/Models/DatabaseModels/KubernetesAiAgentModel.test.ts +295 -0
  212. package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +347 -0
  213. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +58 -0
  214. package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +1 -1
  215. package/Tests/Server/API/AIInvestigationAPI.test.ts +123 -45
  216. package/Tests/Server/API/AutoRemediationApproveClusterRound.test.ts +1329 -0
  217. package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +25 -2
  218. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -0
  219. package/Tests/Server/API/KubernetesClusterAiAccessAPIAgent.test.ts +903 -0
  220. package/Tests/Server/API/MicrosoftTeamsChatsRefreshRoute.test.ts +667 -0
  221. package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +294 -6
  222. package/Tests/Server/API/ProxmoxResourceAPIRemoveNode.test.ts +1932 -0
  223. package/Tests/Server/Infrastructure/GlobalCache.test.ts +195 -0
  224. package/Tests/Server/Infrastructure/Postgres/AddKubernetesAiAgentAndAiDefaultsMigration.test.ts +623 -0
  225. package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +87 -10
  226. package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleScopeMigration.test.ts +622 -0
  227. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +61 -4
  228. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +98 -2
  229. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +105 -2
  230. package/Tests/Server/Services/AIServiceBalanceBlocker.test.ts +282 -0
  231. package/Tests/Server/Services/AlertMonitorClearWritesNull.test.ts +409 -0
  232. package/Tests/Server/Services/AlertMonitorEditFeed.test.ts +474 -0
  233. package/Tests/Server/Services/AlertMonitorEditGuard.test.ts +610 -0
  234. package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +2 -0
  235. package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +2 -1
  236. package/Tests/Server/Services/IncidentAffectedMonitorsEdit.test.ts +1360 -0
  237. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +3 -1
  238. package/Tests/Server/Services/IncidentSeverityDeletePausesComplianceRules.test.ts +488 -0
  239. package/Tests/Server/Services/KubernetesAiAgentJobService.test.ts +329 -0
  240. package/Tests/Server/Services/KubernetesAiAgentServiceHelpers.test.ts +618 -0
  241. package/Tests/Server/Services/KubernetesAiAgentServiceLifecycle.test.ts +1444 -0
  242. package/Tests/Server/Services/KubernetesAiAgentServiceRegister.test.ts +1666 -0
  243. package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +140 -111
  244. package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +267 -105
  245. package/Tests/Server/Services/KubernetesClusterAiAccessLegacySuperseded.test.ts +440 -0
  246. package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +567 -411
  247. package/Tests/Server/Services/KubernetesClusterAiAccessTarget.test.ts +1168 -0
  248. package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +410 -12
  249. package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +55 -0
  250. package/Tests/Server/Services/ProjectServiceNewProjectAiDefaults.test.ts +288 -0
  251. package/Tests/Server/Services/ProxmoxResourcePostgres.test.ts +5633 -0
  252. package/Tests/Server/Services/ProxmoxResourceService.test.ts +6458 -5
  253. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +48 -15
  254. package/Tests/Server/Services/RunnerJobEnqueueKubectlAiAgent.test.ts +620 -0
  255. package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +170 -3
  256. package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +72 -0
  257. package/Tests/Server/Services/RunnerServiceAgentName.test.ts +6 -4
  258. package/Tests/Server/Services/ScheduledMaintenanceAttachmentEdit.test.ts +2113 -0
  259. package/Tests/Server/Services/ScheduledMaintenanceMonitorRelease.test.ts +972 -0
  260. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +2237 -0
  261. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +3988 -138
  262. package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +107 -1
  263. package/Tests/Server/Utils/AI/IncidentPostmortemRunner.test.ts +351 -0
  264. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +2 -0
  265. package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +310 -0
  266. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +70 -0
  267. package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +58 -0
  268. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +2 -0
  269. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +2 -0
  270. package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +2 -0
  271. package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +125 -1
  272. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +252 -3
  273. package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +2 -0
  274. package/Tests/Server/Utils/AI/RemediationExecutionRunnerProjectGates.test.ts +240 -0
  275. package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +2 -0
  276. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +2 -0
  277. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +2 -0
  278. package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +2 -0
  279. package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +68 -0
  280. package/Tests/Server/Utils/Telemetry/InventoryMirrorPostgres.test.ts +370 -0
  281. package/Tests/Server/Utils/Telemetry/NetworkDeviceInventoryAttributes.test.ts +522 -0
  282. package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +155 -0
  283. package/Tests/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.test.ts +8631 -0
  284. package/Tests/Server/Utils/Telemetry/ProxmoxNativePush.test.ts +2852 -0
  285. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +367 -1
  286. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +45 -3
  287. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +25 -0
  288. package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNames.test.ts +3119 -0
  289. package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNamesPostgres.test.ts +1721 -0
  290. package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +581 -113
  291. package/Tests/Types/Kubernetes/KubernetesAiAgentAccessContract.test.ts +510 -0
  292. package/Tests/Types/Team/ComplianceRule.test.ts +1029 -0
  293. package/Tests/Types/Team/TeamComplianceStatus.test.ts +176 -0
  294. package/Tests/UI/Components/ActionButton/RowActions.test.tsx +641 -0
  295. package/Tests/UI/Components/ActionButton/RowActionsAccessibility.test.tsx +414 -0
  296. package/Tests/UI/Components/ActionButton/SplitActionButtons.test.ts +565 -0
  297. package/Tests/UI/Components/Charts/BarChartDragToSelect.test.tsx +386 -0
  298. package/Tests/UI/Components/Charts/ChartDoubleClickResetWithoutDblclick.test.tsx +1025 -0
  299. package/Tests/UI/Components/Charts/ChartGroupPageZoomHint.test.tsx +196 -0
  300. package/Tests/UI/Components/Charts/ChartPlaceholdersTakeDoubleClick.test.tsx +1861 -0
  301. package/Tests/UI/Components/Charts/ChartPlotClicksWhileResetArmed.test.tsx +382 -0
  302. package/Tests/UI/Components/Charts/ChartRangeSelection.test.tsx +704 -0
  303. package/Tests/UI/Components/Charts/ChartRangeSelectionDoubleClickReset.test.tsx +1481 -0
  304. package/Tests/UI/Components/Charts/ChartRangeSelectionRealRecharts.test.tsx +918 -0
  305. package/Tests/UI/Components/Charts/ChartRowBucketStart.test.ts +350 -0
  306. package/Tests/UI/Components/Charts/DoubleClickReset.test.tsx +996 -0
  307. package/Tests/UI/Components/Charts/HistogramDoubleClickResetRealRecharts.test.tsx +965 -0
  308. package/Tests/UI/Components/Charts/HistogramDriftThenRefetch.test.tsx +277 -0
  309. package/Tests/UI/Components/Charts/HistogramRangeSelectionDataChange.test.tsx +1757 -0
  310. package/Tests/UI/Components/Charts/HistogramRangeSelectionRealRecharts.test.tsx +560 -0
  311. package/Tests/UI/Components/Charts/TimeRangeZoom/ChartPageTimeRangeZoom.test.tsx +513 -0
  312. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.test.tsx +845 -0
  313. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.test.tsx +119 -0
  314. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHintTailwind.test.tsx +274 -0
  315. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.test.ts +433 -0
  316. package/Tests/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.test.tsx +863 -0
  317. package/Tests/UI/Components/Charts/TimeRangeZoom/ZoomDocsPromises.test.tsx +1147 -0
  318. package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +14 -3
  319. package/Tests/UI/Components/EntityDropdownEscape.test.tsx +454 -0
  320. package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +420 -0
  321. package/Tests/UI/Components/Forms/FormFieldDropdownDisabled.test.tsx +233 -0
  322. package/Tests/UI/Components/Input.test.tsx +80 -1
  323. package/Tests/UI/Components/LogsAnalyticsViewZoom.test.tsx +947 -0
  324. package/Tests/UI/Components/LogsHistogramDragTooltip.test.tsx +17 -5
  325. package/Tests/UI/Components/LogsViewerAnalyticsZoom.test.tsx +501 -0
  326. package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +1 -1
  327. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +6 -4
  328. package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +60 -8
  329. package/Tests/UI/Components/ModelTable/BaseModelTableRowActions.test.tsx +476 -0
  330. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +7 -5
  331. package/Tests/UI/Components/MoreMenuPortal.test.tsx +623 -0
  332. package/Tests/UI/Components/StatusPage/ResourceGridActions.test.tsx +538 -0
  333. package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +14 -4
  334. package/Tests/UI/Components/TableCellWrapping.test.tsx +3 -3
  335. package/Tests/UI/Components/TableRowActions.test.tsx +472 -0
  336. package/Tests/UI/Components/TelemetryHistogramDragTooltip.test.tsx +1 -1
  337. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +1 -1
  338. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerZoomScope.test.tsx +470 -0
  339. package/Tests/UI/Components/TelemetryViewer/UseViewerTimeRangeZoom.test.tsx +571 -0
  340. package/Tests/UI/Components/TelemetryViewer/ViewerDoubleClickResetUnderDataChange.test.tsx +928 -0
  341. package/Tests/UI/Components/TelemetryViewer/ViewerFollowsEnclosingZoom.test.tsx +1569 -0
  342. package/Tests/UI/Components/Toggle.test.tsx +66 -0
  343. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardRefreshNames.test.tsx +1023 -0
  344. package/Tests/UI/Rum/ChunkLoader.test.ts +201 -0
  345. package/Tests/UI/Rum/FidelityNotices.test.ts +54 -0
  346. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +72 -0
  347. package/Tests/UI/Rum/ReplayFrameCapture.test.ts +1009 -9
  348. package/Tests/UI/Rum/ReplayRecordedAssets.test.ts +1069 -0
  349. package/Tests/UI/Rum/ReplayStage.test.tsx +913 -2
  350. package/Tests/UI/Rum/SessionReplayTable.test.tsx +443 -8
  351. package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +439 -9
  352. package/Tests/UI/Rum/UserFlowTablesRowActions.test.tsx +501 -0
  353. package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +47 -19
  354. package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +2 -0
  355. package/Tests/Utils/AiRemediation/KubernetesAiAgentPolicyCopyParity.test.ts +396 -0
  356. package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +104 -1
  357. package/Types/AI/AIRunType.ts +9 -4
  358. package/Types/AI/InvestigationNotStartedReason.ts +6 -0
  359. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +14 -16
  360. package/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.ts +28 -0
  361. package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +4 -2
  362. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +263 -32
  363. package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +20 -16
  364. package/Types/Kubernetes/KubernetesClusterAiInsights.ts +81 -0
  365. package/Types/Monitor/ProxmoxAlertTemplates.ts +4 -4
  366. package/Types/Team/ComplianceNotificationChannel.ts +22 -0
  367. package/Types/Team/ComplianceRule.ts +434 -0
  368. package/Types/Team/ComplianceRuleType.ts +21 -0
  369. package/Types/Team/TeamComplianceStatus.ts +81 -0
  370. package/Types/Telemetry/TelemetryIngestSurface.ts +28 -0
  371. package/UI/Components/ActionButton/ActionButtonSchema.ts +21 -0
  372. package/UI/Components/ActionButton/RowActions.tsx +238 -0
  373. package/UI/Components/ActionButton/SplitActionButtons.ts +173 -0
  374. package/UI/Components/Charts/Area/AreaChart.tsx +32 -2
  375. package/UI/Components/Charts/Bar/BarChart.tsx +40 -3
  376. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +37 -11
  377. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +80 -243
  378. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +122 -31
  379. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +95 -244
  380. package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +214 -0
  381. package/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.ts +32 -0
  382. package/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.ts +599 -0
  383. package/UI/Components/Charts/Line/LineChart.tsx +32 -2
  384. package/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.tsx +70 -0
  385. package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.tsx +226 -0
  386. package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.tsx +73 -0
  387. package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.ts +163 -0
  388. package/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.ts +215 -0
  389. package/UI/Components/Charts/Utils/DataPoint.ts +20 -8
  390. package/UI/Components/Charts/Utils/XAxis.ts +75 -0
  391. package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +493 -59
  392. package/UI/Components/EntityDropdown/EntityDropdown.tsx +107 -11
  393. package/UI/Components/Forms/Fields/FormField.tsx +10 -0
  394. package/UI/Components/Input/Input.tsx +90 -57
  395. package/UI/Components/List/ListRow.tsx +8 -74
  396. package/UI/Components/LogsViewer/LogsViewer.tsx +40 -11
  397. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +22 -6
  398. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +209 -6
  399. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +127 -84
  400. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +3 -0
  401. package/UI/Components/ModelTable/BaseModelTable.tsx +12 -1
  402. package/UI/Components/MoreMenu/MoreMenu.tsx +365 -30
  403. package/UI/Components/MoreMenu/MoreMenuItem.tsx +70 -17
  404. package/UI/Components/OrderedStatesList/Item.tsx +7 -72
  405. package/UI/Components/StatusPage/ResourceGrid.tsx +126 -77
  406. package/UI/Components/Table/TableBody.tsx +8 -2
  407. package/UI/Components/Table/TableRow.tsx +20 -140
  408. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +41 -10
  409. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +47 -9
  410. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +25 -6
  411. package/UI/Components/TelemetryViewer/types.ts +2 -0
  412. package/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.ts +448 -0
  413. package/UI/Components/Toggle/Toggle.tsx +26 -0
  414. package/UI/Components/Tooltip/Tooltip.tsx +8 -1
  415. package/UI/Styles/Theme.css +14 -2
  416. package/Utils/AiRemediation/CommandPolicy.ts +1 -1
  417. package/Utils/AiRemediation/KubectlPolicy.ts +1 -1
  418. package/Utils/Dashboard/DashboardTimeRangeZoom.ts +46 -2
  419. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  420. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  421. package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js +385 -0
  422. package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js.map +1 -0
  423. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +3 -3
  424. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  425. package/build/dist/Models/DatabaseModels/Project.js +56 -5
  426. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  427. package/build/dist/Models/DatabaseModels/ProxmoxResource.js +51 -1
  428. package/build/dist/Models/DatabaseModels/ProxmoxResource.js.map +1 -1
  429. package/build/dist/Models/DatabaseModels/RunnerJob.js +74 -0
  430. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  431. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +134 -3
  432. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  433. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  434. package/build/dist/Server/API/AIChatAPI.js +6 -1
  435. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  436. package/build/dist/Server/API/AIInvestigationAPI.js +17 -10
  437. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  438. package/build/dist/Server/API/AutoRemediationAPI.js +144 -24
  439. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  440. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +436 -22
  441. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -1
  442. package/build/dist/Server/API/MicrosoftTeamsAPI.js +69 -13
  443. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  444. package/build/dist/Server/API/ProxmoxResourceAPI.js +187 -14
  445. package/build/dist/Server/API/ProxmoxResourceAPI.js.map +1 -1
  446. package/build/dist/Server/Infrastructure/GlobalCache.js +27 -0
  447. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  448. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js +50 -0
  449. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js.map +1 -0
  450. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js +84 -0
  451. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js.map +1 -0
  452. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js +31 -0
  453. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js.map +1 -0
  454. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  455. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  456. package/build/dist/Server/Middleware/TelemetryIngest.js +34 -19
  457. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  458. package/build/dist/Server/Services/AIService.js +59 -1
  459. package/build/dist/Server/Services/AIService.js.map +1 -1
  460. package/build/dist/Server/Services/AlertService.js +248 -13
  461. package/build/dist/Server/Services/AlertService.js.map +1 -1
  462. package/build/dist/Server/Services/AlertSeverityService.js +51 -15
  463. package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
  464. package/build/dist/Server/Services/AutoRemediationRuleService.js +1 -1
  465. package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
  466. package/build/dist/Server/Services/IncidentService.js +199 -72
  467. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  468. package/build/dist/Server/Services/IncidentSeverityService.js +51 -15
  469. package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
  470. package/build/dist/Server/Services/KubernetesAiAgentJobService.js +158 -0
  471. package/build/dist/Server/Services/KubernetesAiAgentJobService.js.map +1 -0
  472. package/build/dist/Server/Services/KubernetesAiAgentService.js +1145 -0
  473. package/build/dist/Server/Services/KubernetesAiAgentService.js.map +1 -0
  474. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +842 -371
  475. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -1
  476. package/build/dist/Server/Services/KubernetesClusterService.js +86 -17
  477. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  478. package/build/dist/Server/Services/ProjectService.js +22 -0
  479. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  480. package/build/dist/Server/Services/ProxmoxResourceService.js +258 -3
  481. package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -1
  482. package/build/dist/Server/Services/RunnerJobService.js +178 -92
  483. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  484. package/build/dist/Server/Services/RunnerService.js +1 -1
  485. package/build/dist/Server/Services/RunnerService.js.map +1 -1
  486. package/build/dist/Server/Services/ScheduledMaintenanceService.js +535 -3
  487. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  488. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +316 -46
  489. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  490. package/build/dist/Server/Services/TeamComplianceSettingService.js +833 -7
  491. package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
  492. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +52 -9
  493. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -1
  494. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +13 -9
  495. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
  496. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +7 -3
  497. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
  498. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +29 -15
  499. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  500. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +56 -20
  501. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  502. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +39 -5
  503. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  504. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js +30 -3
  505. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -1
  506. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +13 -2
  507. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -1
  508. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +1 -1
  509. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +4 -2
  510. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  511. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +111 -6
  512. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
  513. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +40 -4
  514. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -1
  515. package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js +296 -0
  516. package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js.map +1 -0
  517. package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js +699 -0
  518. package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js.map +1 -0
  519. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +77 -19
  520. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  521. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +505 -42
  522. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  523. package/build/dist/Types/AI/AIRunType.js +9 -4
  524. package/build/dist/Types/AI/AIRunType.js.map +1 -1
  525. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +10 -16
  526. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  527. package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js +28 -0
  528. package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js.map +1 -0
  529. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +72 -16
  530. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
  531. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +20 -16
  532. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -1
  533. package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js +17 -0
  534. package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js.map +1 -0
  535. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +4 -4
  536. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
  537. package/build/dist/Types/Team/ComplianceNotificationChannel.js +23 -0
  538. package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -0
  539. package/build/dist/Types/Team/ComplianceRule.js +304 -0
  540. package/build/dist/Types/Team/ComplianceRule.js.map +1 -0
  541. package/build/dist/Types/Team/ComplianceRuleType.js +21 -0
  542. package/build/dist/Types/Team/ComplianceRuleType.js.map +1 -1
  543. package/build/dist/Types/Team/TeamComplianceStatus.js +2 -0
  544. package/build/dist/Types/Team/TeamComplianceStatus.js.map +1 -0
  545. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +25 -0
  546. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  547. package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js +20 -1
  548. package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js.map +1 -1
  549. package/build/dist/UI/Components/ActionButton/RowActions.js +113 -0
  550. package/build/dist/UI/Components/ActionButton/RowActions.js.map +1 -0
  551. package/build/dist/UI/Components/ActionButton/SplitActionButtons.js +71 -0
  552. package/build/dist/UI/Components/ActionButton/SplitActionButtons.js.map +1 -0
  553. package/build/dist/UI/Components/Charts/Area/AreaChart.js +16 -1
  554. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  555. package/build/dist/UI/Components/Charts/Bar/BarChart.js +16 -1
  556. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +27 -5
  558. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +61 -194
  560. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +84 -26
  562. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  563. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +75 -196
  564. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  565. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +133 -0
  566. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -1
  567. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js +26 -0
  568. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js.map +1 -0
  569. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js +371 -0
  570. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js.map +1 -0
  571. package/build/dist/UI/Components/Charts/Line/LineChart.js +16 -1
  572. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  573. package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js +35 -0
  574. package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js.map +1 -0
  575. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js +107 -0
  576. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js.map +1 -0
  577. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js +41 -0
  578. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js.map +1 -0
  579. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js +117 -0
  580. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js.map +1 -0
  581. package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js +121 -0
  582. package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js.map +1 -0
  583. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -7
  584. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  585. package/build/dist/UI/Components/Charts/Utils/XAxis.js +70 -0
  586. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  587. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +305 -38
  588. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -1
  589. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +89 -14
  590. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  591. package/build/dist/UI/Components/Forms/Fields/FormField.js +11 -2
  592. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  593. package/build/dist/UI/Components/Input/Input.js +69 -54
  594. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  595. package/build/dist/UI/Components/List/ListRow.js +4 -39
  596. package/build/dist/UI/Components/List/ListRow.js.map +1 -1
  597. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +31 -8
  598. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  599. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +10 -1
  600. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  601. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +139 -21
  602. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  603. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +30 -8
  604. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  605. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +1 -1
  606. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  607. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +10 -0
  608. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  609. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +253 -14
  610. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  611. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +43 -13
  612. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  613. package/build/dist/UI/Components/OrderedStatesList/Item.js +2 -38
  614. package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
  615. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +53 -15
  616. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
  617. package/build/dist/UI/Components/Table/TableBody.js +6 -2
  618. package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
  619. package/build/dist/UI/Components/Table/TableRow.js +12 -75
  620. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  621. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +32 -7
  622. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  623. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +27 -9
  624. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  625. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +11 -1
  626. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  627. package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js +272 -0
  628. package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js.map +1 -0
  629. package/build/dist/UI/Components/Toggle/Toggle.js +14 -1
  630. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  631. package/build/dist/UI/Components/Tooltip/Tooltip.js +1 -1
  632. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  633. package/build/dist/Utils/AiRemediation/CommandPolicy.js +1 -1
  634. package/build/dist/Utils/AiRemediation/CommandPolicy.js.map +1 -1
  635. package/build/dist/Utils/AiRemediation/KubectlPolicy.js +1 -1
  636. package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -1
  637. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +27 -1
  638. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -1
  639. package/package.json +1 -1
@@ -0,0 +1,699 @@
1
+ /*
2
+ * ------------------------------------------------------------------
3
+ * Proxmox VE native OpenTelemetry push — translate to the pve_* model
4
+ * ------------------------------------------------------------------
5
+ *
6
+ * Proxmox VE 9+ can push metrics itself (Datacenter → Metric Server →
7
+ * OpenTelemetry, PVE::Status::OpenTelemetry in pve-manager). Everything
8
+ * OneUptime builds for Proxmox — cluster discovery, the node / guest /
9
+ * storage inventory, the overview charts, the metric catalog and the
10
+ * alert templates — is written against the shape the Proxmox Agent
11
+ * ships (prometheus-pve-exporter series): `pve_*` names, resource
12
+ * identity in one `id` datapoint label (`node/pve1`, `qemu/100`,
13
+ * `lxc/101`, `storage/pve1/local`) plus the `pve.scope` / `pve.type` /
14
+ * `pve.id` attributes the agent's transform derives from it, and the
15
+ * cluster in the `proxmox.cluster.name` resource attribute.
16
+ *
17
+ * The native push differs in more than the prefix, which is why a
18
+ * per-cluster "series prefix" setting could not make it work:
19
+ *
20
+ * - names follow the PVE status hash keys: `proxmox_node_cpustat_cpu`,
21
+ * `proxmox_vm_maxmem`, `proxmox_storage_used`, …;
22
+ * - identity is spread over `node` / `vmid` / `type` / `storage`
23
+ * datapoint attributes, with no `id`;
24
+ * - there is no up/info series — a guest's run state only shows as a
25
+ * non-zero uptime;
26
+ * - the resource carries `service.name=proxmox-ve` and
27
+ * `proxmox.cluster` (not `proxmox.cluster.name`), so batches were
28
+ * routed to a phantom "proxmox-ve" Service and no cluster appeared
29
+ * unless the user added a resource attribute by hand.
30
+ *
31
+ * So each native-push resource block is rewritten in place, before
32
+ * anything reads it: the cluster identity is filled in from what PVE
33
+ * already sends, and the pve_* series the product reads are derived and
34
+ * appended next to the originals. The original proxmox_* series are left
35
+ * untouched — they stay available in Metrics Explorer, and anything a
36
+ * user already built on them keeps working.
37
+ *
38
+ * What the native push does not carry (HA state, start-on-boot, backup
39
+ * coverage, replication) cannot be derived and is not invented here.
40
+ * The one thing a node cannot say about itself — that it is down — is
41
+ * said for it by the nodes still alive: see
42
+ * appendProxmoxSiblingReportsInPlace below and ProxmoxNativeNodeLiveness.
43
+ */
44
+ // The service.name every PVE native push stamps on its resource.
45
+ export const PROXMOX_NATIVE_PUSH_SERVICE_NAME = "proxmox-ve";
46
+ /*
47
+ * `proxmox.cluster` value PVE falls back to when the node is not part of
48
+ * a cluster (PVE::Cluster::get_clinfo has no cluster name).
49
+ */
50
+ export const PROXMOX_NATIVE_PUSH_STANDALONE_CLUSTER = "single-node";
51
+ /*
52
+ * Native series → canonical pve_* series. Counters are pushed with a
53
+ * `_total` suffix (PVE's _classify_metric_type); the bare spelling is
54
+ * accepted too so an older or future plugin revision still maps.
55
+ * pve-exporter reports the byte counters as gauges, so the derived
56
+ * series are gauges — that keeps the rate charts identical on both paths.
57
+ */
58
+ const NODE_SERIES = new Map([
59
+ ["proxmox_node_uptime", "pve_uptime_seconds"],
60
+ // read_proc_stat: `cpu` is already a 0..1 ratio across all cores.
61
+ ["proxmox_node_cpustat_cpu", "pve_cpu_usage_ratio"],
62
+ ["proxmox_node_cpustat_cpus", "pve_cpu_usage_limit"],
63
+ ["proxmox_node_memory_memused", "pve_memory_usage_bytes"],
64
+ ["proxmox_node_memory_memtotal", "pve_memory_size_bytes"],
65
+ // blockstat is df('/') in bytes — the node's root filesystem.
66
+ ["proxmox_node_blockstat_used", "pve_disk_usage_bytes"],
67
+ ["proxmox_node_blockstat_total", "pve_disk_size_bytes"],
68
+ ]);
69
+ const GUEST_SERIES = new Map([
70
+ ["proxmox_vm_uptime", "pve_uptime_seconds"],
71
+ // vmstatus: `cpu` is a 0..1 ratio of the guest's allocated vCPUs.
72
+ ["proxmox_vm_cpu", "pve_cpu_usage_ratio"],
73
+ ["proxmox_vm_cpus", "pve_cpu_usage_limit"],
74
+ ["proxmox_vm_mem", "pve_memory_usage_bytes"],
75
+ ["proxmox_vm_maxmem", "pve_memory_size_bytes"],
76
+ ["proxmox_vm_disk", "pve_disk_usage_bytes"],
77
+ ["proxmox_vm_maxdisk", "pve_disk_size_bytes"],
78
+ ["proxmox_vm_netin_total", "pve_network_receive_bytes"],
79
+ ["proxmox_vm_netin", "pve_network_receive_bytes"],
80
+ ["proxmox_vm_netout_total", "pve_network_transmit_bytes"],
81
+ ["proxmox_vm_netout", "pve_network_transmit_bytes"],
82
+ ["proxmox_vm_diskread_total", "pve_disk_read_bytes"],
83
+ ["proxmox_vm_diskread", "pve_disk_read_bytes"],
84
+ ["proxmox_vm_diskwrite_total", "pve_disk_write_bytes"],
85
+ ["proxmox_vm_diskwrite", "pve_disk_write_bytes"],
86
+ ]);
87
+ const STORAGE_SERIES = new Map([
88
+ ["proxmox_storage_used", "pve_disk_usage_bytes"],
89
+ ["proxmox_storage_total", "pve_disk_size_bytes"],
90
+ /*
91
+ * pve-exporter reports a storage as up when PVE lists it available;
92
+ * the native push's `active` flag is the same signal.
93
+ */
94
+ ["proxmox_storage_active", "pve_up"],
95
+ ]);
96
+ function scopeOfNativeSeries(metricName) {
97
+ if (NODE_SERIES.has(metricName)) {
98
+ return "node";
99
+ }
100
+ if (GUEST_SERIES.has(metricName)) {
101
+ return "guest";
102
+ }
103
+ if (STORAGE_SERIES.has(metricName)) {
104
+ return "storage";
105
+ }
106
+ return null;
107
+ }
108
+ function canonicalNameOf(metricName, scope) {
109
+ const table = scope === "node"
110
+ ? NODE_SERIES
111
+ : scope === "guest"
112
+ ? GUEST_SERIES
113
+ : STORAGE_SERIES;
114
+ return table.get(metricName);
115
+ }
116
+ function readAttributeString(attributes, key) {
117
+ var _a, _b;
118
+ if (!Array.isArray(attributes)) {
119
+ return null;
120
+ }
121
+ for (const attribute of attributes) {
122
+ const attr = attribute && typeof attribute === "object"
123
+ ? attribute
124
+ : null;
125
+ if (!attr || attr["key"] !== key) {
126
+ continue;
127
+ }
128
+ const value = attr["value"];
129
+ if (!value || typeof value !== "object") {
130
+ continue;
131
+ }
132
+ const raw = (_b = (_a = value["stringValue"]) !== null && _a !== void 0 ? _a : value["intValue"]) !== null && _b !== void 0 ? _b : value["doubleValue"];
133
+ if (typeof raw === "string" && raw.trim()) {
134
+ return raw.trim();
135
+ }
136
+ if (typeof raw === "number" && Number.isFinite(raw)) {
137
+ return String(raw);
138
+ }
139
+ }
140
+ return null;
141
+ }
142
+ function stringAttribute(key, value) {
143
+ return { key, value: { stringValue: value } };
144
+ }
145
+ function readNumber(datapoint) {
146
+ var _a;
147
+ const raw = (_a = datapoint["asDouble"]) !== null && _a !== void 0 ? _a : datapoint["asInt"];
148
+ if (typeof raw === "number") {
149
+ return Number.isFinite(raw) ? raw : null;
150
+ }
151
+ if (typeof raw === "string" && raw.trim()) {
152
+ const parsed = Number(raw);
153
+ return Number.isFinite(parsed) ? parsed : null;
154
+ }
155
+ return null;
156
+ }
157
+ function metricDataPoints(metric) {
158
+ const gauge = metric["gauge"];
159
+ const sum = metric["sum"];
160
+ const points = (gauge && gauge["dataPoints"]) || (sum && sum["dataPoints"]) || [];
161
+ return Array.isArray(points) ? points : [];
162
+ }
163
+ /*
164
+ * True for a resource block pushed by Proxmox VE itself. PVE always
165
+ * stamps both `proxmox.cluster` and `proxmox.node`; neither is set by the
166
+ * Proxmox Agent (which uses `proxmox.cluster.name`), so the pair tells
167
+ * the two paths apart before and after the rewrite below.
168
+ */
169
+ export function isProxmoxNativePushResource(resourceAttributes) {
170
+ return Boolean(readAttributeString(resourceAttributes, "proxmox.cluster") &&
171
+ readAttributeString(resourceAttributes, "proxmox.node"));
172
+ }
173
+ /*
174
+ * The cluster name a native push belongs to. An explicit
175
+ * `proxmox.cluster.name` (the old documented workaround, or a user's own
176
+ * choice) always wins, so existing clusters keep their identity. A
177
+ * standalone node reports the placeholder "single-node", which would
178
+ * merge every standalone host of a project into one cluster — the node
179
+ * name is used instead.
180
+ */
181
+ export function resolveProxmoxNativePushClusterName(resourceAttributes) {
182
+ const explicit = readAttributeString(resourceAttributes, "proxmox.cluster.name");
183
+ if (explicit) {
184
+ return explicit;
185
+ }
186
+ const cluster = readAttributeString(resourceAttributes, "proxmox.cluster");
187
+ const node = readAttributeString(resourceAttributes, "proxmox.node");
188
+ if (cluster && cluster !== PROXMOX_NATIVE_PUSH_STANDALONE_CLUSTER) {
189
+ return cluster;
190
+ }
191
+ return node || cluster;
192
+ }
193
+ function identityOf(data) {
194
+ const node = readAttributeString(data.datapointAttributes, "node") || data.resourceNode;
195
+ if (data.scope === "node") {
196
+ if (!node) {
197
+ return null;
198
+ }
199
+ return {
200
+ id: `node/${node}`,
201
+ scope: "node",
202
+ type: "node",
203
+ labels: [stringAttribute("name", node)],
204
+ infoMetricName: "pve_node_info",
205
+ };
206
+ }
207
+ if (data.scope === "guest") {
208
+ const vmid = readAttributeString(data.datapointAttributes, "vmid");
209
+ const type = readAttributeString(data.datapointAttributes, "type");
210
+ if (!vmid || (type !== "qemu" && type !== "lxc")) {
211
+ return null;
212
+ }
213
+ const labels = [stringAttribute("type", type)];
214
+ const name = readAttributeString(data.datapointAttributes, "name");
215
+ if (name) {
216
+ labels.push(stringAttribute("name", name));
217
+ }
218
+ if (node) {
219
+ labels.push(stringAttribute("node", node));
220
+ }
221
+ return {
222
+ id: `${type}/${vmid}`,
223
+ scope: "guest",
224
+ type,
225
+ labels,
226
+ infoMetricName: "pve_guest_info",
227
+ };
228
+ }
229
+ const storage = readAttributeString(data.datapointAttributes, "storage");
230
+ if (!storage || !node) {
231
+ return null;
232
+ }
233
+ return {
234
+ id: `storage/${node}/${storage}`,
235
+ scope: "storage",
236
+ type: "storage",
237
+ labels: [
238
+ stringAttribute("node", node),
239
+ stringAttribute("storage", storage),
240
+ ],
241
+ infoMetricName: "pve_storage_info",
242
+ };
243
+ }
244
+ // The attributes the agent's transform/pve-identity processor stamps.
245
+ function identityAttributes(identity) {
246
+ return [
247
+ stringAttribute("id", identity.id),
248
+ stringAttribute("pve.scope", identity.scope),
249
+ stringAttribute("pve.type", identity.type),
250
+ stringAttribute("pve.id", identity.id.substring(identity.id.indexOf("/") + 1)),
251
+ ];
252
+ }
253
+ function gaugePoint(data) {
254
+ const point = {
255
+ [data.valueKey]: data.value,
256
+ attributes: data.attributes,
257
+ };
258
+ if (data.timeUnixNano !== undefined && data.timeUnixNano !== null) {
259
+ point["timeUnixNano"] = data.timeUnixNano;
260
+ }
261
+ return point;
262
+ }
263
+ /*
264
+ * Accumulates the derived datapoints of one resource block, keyed by
265
+ * canonical metric name, plus one info/up series per resource seen.
266
+ */
267
+ class DerivedSeries {
268
+ constructor() {
269
+ this.points = new Map();
270
+ this.resourcesSeen = new Set();
271
+ // Timestamp of the first node seen — undefined when the block has none.
272
+ this.nodeTimeUnixNano = undefined;
273
+ }
274
+ add(metricName, point) {
275
+ let list = this.points.get(metricName);
276
+ if (!list) {
277
+ list = [];
278
+ this.points.set(metricName, list);
279
+ }
280
+ list.push(point);
281
+ }
282
+ // First sighting of a resource in this block → emit its info series.
283
+ markSeen(identity, timeUnixNano) {
284
+ const key = `${identity.scope}|${identity.id}`;
285
+ if (this.resourcesSeen.has(key)) {
286
+ return;
287
+ }
288
+ this.resourcesSeen.add(key);
289
+ this.add(identity.infoMetricName, gaugePoint({
290
+ value: "1",
291
+ valueKey: "asInt",
292
+ timeUnixNano,
293
+ attributes: [...identityAttributes(identity), ...identity.labels],
294
+ }));
295
+ /*
296
+ * A node that pushes is up — pve-exporter reports its own view the
297
+ * same way. A node that is down pushes nothing at all; its live
298
+ * siblings report it (appendProxmoxSiblingReportsInPlace).
299
+ */
300
+ if (identity.scope === "node") {
301
+ if (this.nodeTimeUnixNano === undefined) {
302
+ this.nodeTimeUnixNano = timeUnixNano !== null && timeUnixNano !== void 0 ? timeUnixNano : null;
303
+ }
304
+ this.add("pve_up", gaugePoint({
305
+ value: "1",
306
+ valueKey: "asInt",
307
+ timeUnixNano,
308
+ attributes: identityAttributes(identity),
309
+ }));
310
+ }
311
+ }
312
+ hasAny() {
313
+ return this.points.size > 0;
314
+ }
315
+ toMetrics() {
316
+ const metrics = [];
317
+ for (const [name, dataPoints] of this.points) {
318
+ metrics.push({ name, gauge: { dataPoints } });
319
+ }
320
+ return metrics;
321
+ }
322
+ }
323
+ function blockAlreadyHasPveSeries(scopeMetrics) {
324
+ for (const scopeMetric of scopeMetrics) {
325
+ const metrics = scopeMetric === null || scopeMetric === void 0 ? void 0 : scopeMetric["metrics"];
326
+ if (!Array.isArray(metrics)) {
327
+ continue;
328
+ }
329
+ for (const metric of metrics) {
330
+ const name = metric === null || metric === void 0 ? void 0 : metric["name"];
331
+ if (typeof name === "string" && name.startsWith("pve_")) {
332
+ return true;
333
+ }
334
+ }
335
+ }
336
+ return false;
337
+ }
338
+ function upsertResourceAttribute(attributes, key, value) {
339
+ for (const attribute of attributes) {
340
+ const attr = attribute;
341
+ if (attr && attr["key"] === key) {
342
+ attr["value"] = { stringValue: value };
343
+ return;
344
+ }
345
+ }
346
+ attributes.push(stringAttribute(key, value));
347
+ }
348
+ /*
349
+ * Drop the `service.name=proxmox-ve` PVE stamps, so the batch routes to
350
+ * the discovered Proxmox cluster (per-cluster retention, no phantom
351
+ * Service) exactly like the agent — whose collector config deletes
352
+ * service.name for the same reason. A service.name the user set to
353
+ * something else through the metric server's resource attributes is a
354
+ * deliberate choice and is kept.
355
+ */
356
+ function removeNativeServiceName(attributes) {
357
+ for (let i = attributes.length - 1; i >= 0; i--) {
358
+ const attr = attributes[i];
359
+ if (attr &&
360
+ attr["key"] === "service.name" &&
361
+ readAttributeString([attr], "service.name") ===
362
+ PROXMOX_NATIVE_PUSH_SERVICE_NAME) {
363
+ attributes.splice(i, 1);
364
+ }
365
+ }
366
+ }
367
+ /*
368
+ * `service.version` is PVE's version_text(): "<version>/<repoid>", e.g.
369
+ * "9.0.10/deb1ca707ec72a89". pve-exporter reports them as the `version`
370
+ * and `repoid` labels of pve_version_info.
371
+ */
372
+ function versionInfoLabels(resourceAttributes) {
373
+ const text = readAttributeString(resourceAttributes, "service.version");
374
+ if (!text) {
375
+ return [];
376
+ }
377
+ const slash = text.indexOf("/");
378
+ const version = (slash >= 0 ? text.substring(0, slash) : text).trim();
379
+ const repoid = slash >= 0 ? text.substring(slash + 1).trim() : "";
380
+ if (!version) {
381
+ return [];
382
+ }
383
+ const labels = [stringAttribute("version", version)];
384
+ if (repoid) {
385
+ labels.push(stringAttribute("repoid", repoid));
386
+ }
387
+ return labels;
388
+ }
389
+ /*
390
+ * Derive the pve_* series of one scopeMetrics entry and append them to
391
+ * it. Returns what was derived, for the version-info decision.
392
+ */
393
+ function deriveScopeMetrics(data) {
394
+ const derived = new DerivedSeries();
395
+ const metrics = data.scopeMetric["metrics"];
396
+ if (!Array.isArray(metrics)) {
397
+ return derived;
398
+ }
399
+ for (const metricValue of metrics) {
400
+ const metric = metricValue && typeof metricValue === "object"
401
+ ? metricValue
402
+ : null;
403
+ const metricName = metric === null || metric === void 0 ? void 0 : metric["name"];
404
+ if (!metric || typeof metricName !== "string") {
405
+ continue;
406
+ }
407
+ const scope = scopeOfNativeSeries(metricName);
408
+ if (!scope) {
409
+ continue;
410
+ }
411
+ const canonicalName = canonicalNameOf(metricName, scope);
412
+ for (const datapointValue of metricDataPoints(metric)) {
413
+ const datapoint = datapointValue && typeof datapointValue === "object"
414
+ ? datapointValue
415
+ : null;
416
+ if (!datapoint) {
417
+ continue;
418
+ }
419
+ const value = readNumber(datapoint);
420
+ if (value === null) {
421
+ continue;
422
+ }
423
+ const identity = identityOf({
424
+ scope,
425
+ datapointAttributes: datapoint["attributes"],
426
+ resourceNode: data.resourceNode,
427
+ });
428
+ if (!identity) {
429
+ continue;
430
+ }
431
+ const timeUnixNano = datapoint["timeUnixNano"];
432
+ derived.markSeen(identity, timeUnixNano);
433
+ const hasDouble = datapoint["asDouble"] !== undefined && datapoint["asDouble"] !== null;
434
+ derived.add(canonicalName, gaugePoint({
435
+ value: hasDouble ? datapoint["asDouble"] : datapoint["asInt"],
436
+ valueKey: hasDouble ? "asDouble" : "asInt",
437
+ timeUnixNano,
438
+ attributes: identityAttributes(identity),
439
+ }));
440
+ /*
441
+ * PVE has no run-state series for guests; a running guest is the
442
+ * one with a non-zero uptime (vmstatus zeroes it when stopped).
443
+ * pve-exporter's pve_up is the same "status == running" signal.
444
+ */
445
+ if (identity.scope === "guest" && metricName === "proxmox_vm_uptime") {
446
+ derived.add("pve_up", gaugePoint({
447
+ value: value > 0 ? "1" : "0",
448
+ valueKey: "asInt",
449
+ timeUnixNano,
450
+ attributes: identityAttributes(identity),
451
+ }));
452
+ }
453
+ }
454
+ }
455
+ return derived;
456
+ }
457
+ /*
458
+ * Rewrite every Proxmox VE native-push block of an OTLP metrics payload
459
+ * in place (see the header). Blocks from any other source — including
460
+ * the Proxmox Agent — are left exactly as they are. Idempotent: a block
461
+ * that already carries pve_* series (translated upstream, or already
462
+ * rewritten) only gets its cluster identity filled in.
463
+ */
464
+ export function normalizeProxmoxNativePushInPlace(resourceEnvelopes) {
465
+ if (!Array.isArray(resourceEnvelopes)) {
466
+ return;
467
+ }
468
+ for (const envelopeValue of resourceEnvelopes) {
469
+ const envelope = envelopeValue && typeof envelopeValue === "object"
470
+ ? envelopeValue
471
+ : null;
472
+ const resource = envelope === null || envelope === void 0 ? void 0 : envelope["resource"];
473
+ const attributes = resource === null || resource === void 0 ? void 0 : resource["attributes"];
474
+ if (!envelope || !Array.isArray(attributes)) {
475
+ continue;
476
+ }
477
+ const resourceAttributes = attributes;
478
+ if (!isProxmoxNativePushResource(resourceAttributes)) {
479
+ continue;
480
+ }
481
+ const clusterName = resolveProxmoxNativePushClusterName(resourceAttributes);
482
+ if (clusterName) {
483
+ upsertResourceAttribute(resourceAttributes, "proxmox.cluster.name", clusterName);
484
+ }
485
+ removeNativeServiceName(resourceAttributes);
486
+ const scopeMetricsValue = envelope["scopeMetrics"];
487
+ if (!Array.isArray(scopeMetricsValue)) {
488
+ continue;
489
+ }
490
+ const scopeMetrics = scopeMetricsValue;
491
+ if (blockAlreadyHasPveSeries(scopeMetrics)) {
492
+ continue;
493
+ }
494
+ const resourceNode = readAttributeString(resourceAttributes, "proxmox.node");
495
+ for (const scopeMetricValue of scopeMetrics) {
496
+ if (!scopeMetricValue || typeof scopeMetricValue !== "object") {
497
+ continue;
498
+ }
499
+ const scopeMetric = scopeMetricValue;
500
+ const derived = deriveScopeMetrics({
501
+ scopeMetric,
502
+ resourceNode,
503
+ });
504
+ if (!derived.hasAny()) {
505
+ continue;
506
+ }
507
+ /*
508
+ * One version series per node push (PVE flushes node, qemu, lxc
509
+ * and storage status as separate requests) — the node's own push
510
+ * is the one that carries it.
511
+ */
512
+ if (derived.nodeTimeUnixNano !== undefined) {
513
+ const labels = versionInfoLabels(resourceAttributes);
514
+ if (labels.length > 0) {
515
+ derived.add("pve_version_info", gaugePoint({
516
+ value: "1",
517
+ valueKey: "asInt",
518
+ timeUnixNano: derived.nodeTimeUnixNano,
519
+ attributes: labels,
520
+ }));
521
+ }
522
+ }
523
+ scopeMetric["metrics"].push(...derived.toMetrics());
524
+ }
525
+ }
526
+ }
527
+ /*
528
+ * ------------------------------------------------------------------
529
+ * Reporting the nodes that have stopped reporting
530
+ * ------------------------------------------------------------------
531
+ *
532
+ * A native-push node that dies goes quiet — nothing ever says pve_up = 0
533
+ * for it. The nodes still alive speak for it: a live node's own status
534
+ * push carries, next to its own pve_up = 1, a pve_up = 0 for every
535
+ * sibling that has gone quiet (ProxmoxNativeNodeLiveness decides which).
536
+ * That is what pve-exporter does for the agent — one node's view reports
537
+ * the dead ones — so the unchanged Node Offline and Cluster Quorum at
538
+ * Risk monitors now fire on a native push too.
539
+ *
540
+ * The reports sit in their own scopeMetrics entry, named
541
+ * PROXMOX_SIBLING_REPORT_SCOPE_NAME, and every datapoint carries
542
+ * `oneuptime.proxmox.inferred = not-reporting`, so they can always be
543
+ * told apart from what a node said itself. The inventory fold skips
544
+ * them: a report must never refresh the silent node's "last seen".
545
+ *
546
+ * Quorum at Risk is Σ pve_up ÷ Σ pve_node_info over every row of a
547
+ * minute, so each node must weigh the same in the denominator. Every
548
+ * live node contributes one pve_node_info = 1 per push, and every live
549
+ * node reports (ProxmoxNativeNodeLiveness): with L live nodes and D
550
+ * silent ones, each report carries pve_node_info = D ÷ L in total (split
551
+ * across the silent nodes). A minute in which the live nodes land P
552
+ * pushes between them then sums to P in the numerator and P + P·D/L in
553
+ * the denominator — the ratio is L ÷ (L + D), as with the agent, however
554
+ * unevenly the pushes fall into the minute. The weights are multiples of
555
+ * 2^-16, so any sum of them is exact in floating point, whatever order
556
+ * ClickHouse adds them in, and rounded UP, so a cluster exactly half
557
+ * down never reads a hair above 50 %.
558
+ * ------------------------------------------------------------------
559
+ */
560
+ export const PROXMOX_SIBLING_REPORT_SCOPE_NAME = "oneuptime.proxmox.sibling-report";
561
+ // Marks every reported datapoint as inferred, not measured.
562
+ export const PROXMOX_INFERRED_ATTRIBUTE = "oneuptime.proxmox.inferred";
563
+ export const PROXMOX_INFERRED_NOT_REPORTING = "not-reporting";
564
+ const WEIGHT_UNITS_PER_NODE = 65536; // 2^16
565
+ export function isProxmoxSiblingReportScope(scopeMetric) {
566
+ const scope = scopeMetric && typeof scopeMetric === "object"
567
+ ? scopeMetric["scope"]
568
+ : undefined;
569
+ return Boolean(scope &&
570
+ typeof scope === "object" &&
571
+ scope["name"] === PROXMOX_SIBLING_REPORT_SCOPE_NAME);
572
+ }
573
+ /*
574
+ * The node a native-push block is the own status push of, and the
575
+ * timestamps of its own pve_up points — or null for anything else
576
+ * (guest / storage pushes, agent blocks, other telemetry). Reads the
577
+ * block after normalizeProxmoxNativePushInPlace.
578
+ */
579
+ export function readProxmoxNativeNodeStatus(envelope) {
580
+ var _a;
581
+ if (!envelope || typeof envelope !== "object") {
582
+ return null;
583
+ }
584
+ const resource = envelope["resource"];
585
+ const attributes = resource === null || resource === void 0 ? void 0 : resource["attributes"];
586
+ if (!isProxmoxNativePushResource(attributes)) {
587
+ return null;
588
+ }
589
+ const nodeName = readAttributeString(attributes, "proxmox.node");
590
+ const scopeMetrics = envelope["scopeMetrics"];
591
+ if (!nodeName || !Array.isArray(scopeMetrics)) {
592
+ return null;
593
+ }
594
+ const ownId = `node/${nodeName}`;
595
+ const timeUnixNanos = [];
596
+ for (const scopeMetric of scopeMetrics) {
597
+ if (isProxmoxSiblingReportScope(scopeMetric)) {
598
+ continue;
599
+ }
600
+ const metrics = scopeMetric === null || scopeMetric === void 0 ? void 0 : scopeMetric["metrics"];
601
+ if (!Array.isArray(metrics)) {
602
+ continue;
603
+ }
604
+ for (const metric of metrics) {
605
+ if ((metric === null || metric === void 0 ? void 0 : metric["name"]) !== "pve_up") {
606
+ continue;
607
+ }
608
+ for (const point of metricDataPoints(metric)) {
609
+ const datapoint = point && typeof point === "object" ? point : null;
610
+ if (datapoint &&
611
+ readAttributeString(datapoint["attributes"], "id") === ownId) {
612
+ timeUnixNanos.push((_a = datapoint["timeUnixNano"]) !== null && _a !== void 0 ? _a : null);
613
+ }
614
+ }
615
+ }
616
+ }
617
+ return timeUnixNanos.length > 0 ? { nodeName, timeUnixNanos } : null;
618
+ }
619
+ /*
620
+ * Each silent node's pve_node_info weight in one report: D ÷ L in total,
621
+ * rounded up to whole 2^-16 units, split as evenly as possible (the first
622
+ * nodes in the given order take the remainder). With L = D the weights
623
+ * add up to exactly 1. Rounding up can only ever lower the ratio by a
624
+ * negligible amount — too little to take a cluster with more live than
625
+ * silent nodes down to 50 %.
626
+ */
627
+ export function splitProxmoxSiblingInfoWeights(silentNodes, reporterCount) {
628
+ if (silentNodes.length === 0 || reporterCount < 1) {
629
+ return [];
630
+ }
631
+ const totalUnits = Math.ceil((silentNodes.length * WEIGHT_UNITS_PER_NODE) / reporterCount);
632
+ const baseUnits = Math.floor(totalUnits / silentNodes.length);
633
+ const remainder = totalUnits - baseUnits * silentNodes.length;
634
+ return silentNodes.map((nodeName, index) => {
635
+ return {
636
+ nodeName,
637
+ weight: (baseUnits + (index < remainder ? 1 : 0)) / WEIGHT_UNITS_PER_NODE,
638
+ };
639
+ });
640
+ }
641
+ /*
642
+ * Append the "not reporting" reports to a node's own status push: per
643
+ * own pve_up point, pve_up = 0 and a pve_node_info weight for every
644
+ * silent sibling, at that point's timestamp, with the exact labels the
645
+ * sibling's own push would carry. Idempotent.
646
+ */
647
+ export function appendProxmoxSiblingReportsInPlace(envelope, report) {
648
+ const scopeMetrics = envelope["scopeMetrics"];
649
+ if (!Array.isArray(scopeMetrics) ||
650
+ report.silentNodes.length === 0 ||
651
+ report.timeUnixNanos.length === 0 ||
652
+ scopeMetrics.some((scopeMetric) => {
653
+ return isProxmoxSiblingReportScope(scopeMetric);
654
+ })) {
655
+ return;
656
+ }
657
+ const upPoints = [];
658
+ const infoPoints = [];
659
+ const inferred = stringAttribute(PROXMOX_INFERRED_ATTRIBUTE, PROXMOX_INFERRED_NOT_REPORTING);
660
+ for (const { nodeName, weight } of splitProxmoxSiblingInfoWeights(report.silentNodes, report.reporterCount)) {
661
+ const identity = identityOf({
662
+ scope: "node",
663
+ datapointAttributes: [],
664
+ resourceNode: nodeName,
665
+ });
666
+ if (!identity) {
667
+ continue;
668
+ }
669
+ for (const timeUnixNano of report.timeUnixNanos) {
670
+ upPoints.push(gaugePoint({
671
+ value: "0",
672
+ valueKey: "asInt",
673
+ timeUnixNano,
674
+ attributes: [...identityAttributes(identity), inferred],
675
+ }));
676
+ infoPoints.push(gaugePoint({
677
+ value: weight,
678
+ valueKey: "asDouble",
679
+ timeUnixNano,
680
+ attributes: [
681
+ ...identityAttributes(identity),
682
+ ...identity.labels,
683
+ inferred,
684
+ ],
685
+ }));
686
+ }
687
+ }
688
+ if (upPoints.length === 0) {
689
+ return;
690
+ }
691
+ scopeMetrics.push({
692
+ scope: { name: PROXMOX_SIBLING_REPORT_SCOPE_NAME, version: "1" },
693
+ metrics: [
694
+ { name: "pve_up", gauge: { dataPoints: upPoints } },
695
+ { name: "pve_node_info", gauge: { dataPoints: infoPoints } },
696
+ ],
697
+ });
698
+ }
699
+ //# sourceMappingURL=ProxmoxNativePush.js.map