@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,622 @@
1
+ import { AddTeamComplianceRuleScope1796000000000 } from "../../../../Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope";
2
+ import SchemaMigrations from "../../../../Server/Infrastructure/Postgres/SchemaMigrations/Index";
3
+ import TeamComplianceSetting from "../../../../Models/DatabaseModels/TeamComplianceSetting";
4
+ import ColumnLength from "../../../../Types/Database/ColumnLength";
5
+ import ColumnType from "../../../../Types/Database/ColumnType";
6
+ import { describe, expect, test } from "@jest/globals";
7
+ import fs from "fs";
8
+ import path from "path";
9
+ import {
10
+ DefaultNamingStrategy,
11
+ QueryRunner,
12
+ getMetadataArgsStorage,
13
+ } from "typeorm";
14
+ import type { ColumnMetadataArgs } from "typeorm/metadata-args/ColumnMetadataArgs";
15
+ import type { IndexMetadataArgs } from "typeorm/metadata-args/IndexMetadataArgs";
16
+ import type { JoinTableMetadataArgs } from "typeorm/metadata-args/JoinTableMetadataArgs";
17
+
18
+ /*
19
+ * The schema half of severity- and channel-scoped team compliance rules.
20
+ *
21
+ * - TeamComplianceSetting.notificationChannel: nullable, no default, so every
22
+ * existing rule reads as "any channel" - exactly what it checked before.
23
+ * - TeamComplianceSettingIncidentSeverity / ...AlertSeverity: the severities
24
+ * an on-call rule is scoped to; empty means every severity, which is again
25
+ * what every existing rule checked. Both cascade from BOTH ends.
26
+ * - The unique ("teamId", "ruleType") index goes, because "Call for Critical
27
+ * incidents" and "Push for Critical incidents" are both
28
+ * HasIncidentOnCallRules on one team. Dropping it only relaxes a
29
+ * constraint, so no existing row can make the migration fail.
30
+ *
31
+ * The migration was generated against the model, so its names are TypeORM's
32
+ * by construction; this pins that it STAYS so (a hand edit renaming a
33
+ * constraint passes review and fails the post-deploy Schema Drift job), that
34
+ * nothing outside the rule table rode along, that up() rewrites no rows, and
35
+ * that down() undoes up() in reverse. Fake QueryRunner only.
36
+ */
37
+
38
+ const OWN_CLASS_NAME: string = "AddTeamComplianceRuleScope1796000000000";
39
+
40
+ const MIGRATIONS_DIRECTORY: string = path.join(
41
+ __dirname,
42
+ "..",
43
+ "..",
44
+ "..",
45
+ "..",
46
+ "Server",
47
+ "Infrastructure",
48
+ "Postgres",
49
+ "SchemaMigrations",
50
+ );
51
+
52
+ const MIGRATION_FILE_NAME: string =
53
+ "1796000000000-AddTeamComplianceRuleScope.ts";
54
+
55
+ const MIGRATION_PATH: string = path.join(
56
+ MIGRATIONS_DIRECTORY,
57
+ MIGRATION_FILE_NAME,
58
+ );
59
+
60
+ const RULE_TABLE: string = "TeamComplianceSetting";
61
+
62
+ const namingStrategy: DefaultNamingStrategy = new DefaultNamingStrategy();
63
+
64
+ // The unique index the original TeamComplianceSetting migration created.
65
+ const UNIQUE_RULE_TYPE_INDEX: string = namingStrategy.indexName(RULE_TABLE, [
66
+ "teamId",
67
+ "ruleType",
68
+ ]);
69
+
70
+ type RecordQueriesFunction = (
71
+ direction: "up" | "down",
72
+ ) => Promise<Array<string>>;
73
+
74
+ const recordQueries: RecordQueriesFunction = async (
75
+ direction: "up" | "down",
76
+ ): Promise<Array<string>> => {
77
+ const statements: Array<string> = [];
78
+
79
+ const queryRunner: QueryRunner = {
80
+ query: (statement: string): Promise<void> => {
81
+ statements.push(statement);
82
+ return Promise.resolve();
83
+ },
84
+ } as unknown as QueryRunner;
85
+
86
+ await new AddTeamComplianceRuleScope1796000000000()[direction](queryRunner);
87
+
88
+ return statements;
89
+ };
90
+
91
+ const registeredNames: Array<string> = (
92
+ SchemaMigrations as unknown as Array<{ name: string }>
93
+ ).map((migration: { name: string }): string => {
94
+ return migration.name;
95
+ });
96
+
97
+ type TimestampOfFunction = (className: string) => number | null;
98
+
99
+ const timestampOf: TimestampOfFunction = (className: string): number | null => {
100
+ const match: RegExpMatchArray | null = className.match(/(\d{13})$/);
101
+ return match ? Number(match[1]) : null;
102
+ };
103
+
104
+ interface JoinTableSpec {
105
+ propertyName: string;
106
+ tableName: string;
107
+ ownerColumn: string;
108
+ relatedColumn: string;
109
+ relatedTable: string;
110
+ }
111
+
112
+ const JOIN_TABLES: Array<JoinTableSpec> = [
113
+ {
114
+ propertyName: "incidentSeverities",
115
+ tableName: "TeamComplianceSettingIncidentSeverity",
116
+ ownerColumn: "teamComplianceSettingId",
117
+ relatedColumn: "incidentSeverityId",
118
+ relatedTable: "IncidentSeverity",
119
+ },
120
+ {
121
+ propertyName: "alertSeverities",
122
+ tableName: "TeamComplianceSettingAlertSeverity",
123
+ ownerColumn: "teamComplianceSettingId",
124
+ relatedColumn: "alertSeverityId",
125
+ relatedTable: "AlertSeverity",
126
+ },
127
+ ];
128
+
129
+ type ForeignKeyStatementFunction = (
130
+ statements: Array<string>,
131
+ tableName: string,
132
+ columnName: string,
133
+ ) => string;
134
+
135
+ const foreignKeyStatement: ForeignKeyStatementFunction = (
136
+ statements: Array<string>,
137
+ tableName: string,
138
+ columnName: string,
139
+ ): string => {
140
+ const name: string = namingStrategy.foreignKeyName(tableName, [columnName]);
141
+
142
+ const matches: Array<string> = statements.filter(
143
+ (statement: string): boolean => {
144
+ return statement.startsWith(
145
+ `ALTER TABLE "${tableName}" ADD CONSTRAINT "${name}" FOREIGN KEY ("${columnName}")`,
146
+ );
147
+ },
148
+ );
149
+
150
+ expect({ tableName, columnName, found: matches.length }).toEqual({
151
+ tableName,
152
+ columnName,
153
+ found: 1,
154
+ });
155
+
156
+ return matches[0]!;
157
+ };
158
+
159
+ /*
160
+ * What a statement creates and what drops it again, as one comparable key:
161
+ * "table:X", "index:X", "constraint:T.X", "column:T.X".
162
+ */
163
+ type ObjectKeyFunction = (statement: string) => string | null;
164
+
165
+ const createdObject: ObjectKeyFunction = (statement: string): string | null => {
166
+ let match: RegExpMatchArray | null = statement.match(
167
+ /^CREATE TABLE "([^"]+)"/,
168
+ );
169
+
170
+ if (match) {
171
+ return `table:${match[1]}`;
172
+ }
173
+
174
+ match = statement.match(/^CREATE (?:UNIQUE )?INDEX "([^"]+)"/);
175
+
176
+ if (match) {
177
+ return `index:${match[1]}`;
178
+ }
179
+
180
+ match = statement.match(/^ALTER TABLE "([^"]+)" ADD CONSTRAINT "([^"]+)"/);
181
+
182
+ if (match) {
183
+ return `constraint:${match[1]}.${match[2]}`;
184
+ }
185
+
186
+ match = statement.match(/^ALTER TABLE "([^"]+)" ADD "([^"]+)"/);
187
+
188
+ if (match) {
189
+ return `column:${match[1]}.${match[2]}`;
190
+ }
191
+
192
+ return null;
193
+ };
194
+
195
+ const droppedObject: ObjectKeyFunction = (statement: string): string | null => {
196
+ let match: RegExpMatchArray | null = statement.match(/^DROP TABLE "([^"]+)"/);
197
+
198
+ if (match) {
199
+ return `table:${match[1]}`;
200
+ }
201
+
202
+ match = statement.match(/^DROP INDEX "public"\."([^"]+)"/);
203
+
204
+ if (match) {
205
+ return `index:${match[1]}`;
206
+ }
207
+
208
+ match = statement.match(/^ALTER TABLE "([^"]+)" DROP CONSTRAINT "([^"]+)"/);
209
+
210
+ if (match) {
211
+ return `constraint:${match[1]}.${match[2]}`;
212
+ }
213
+
214
+ match = statement.match(/^ALTER TABLE "([^"]+)" DROP COLUMN "([^"]+)"/);
215
+
216
+ if (match) {
217
+ return `column:${match[1]}.${match[2]}`;
218
+ }
219
+
220
+ return null;
221
+ };
222
+
223
+ type KeysFunction = (
224
+ statements: Array<string>,
225
+ keyOf: ObjectKeyFunction,
226
+ ) => Array<string>;
227
+
228
+ const keysOf: KeysFunction = (
229
+ statements: Array<string>,
230
+ keyOf: ObjectKeyFunction,
231
+ ): Array<string> => {
232
+ return statements
233
+ .map((statement: string): string | null => {
234
+ return keyOf(statement);
235
+ })
236
+ .filter((key: string | null): key is string => {
237
+ return Boolean(key);
238
+ });
239
+ };
240
+
241
+ describe("AddTeamComplianceRuleScope migration - identity and registration", () => {
242
+ test("lives at its round stamp, with a class and name that carry it", () => {
243
+ const source: string = fs.readFileSync(MIGRATION_PATH, "utf8");
244
+
245
+ expect(source).toContain(`export class ${OWN_CLASS_NAME}`);
246
+ expect(source).toContain(`public name: string = "${OWN_CLASS_NAME}";`);
247
+ expect(new AddTeamComplianceRuleScope1796000000000().name).toBe(
248
+ OWN_CLASS_NAME,
249
+ );
250
+ });
251
+
252
+ test("is registered exactly once", () => {
253
+ expect(
254
+ registeredNames.filter((name: string): boolean => {
255
+ return name === OWN_CLASS_NAME;
256
+ }),
257
+ ).toHaveLength(1);
258
+ });
259
+
260
+ test("runs after every migration registered before it, and before every one registered after it", () => {
261
+ /*
262
+ * A fresh install runs the list in order, an existing one runs whatever
263
+ * it has not recorded; both only agree if the timestamps rise along the
264
+ * list around this entry.
265
+ */
266
+ const ownIndex: number = registeredNames.indexOf(OWN_CLASS_NAME);
267
+ const ownTimestamp: number = timestampOf(OWN_CLASS_NAME)!;
268
+
269
+ expect(
270
+ registeredNames.slice(0, ownIndex).filter((name: string): boolean => {
271
+ const timestamp: number | null = timestampOf(name);
272
+ return timestamp !== null && timestamp >= ownTimestamp;
273
+ }),
274
+ ).toEqual([]);
275
+
276
+ expect(
277
+ registeredNames.slice(ownIndex + 1).filter((name: string): boolean => {
278
+ const timestamp: number | null = timestampOf(name);
279
+ return timestamp === null || timestamp <= ownTimestamp;
280
+ }),
281
+ ).toEqual([]);
282
+
283
+ // It was registered straight after the newest migration of its time.
284
+ expect(registeredNames[ownIndex - 1]).toBe(
285
+ "AddSubscriberNotificationClaimedAt1795900000000",
286
+ );
287
+ });
288
+
289
+ test("the wall-clock file typeorm generated was not left behind", () => {
290
+ expect(
291
+ fs
292
+ .readdirSync(MIGRATIONS_DIRECTORY)
293
+ .filter((fileName: string): boolean => {
294
+ return (
295
+ fileName.endsWith("-AddTeamComplianceRuleScope.ts") &&
296
+ fileName !== MIGRATION_FILE_NAME
297
+ );
298
+ }),
299
+ ).toEqual([]);
300
+ });
301
+ });
302
+
303
+ describe("AddTeamComplianceRuleScope migration - the unique (teamId, ruleType) index", () => {
304
+ test("up() drops exactly the unique index the original migration created", async () => {
305
+ const original: string = fs.readFileSync(
306
+ path.join(MIGRATIONS_DIRECTORY, "1758629540993-MigrationName.ts"),
307
+ "utf8",
308
+ );
309
+
310
+ expect(UNIQUE_RULE_TYPE_INDEX).toBe("IDX_ef7342919ff02501c2b0ddc029");
311
+ expect(original).toContain(
312
+ `CREATE UNIQUE INDEX "${UNIQUE_RULE_TYPE_INDEX}" ON "${RULE_TABLE}" ("teamId", "ruleType") `,
313
+ );
314
+
315
+ const dropped: Array<string> = (await recordQueries("up")).filter(
316
+ (statement: string): boolean => {
317
+ return statement.startsWith("DROP ");
318
+ },
319
+ );
320
+
321
+ expect(dropped).toEqual([
322
+ `DROP INDEX "public"."${UNIQUE_RULE_TYPE_INDEX}"`,
323
+ ]);
324
+ });
325
+
326
+ test("the model no longer declares a unique index over the rule type", () => {
327
+ const indexes: Array<IndexMetadataArgs> =
328
+ getMetadataArgsStorage().indices.filter(
329
+ (index: IndexMetadataArgs): boolean => {
330
+ return index.target === TeamComplianceSetting;
331
+ },
332
+ );
333
+
334
+ // The scan sees the model's indexes: the plain projectId / teamId ones.
335
+ expect(indexes.length).toBeGreaterThanOrEqual(2);
336
+
337
+ expect(
338
+ indexes.filter((index: IndexMetadataArgs): boolean => {
339
+ return Boolean(index.unique);
340
+ }),
341
+ ).toEqual([]);
342
+ });
343
+
344
+ test("down() puts the unique index back, last, once the join tables are gone", async () => {
345
+ /*
346
+ * Rolling back is only possible while no team holds two rules of one
347
+ * type - which is inherent: the old schema cannot represent them.
348
+ */
349
+ const down: Array<string> = await recordQueries("down");
350
+
351
+ expect(down[down.length - 1]).toBe(
352
+ `CREATE UNIQUE INDEX "${UNIQUE_RULE_TYPE_INDEX}" ON "${RULE_TABLE}" ("teamId", "ruleType") `,
353
+ );
354
+ });
355
+ });
356
+
357
+ describe("AddTeamComplianceRuleScope migration - notificationChannel", () => {
358
+ test("is added as the model declares it: varchar(100), nullable, no default", async () => {
359
+ const declared: ColumnMetadataArgs | undefined =
360
+ getMetadataArgsStorage().columns.find(
361
+ (column: ColumnMetadataArgs): boolean => {
362
+ return (
363
+ column.target === TeamComplianceSetting &&
364
+ column.propertyName === "notificationChannel"
365
+ );
366
+ },
367
+ );
368
+
369
+ expect(declared?.options.type).toBe(ColumnType.ShortText);
370
+ expect(declared?.options.length).toBe(ColumnLength.ShortText);
371
+ expect(ColumnLength.ShortText).toBe(100);
372
+ expect(declared?.options.nullable).toBe(true);
373
+ expect(declared?.options.default).toBeUndefined();
374
+
375
+ const added: Array<string> = (await recordQueries("up")).filter(
376
+ (statement: string): boolean => {
377
+ return statement.startsWith(`ALTER TABLE "${RULE_TABLE}" ADD "`);
378
+ },
379
+ );
380
+
381
+ // Existing rules read as "any channel"; adding it rewrites nothing.
382
+ expect(added).toEqual([
383
+ `ALTER TABLE "${RULE_TABLE}" ADD "notificationChannel" character varying(100)`,
384
+ ]);
385
+ });
386
+
387
+ test("down() drops it", async () => {
388
+ expect(await recordQueries("down")).toContain(
389
+ `ALTER TABLE "${RULE_TABLE}" DROP COLUMN "notificationChannel"`,
390
+ );
391
+ });
392
+ });
393
+
394
+ describe("AddTeamComplianceRuleScope migration - the severity join tables", () => {
395
+ test.each(JOIN_TABLES)(
396
+ "$tableName matches the model's @JoinTable declaration",
397
+ (spec: JoinTableSpec) => {
398
+ const declared: JoinTableMetadataArgs | undefined =
399
+ getMetadataArgsStorage().joinTables.find(
400
+ (joinTable: JoinTableMetadataArgs): boolean => {
401
+ return (
402
+ joinTable.target === TeamComplianceSetting &&
403
+ joinTable.propertyName === spec.propertyName
404
+ );
405
+ },
406
+ );
407
+
408
+ expect(declared?.name).toBe(spec.tableName);
409
+ expect(declared?.joinColumns?.[0]?.name).toBe(spec.ownerColumn);
410
+ expect(declared?.joinColumns?.[0]?.referencedColumnName).toBe("_id");
411
+ expect(declared?.inverseJoinColumns?.[0]?.name).toBe(spec.relatedColumn);
412
+ expect(declared?.inverseJoinColumns?.[0]?.referencedColumnName).toBe(
413
+ "_id",
414
+ );
415
+ },
416
+ );
417
+
418
+ test.each(JOIN_TABLES)(
419
+ "$tableName is created with a composite primary key under TypeORM's name",
420
+ async (spec: JoinTableSpec) => {
421
+ const primaryKeyName: string = namingStrategy.primaryKeyName(
422
+ spec.tableName,
423
+ [spec.ownerColumn, spec.relatedColumn],
424
+ );
425
+
426
+ expect(await recordQueries("up")).toContain(
427
+ `CREATE TABLE "${spec.tableName}" ("${spec.ownerColumn}" uuid NOT NULL, "${spec.relatedColumn}" uuid NOT NULL, CONSTRAINT "${primaryKeyName}" PRIMARY KEY ("${spec.ownerColumn}", "${spec.relatedColumn}"))`,
428
+ );
429
+ },
430
+ );
431
+
432
+ test.each(JOIN_TABLES)(
433
+ "$tableName indexes both sides under TypeORM's names",
434
+ async (spec: JoinTableSpec) => {
435
+ const statements: Array<string> = await recordQueries("up");
436
+
437
+ for (const column of [spec.ownerColumn, spec.relatedColumn]) {
438
+ expect(statements).toContain(
439
+ `CREATE INDEX "${namingStrategy.indexName(spec.tableName, [column])}" ON "${spec.tableName}" ("${column}") `,
440
+ );
441
+ }
442
+ },
443
+ );
444
+
445
+ test.each(JOIN_TABLES)(
446
+ "$tableName cascades from BOTH sides: deleting a rule or a severity removes the link",
447
+ async (spec: JoinTableSpec) => {
448
+ /*
449
+ * Deleting a severity must drop it out of a rule's scope rather than be
450
+ * blocked by it, and deleting a rule must not leave orphaned links.
451
+ */
452
+ const statements: Array<string> = await recordQueries("up");
453
+
454
+ expect(
455
+ foreignKeyStatement(statements, spec.tableName, spec.ownerColumn),
456
+ ).toBe(
457
+ `ALTER TABLE "${spec.tableName}" ADD CONSTRAINT "${namingStrategy.foreignKeyName(spec.tableName, [spec.ownerColumn])}" FOREIGN KEY ("${spec.ownerColumn}") REFERENCES "${RULE_TABLE}"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
458
+ );
459
+ expect(
460
+ foreignKeyStatement(statements, spec.tableName, spec.relatedColumn),
461
+ ).toBe(
462
+ `ALTER TABLE "${spec.tableName}" ADD CONSTRAINT "${namingStrategy.foreignKeyName(spec.tableName, [spec.relatedColumn])}" FOREIGN KEY ("${spec.relatedColumn}") REFERENCES "${spec.relatedTable}"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
463
+ );
464
+ },
465
+ );
466
+
467
+ test.each(JOIN_TABLES)(
468
+ "$tableName's foreign keys are added only once both tables exist",
469
+ async (spec: JoinTableSpec) => {
470
+ const statements: Array<string> = await recordQueries("up");
471
+
472
+ const created: number = statements.findIndex(
473
+ (statement: string): boolean => {
474
+ return statement.startsWith(`CREATE TABLE "${spec.tableName}"`);
475
+ },
476
+ );
477
+ const firstForeignKey: number = statements.findIndex(
478
+ (statement: string): boolean => {
479
+ return statement.startsWith(
480
+ `ALTER TABLE "${spec.tableName}" ADD CONSTRAINT`,
481
+ );
482
+ },
483
+ );
484
+
485
+ expect(created).toBeGreaterThanOrEqual(0);
486
+ expect(firstForeignKey).toBeGreaterThan(created);
487
+ },
488
+ );
489
+ });
490
+
491
+ describe("AddTeamComplianceRuleScope migration - scope", () => {
492
+ test("creates exactly the two join tables", async () => {
493
+ const created: Array<string> = keysOf(
494
+ await recordQueries("up"),
495
+ createdObject,
496
+ ).filter((key: string): boolean => {
497
+ return key.startsWith("table:");
498
+ });
499
+
500
+ expect(created.sort()).toEqual(
501
+ JOIN_TABLES.map((spec: JoinTableSpec): string => {
502
+ return `table:${spec.tableName}`;
503
+ }).sort(),
504
+ );
505
+ });
506
+
507
+ test("touches nothing outside the rule table and its join tables", async () => {
508
+ /*
509
+ * A generated migration also sweeps up any unrelated drift between the
510
+ * models and the database it ran against. That belongs to its own change.
511
+ */
512
+ const allowed: Set<string> = new Set<string>([
513
+ RULE_TABLE,
514
+ ...JOIN_TABLES.map((spec: JoinTableSpec): string => {
515
+ return spec.tableName;
516
+ }),
517
+ ]);
518
+
519
+ /*
520
+ * DROP INDEX names no table, so an index is traced to its table by
521
+ * TypeORM's name for it.
522
+ */
523
+ const indexTables: Map<string, string> = new Map<string, string>([
524
+ [UNIQUE_RULE_TYPE_INDEX, RULE_TABLE],
525
+ ]);
526
+
527
+ for (const spec of JOIN_TABLES) {
528
+ for (const column of [spec.ownerColumn, spec.relatedColumn]) {
529
+ indexTables.set(
530
+ namingStrategy.indexName(spec.tableName, [column]),
531
+ spec.tableName,
532
+ );
533
+ }
534
+ }
535
+
536
+ const statements: Array<string> = [
537
+ ...(await recordQueries("up")),
538
+ ...(await recordQueries("down")),
539
+ ];
540
+
541
+ for (const statement of statements) {
542
+ const droppedIndex: string | undefined = statement.match(
543
+ /^DROP INDEX "public"\."([^"]+)"/,
544
+ )?.[1];
545
+
546
+ const touched: string | undefined =
547
+ statement.match(/^ALTER TABLE "([^"]+)"/)?.[1] ||
548
+ statement.match(
549
+ /^CREATE (?:UNIQUE )?INDEX "[^"]+" ON "([^"]+)"/,
550
+ )?.[1] ||
551
+ statement.match(/^(?:CREATE|DROP) TABLE "([^"]+)"/)?.[1] ||
552
+ (droppedIndex ? indexTables.get(droppedIndex) : undefined);
553
+
554
+ expect({
555
+ statement,
556
+ allowed: touched ? allowed.has(touched) : false,
557
+ }).toEqual({ statement, allowed: true });
558
+ }
559
+ });
560
+
561
+ test("up() rewrites no rows", async () => {
562
+ for (const statement of await recordQueries("up")) {
563
+ expect(statement).not.toMatch(/^(UPDATE|DELETE|INSERT)\b/);
564
+ expect(statement).not.toMatch(/\bNOT NULL DEFAULT\b/);
565
+ }
566
+ });
567
+ });
568
+
569
+ describe("AddTeamComplianceRuleScope migration - down() undoes up()", () => {
570
+ test("drops exactly what up() created, and re-creates exactly what up() dropped", async () => {
571
+ const up: Array<string> = await recordQueries("up");
572
+ const down: Array<string> = await recordQueries("down");
573
+
574
+ /*
575
+ * Objects up() creates are dropped by down(); the index up() drops is
576
+ * created by down(). Primary keys go with their tables.
577
+ */
578
+ expect(keysOf(down, droppedObject).sort()).toEqual(
579
+ keysOf(up, createdObject).sort(),
580
+ );
581
+ expect(keysOf(down, createdObject).sort()).toEqual(
582
+ keysOf(up, droppedObject).sort(),
583
+ );
584
+ });
585
+
586
+ test("runs in reverse: constraints before tables, and each index before its table", async () => {
587
+ const down: Array<string> = await recordQueries("down");
588
+
589
+ const lastConstraintDrop: number = Math.max(
590
+ ...down
591
+ .map((statement: string, index: number): number => {
592
+ return statement.includes("DROP CONSTRAINT") ? index : -1;
593
+ })
594
+ .filter((index: number): boolean => {
595
+ return index >= 0;
596
+ }),
597
+ );
598
+
599
+ const firstTableDrop: number = down.findIndex(
600
+ (statement: string): boolean => {
601
+ return statement.startsWith("DROP TABLE");
602
+ },
603
+ );
604
+
605
+ expect(lastConstraintDrop).toBeLessThan(firstTableDrop);
606
+
607
+ for (const spec of JOIN_TABLES) {
608
+ const tableDrop: number = down.indexOf(`DROP TABLE "${spec.tableName}"`);
609
+
610
+ expect(tableDrop).toBeGreaterThanOrEqual(0);
611
+
612
+ for (const column of [spec.ownerColumn, spec.relatedColumn]) {
613
+ const indexDrop: number = down.indexOf(
614
+ `DROP INDEX "public"."${namingStrategy.indexName(spec.tableName, [column])}"`,
615
+ );
616
+
617
+ expect(indexDrop).toBeGreaterThanOrEqual(0);
618
+ expect(indexDrop).toBeLessThan(tableDrop);
619
+ }
620
+ }
621
+ });
622
+ });
@@ -647,14 +647,18 @@ describe("TelemetryIngest browser ingestion key guard", () => {
647
647
 
648
648
  test("a browser key is refused 403 on every other surface, naming the surface and pointing at a server key", async () => {
649
649
  /*
650
- * Ten infrastructure / build-time pipes plus the Kubernetes agent
651
- * Runner registration, which mints a Runner credential and must never
652
- * be reachable with a key scraped off a page.
650
+ * Ten infrastructure / build-time pipes plus the two identity
651
+ * registrations (the Kubernetes agent Runner and the Kubernetes AI
652
+ * agent), which mint cluster credentials and must never be reachable
653
+ * with a key scraped off a page.
653
654
  */
654
- expect(BROWSER_DISALLOWED_SURFACES.length).toBe(11);
655
+ expect(BROWSER_DISALLOWED_SURFACES.length).toBe(12);
655
656
  expect(BROWSER_DISALLOWED_SURFACES).toContain(
656
657
  TelemetryIngestSurface.KubernetesAgentRunner,
657
658
  );
659
+ expect(BROWSER_DISALLOWED_SURFACES).toContain(
660
+ TelemetryIngestSurface.KubernetesAiAgent,
661
+ );
658
662
 
659
663
  for (const surface of BROWSER_DISALLOWED_SURFACES) {
660
664
  jest.clearAllMocks();
@@ -747,6 +751,59 @@ describe("TelemetryIngest browser ingestion key guard", () => {
747
751
  });
748
752
  });
749
753
 
754
+ /*
755
+ * The Kubernetes AI agent registration hands out the agent key every
756
+ * kubectl job for a cluster is claimed with, so it is held to the same
757
+ * bar as the Runner registration above.
758
+ */
759
+ describe("Kubernetes AI agent registration surface", () => {
760
+ test("a browser key is refused 403 even from an allowed origin", async () => {
761
+ resolveTo(buildBrowserPolicy({ allowedOrigins: [ALLOWED_ORIGIN] }));
762
+
763
+ const result: RunResult = await run(
764
+ TelemetryIngestSurface.KubernetesAiAgent,
765
+ tokenHeaders({ origin: ALLOWED_ORIGIN }),
766
+ );
767
+
768
+ expect(result.next).not.toHaveBeenCalled();
769
+
770
+ const error: Error = refusal();
771
+ expect(error).toBeInstanceOf(NotAuthorizedException);
772
+ expect(error.message).toBe(
773
+ "A browser ingestion key cannot be used for Kubernetes AI agent registration. Use a server ingestion key.",
774
+ );
775
+ expect((result.req as TelemetryRequest).projectId).toBeUndefined();
776
+ });
777
+
778
+ test("a server key is admitted and the resolved key policy (with its id) is put on the request", async () => {
779
+ const policy: TelemetryIngestionKeyPolicy = buildPolicy({});
780
+ resolveTo(policy);
781
+
782
+ const result: RunResult = await run(
783
+ TelemetryIngestSurface.KubernetesAiAgent,
784
+ tokenHeaders(),
785
+ );
786
+
787
+ expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
788
+ expect(result.next).toHaveBeenCalledTimes(1);
789
+ expect((result.req as TelemetryRequest).projectId.toString()).toBe(
790
+ PROJECT_ID,
791
+ );
792
+
793
+ /*
794
+ * The registration route records which ingestion key minted the
795
+ * agent's key (KubernetesAiAgent.registeredWithIngestionKeyId) from
796
+ * exactly this.
797
+ */
798
+ expect((result.req as TelemetryRequest).ingestionKeyPolicy).toBe(policy);
799
+ expect(
800
+ (
801
+ result.req as TelemetryRequest
802
+ ).ingestionKeyPolicy.ingestionKeyId.toString(),
803
+ ).toBe(INGESTION_KEY_ID);
804
+ });
805
+ });
806
+
750
807
  describe("browser key origin allowlist", () => {
751
808
  test("a browser key is admitted from an origin on its allowlist", async () => {
752
809
  resolveTo(buildBrowserPolicy({ allowedOrigins: [ALLOWED_ORIGIN] }));