@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
@@ -30,6 +30,7 @@ import UserService from "../../../Services/UserService";
30
30
  import QueryHelper from "../../../Types/Database/QueryHelper";
31
31
  import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
32
32
  import LIMIT_MAX from "../../../../Types/Database/LimitMax";
33
+ import { truncateToLength } from "../../Database/TruncateColumnValue";
33
34
  // Bot Framework SDK imports
34
35
  import { CloudAdapter, ConfigurationBotFrameworkAuthentication, TeamsActivityHandler, TeamsInfo, MessageFactory, } from "botbuilder";
35
36
  import MicrosoftTeamsServiceUrl from "./MicrosoftTeamsServiceUrl";
@@ -79,6 +80,38 @@ export var MicrosoftTeamsAppInstallState;
79
80
  * literal too.
80
81
  */
81
82
  export const MICROSOFT_TEAMS_INSTALL_READ_PERMISSION = "TeamsAppInstallation.ReadForTeam.All";
83
+ /*
84
+ * The resource-specific (per chat) permission that lets OneUptime read a group
85
+ * chat's name (its Graph "topic") with the app-only token. Bot Framework
86
+ * activities from group chats do not reliably carry the name, so without this
87
+ * a group chat can only be named after its members. It is granted per chat
88
+ * when the app is installed or updated there with a manifest that requests it.
89
+ * (The tenant-wide Chat.ReadBasic.WhereInstalled application permission works
90
+ * with the same call, for admins who would rather grant it once.)
91
+ */
92
+ export const MICROSOFT_TEAMS_CHAT_TOPIC_READ_PERMISSION = "ChatSettings.Read.Chat";
93
+ export var MicrosoftTeamsChatTopicLookupStatus;
94
+ (function (MicrosoftTeamsChatTopicLookupStatus) {
95
+ MicrosoftTeamsChatTopicLookupStatus["Found"] = "Found";
96
+ MicrosoftTeamsChatTopicLookupStatus["NoTopic"] = "NoTopic";
97
+ MicrosoftTeamsChatTopicLookupStatus["PermissionDenied"] = "PermissionDenied";
98
+ MicrosoftTeamsChatTopicLookupStatus["Unknown"] = "Unknown";
99
+ })(MicrosoftTeamsChatTopicLookupStatus || (MicrosoftTeamsChatTopicLookupStatus = {}));
100
+ // How many Graph chat lookups Refresh Chats runs at once.
101
+ const MICROSOFT_TEAMS_CHAT_TOPIC_LOOKUP_CONCURRENCY = 5;
102
+ /*
103
+ * Per-lookup ceiling. Concurrent refreshes of a project share one run, so a
104
+ * lookup that never answers would otherwise hold every later Refresh Chats
105
+ * for that project.
106
+ */
107
+ const MICROSOFT_TEAMS_CHAT_TOPIC_LOOKUP_TIMEOUT_IN_MS = 15000;
108
+ /*
109
+ * Chat names are kept well under the 100-character ShortText columns that
110
+ * store them in notification logs — Teams chat names can be much longer.
111
+ */
112
+ const MICROSOFT_TEAMS_CHAT_NAME_MAX_LENGTH = 80;
113
+ // How many member names a group chat named after its members shows.
114
+ const MICROSOFT_TEAMS_CHAT_NAME_MEMBERS_SHOWN = 3;
82
115
  /*
83
116
  * Microsoft's wording when the Bot Framework refuses a proactive post because
84
117
  * the app is not a member of the target conversation. Matched case-insensitively
@@ -3167,36 +3200,117 @@ All monitoring checks are passing normally.`;
3167
3200
  return null; // channels and meetings are not chats.
3168
3201
  }
3169
3202
  static getChatDisplayName(data) {
3170
- /*
3171
- * Keep well under the 100-char ShortText columns that store the chat
3172
- * name in notification logs — Teams chat topics can be much longer.
3173
- */
3174
- const maxNameLength = 80;
3175
3203
  const truncate = (name) => {
3176
- return name.length > maxNameLength
3177
- ? `${name.substring(0, maxNameLength - 1)}…`
3178
- : name;
3204
+ if (name.length <= MICROSOFT_TEAMS_CHAT_NAME_MAX_LENGTH) {
3205
+ return name;
3206
+ }
3207
+ /*
3208
+ * Cut by UTF-16 code units, but never between the two halves of an
3209
+ * emoji: a lone surrogate makes Postgres refuse the whole jsonb write
3210
+ * that carries the name.
3211
+ */
3212
+ return `${truncateToLength(name, MICROSOFT_TEAMS_CHAT_NAME_MAX_LENGTH - 1)}…`;
3179
3213
  };
3180
3214
  if (data.topic && data.topic.trim()) {
3181
3215
  return truncate(data.topic.trim());
3182
3216
  }
3183
- const memberNames = data.memberNames.filter((name) => {
3184
- return Boolean(name && name.trim());
3185
- });
3217
+ const memberNames = this.getNonBlankNames(data.memberNames);
3186
3218
  if (data.chatType === "personal") {
3187
3219
  return memberNames[0] ? truncate(`${memberNames[0]}`) : "Personal chat";
3188
3220
  }
3189
3221
  if (memberNames.length === 0) {
3190
3222
  return "Group chat";
3191
3223
  }
3192
- const maxNamesToShow = 3;
3193
- const shownNames = memberNames.slice(0, maxNamesToShow);
3194
- const remainingCount = memberNames.length - shownNames.length;
3224
+ const shownNames = memberNames.slice(0, MICROSOFT_TEAMS_CHAT_NAME_MEMBERS_SHOWN);
3225
+ const memberCount = Math.max(data.memberCount || 0, memberNames.length);
3226
+ const remainingCount = memberCount - shownNames.length;
3195
3227
  if (remainingCount > 0) {
3196
3228
  return truncate(`${shownNames.join(", ")} + ${remainingCount} more`);
3197
3229
  }
3198
3230
  return truncate(shownNames.join(", "));
3199
3231
  }
3232
+ static getNonBlankNames(names) {
3233
+ return names.filter((name) => {
3234
+ return Boolean(name && name.trim());
3235
+ });
3236
+ }
3237
+ /*
3238
+ * Builds the record to store for a chat that was just heard from, on top of
3239
+ * what is already stored. Whatever could not be read this time — the name
3240
+ * (Graph refused, failed, or was not asked) or the roster (the Bot Framework
3241
+ * call failed) — is taken from the stored record instead of being dropped:
3242
+ * a failed lookup must never turn a chat's real name back into member
3243
+ * names, or member names into a bare "Group chat".
3244
+ */
3245
+ static buildCapturedChat(data) {
3246
+ var _a, _b, _c;
3247
+ const storedChat = data.storedChat;
3248
+ const activityTopic = (data.activityTopic || "").trim();
3249
+ const lookupStatus = (_a = data.topicLookup) === null || _a === void 0 ? void 0 : _a.status;
3250
+ const topicCleared = !activityTopic &&
3251
+ lookupStatus === MicrosoftTeamsChatTopicLookupStatus.NoTopic;
3252
+ let topic = undefined;
3253
+ if (activityTopic) {
3254
+ topic = activityTopic;
3255
+ }
3256
+ else if (lookupStatus === MicrosoftTeamsChatTopicLookupStatus.Found) {
3257
+ topic = (_b = data.topicLookup) === null || _b === void 0 ? void 0 : _b.topic;
3258
+ }
3259
+ else if (!topicCleared) {
3260
+ topic = storedChat === null || storedChat === void 0 ? void 0 : storedChat.topic; // not read this time: keep the last known name.
3261
+ }
3262
+ let memberNames = (_c = storedChat === null || storedChat === void 0 ? void 0 : storedChat.memberNames) === null || _c === void 0 ? void 0 : _c.slice(0, MICROSOFT_TEAMS_CHAT_NAME_MEMBERS_SHOWN);
3263
+ let memberCount = storedChat === null || storedChat === void 0 ? void 0 : storedChat.memberCount;
3264
+ let memberAadObjectIds = (storedChat === null || storedChat === void 0 ? void 0 : storedChat.memberAadObjectIds) || [];
3265
+ if (data.roster) {
3266
+ const names = this.getNonBlankNames(data.roster.memberNames);
3267
+ memberNames = names.slice(0, MICROSOFT_TEAMS_CHAT_NAME_MEMBERS_SHOWN);
3268
+ memberCount = names.length;
3269
+ memberAadObjectIds = data.roster.memberAadObjectIds;
3270
+ }
3271
+ let name;
3272
+ if (topic || (memberNames && memberNames.length > 0)) {
3273
+ name = this.getChatDisplayName({
3274
+ chatType: data.chatType,
3275
+ topic: topic,
3276
+ memberNames: memberNames || [],
3277
+ memberCount: memberCount,
3278
+ });
3279
+ }
3280
+ else if ((storedChat === null || storedChat === void 0 ? void 0 : storedChat.name) && !(topicCleared && storedChat.topic)) {
3281
+ /*
3282
+ * Nothing to build a name from this time. The stored name is still the
3283
+ * best there is — unless it was the Teams name, and Teams just said the
3284
+ * chat no longer has one.
3285
+ */
3286
+ name = storedChat.name;
3287
+ }
3288
+ else {
3289
+ name = this.getChatDisplayName({
3290
+ chatType: data.chatType,
3291
+ memberNames: [],
3292
+ });
3293
+ }
3294
+ const chat = {
3295
+ id: data.chatId,
3296
+ name: name,
3297
+ chatType: data.chatType,
3298
+ serviceUrl: data.serviceUrl,
3299
+ // When the chat was first connected; hearing from it again is not that.
3300
+ addedAt: (storedChat === null || storedChat === void 0 ? void 0 : storedChat.addedAt) || data.now,
3301
+ memberAadObjectIds: memberAadObjectIds,
3302
+ };
3303
+ if (topic) {
3304
+ chat.topic = topic;
3305
+ }
3306
+ if (memberNames !== undefined) {
3307
+ chat.memberNames = memberNames;
3308
+ }
3309
+ if (memberCount !== undefined) {
3310
+ chat.memberCount = memberCount;
3311
+ }
3312
+ return chat;
3313
+ }
3200
3314
  /*
3201
3315
  * Returns true when every connected project of this tenant already has
3202
3316
  * this chat stored with the same service URL — i.e. there is nothing to
@@ -3239,6 +3353,20 @@ All monitoring checks are passing normally.`;
3239
3353
  (chat.memberAadObjectIds || []).length === 0) {
3240
3354
  return false;
3241
3355
  }
3356
+ /*
3357
+ * Group chats captured before member counts were stored were also
3358
+ * captured before OneUptime asked Graph for their name. Re-capture
3359
+ * them once: that stores the roster (so the name can fall back to the
3360
+ * members if the chat's name is ever removed), and reads the name if
3361
+ * the chat already lets OneUptime read it. Chats the app was added to
3362
+ * with an older manifest only allow that once the app is updated in the
3363
+ * chat, which sends no activity — Refresh Chats picks the name up then.
3364
+ * A roster that could not be read leaves the count unset, so the next
3365
+ * message tries again.
3366
+ */
3367
+ if (chat.chatType === "groupChat" && chat.memberCount === undefined) {
3368
+ return false;
3369
+ }
3242
3370
  }
3243
3371
  return true;
3244
3372
  }
@@ -3281,9 +3409,11 @@ All monitoring checks are passing normally.`;
3281
3409
  }
3282
3410
  }
3283
3411
  // Resolve a human friendly name for the chat.
3284
- const topic = conversation["name"];
3285
- let memberNames = [];
3286
- let memberAadObjectIds = [];
3412
+ const activityTopic = typeof conversation["name"] === "string"
3413
+ ? conversation["name"].trim()
3414
+ : "";
3415
+ // null when the roster could not be read.
3416
+ let roster = null;
3287
3417
  try {
3288
3418
  const botId = (_b = data.turnContext.activity.recipient) === null || _b === void 0 ? void 0 : _b.id;
3289
3419
  /*
@@ -3300,38 +3430,54 @@ All monitoring checks are passing normally.`;
3300
3430
  const humanMembers = members.filter((member) => {
3301
3431
  return member.id !== botId;
3302
3432
  });
3303
- memberNames = humanMembers.map((member) => {
3304
- return member.name || "";
3305
- });
3306
- /*
3307
- * The Entra object id is what maps a chat member back to the
3308
- * OneUptime user who connected that Teams account, so personal chats
3309
- * can serve as direct-message delivery targets.
3310
- */
3311
- memberAadObjectIds = humanMembers
3312
- .map((member) => {
3313
- return member.aadObjectId || "";
3314
- })
3315
- .filter((aadObjectId) => {
3316
- return Boolean(aadObjectId);
3317
- });
3433
+ roster = {
3434
+ memberNames: humanMembers.map((member) => {
3435
+ return member.name || "";
3436
+ }),
3437
+ /*
3438
+ * The Entra object id is what maps a chat member back to the
3439
+ * OneUptime user who connected that Teams account, so personal
3440
+ * chats can serve as direct-message delivery targets.
3441
+ */
3442
+ memberAadObjectIds: humanMembers
3443
+ .map((member) => {
3444
+ return member.aadObjectId || "";
3445
+ })
3446
+ .filter((aadObjectId) => {
3447
+ return Boolean(aadObjectId);
3448
+ }),
3449
+ };
3318
3450
  }
3319
3451
  catch (err) {
3320
3452
  logger.debug("Could not fetch chat members for chat name resolution");
3321
3453
  logger.debug(err);
3322
3454
  }
3323
- const chat = {
3324
- id: chatId,
3325
- name: this.getChatDisplayName({
3326
- chatType: chatType,
3327
- topic: topic,
3328
- memberNames: memberNames,
3329
- }),
3455
+ const tenantChat = await this.getTenantChatContext({
3456
+ tenantId: tenantId,
3457
+ chatId: chatId,
3458
+ });
3459
+ /*
3460
+ * Teams does not reliably put a group chat's name on its activities, so
3461
+ * a named group chat would otherwise be listed by its members. Graph has
3462
+ * the name; ask it. Personal chats have no name to find.
3463
+ */
3464
+ let topicLookup = undefined;
3465
+ if (chatType === "groupChat" && !activityTopic && tenantChat.projectId) {
3466
+ topicLookup = await this.getGroupChatTopicFromGraph({
3467
+ projectId: tenantChat.projectId,
3468
+ chatId: chatId,
3469
+ });
3470
+ }
3471
+ const chat = this.buildCapturedChat({
3472
+ chatId: chatId,
3330
3473
  chatType: chatType,
3331
3474
  serviceUrl: activityServiceUrl,
3332
- addedAt: OneUptimeDate.getCurrentDate().toISOString(),
3333
- memberAadObjectIds: memberAadObjectIds,
3334
- };
3475
+ activityTopic: activityTopic,
3476
+ topicLookup: topicLookup,
3477
+ roster: roster,
3478
+ storedChat: tenantChat.storedChat,
3479
+ now: OneUptimeDate.getCurrentDate().toISOString(),
3480
+ });
3335
3481
  await this.saveChatToProjectAuthTokens({
3336
3482
  tenantId: tenantId,
3337
3483
  chat: chat,
@@ -3440,6 +3586,303 @@ All monitoring checks are passing normally.`;
3440
3586
  });
3441
3587
  }
3442
3588
  }
3589
+ /*
3590
+ * What a bot activity needs to know about its tenant before storing a chat:
3591
+ * any project connected to the tenant (bot activities identify the tenant,
3592
+ * not the project, and every project of a tenant yields the same Graph app
3593
+ * token), and the chat as it is stored now, so a re-capture builds on it.
3594
+ *
3595
+ * A failed read throws: capturing without knowing what is stored would
3596
+ * overwrite a chat's real name with whatever this activity could supply.
3597
+ */
3598
+ static async getTenantChatContext(data) {
3599
+ var _a, _b;
3600
+ let projectId = null;
3601
+ let storedChat = undefined;
3602
+ const projectAuths = await WorkspaceProjectAuthTokenService.findBy({
3603
+ query: {
3604
+ workspaceType: WorkspaceType.MicrosoftTeams,
3605
+ workspaceProjectId: data.tenantId,
3606
+ },
3607
+ select: {
3608
+ _id: true,
3609
+ projectId: true,
3610
+ miscData: true,
3611
+ },
3612
+ limit: LIMIT_MAX,
3613
+ skip: 0,
3614
+ props: {
3615
+ isRoot: true,
3616
+ },
3617
+ });
3618
+ for (const projectAuth of projectAuths) {
3619
+ if (!projectId && projectAuth.projectId) {
3620
+ projectId = projectAuth.projectId;
3621
+ }
3622
+ if (!storedChat) {
3623
+ storedChat = (_b = (_a = projectAuth.miscData) === null || _a === void 0 ? void 0 : _a.availableChats) === null || _b === void 0 ? void 0 : _b[data.chatId];
3624
+ }
3625
+ }
3626
+ return { projectId: projectId, storedChat: storedChat };
3627
+ }
3628
+ /*
3629
+ * Reads a group chat's name from Graph (GET /chats/{id}). Only group chats
3630
+ * are looked up: their Bot Framework conversation id is also their Graph
3631
+ * chat id, and they are the only chats that can be named.
3632
+ *
3633
+ * Never throws. A refusal comes back as PermissionDenied — the app-only
3634
+ * token needs ChatSettings.Read.Chat (granted per chat, and chats the app
3635
+ * was added to before the manifest requested it do not have it) or the
3636
+ * tenant-wide Chat.ReadBasic.WhereInstalled. Pass accessToken when looking
3637
+ * up many chats, so the token is fetched once rather than once per chat.
3638
+ */
3639
+ static async getGroupChatTopicFromGraph(data) {
3640
+ var _a;
3641
+ if (!data.chatId) {
3642
+ return { status: MicrosoftTeamsChatTopicLookupStatus.Unknown };
3643
+ }
3644
+ try {
3645
+ const accessToken = data.accessToken ||
3646
+ (await this.getValidAccessToken({
3647
+ authToken: "",
3648
+ projectId: data.projectId,
3649
+ }));
3650
+ const response = await API.get({
3651
+ url: URL.fromString(`https://graph.microsoft.com/v1.0/chats/${encodeURIComponent(data.chatId)}`),
3652
+ headers: {
3653
+ Authorization: `Bearer ${accessToken}`,
3654
+ "Content-Type": "application/json",
3655
+ },
3656
+ options: {
3657
+ timeout: MICROSOFT_TEAMS_CHAT_TOPIC_LOOKUP_TIMEOUT_IN_MS,
3658
+ },
3659
+ });
3660
+ if (response instanceof HTTPErrorResponse) {
3661
+ if (this.isGraphPermissionDeniedResponse(response)) {
3662
+ logger.debug(`Cannot read the name of Microsoft Teams chat ${data.chatId}: Microsoft Graph denied the request. The OneUptime app in that chat needs the ${MICROSOFT_TEAMS_CHAT_TOPIC_READ_PERMISSION} permission — update the app in the chat so Teams grants it.`);
3663
+ return {
3664
+ status: MicrosoftTeamsChatTopicLookupStatus.PermissionDenied,
3665
+ };
3666
+ }
3667
+ /*
3668
+ * A 404 for a chat the bot is in would mean the Bot Framework
3669
+ * conversation id is not the Graph chat id — worth seeing in
3670
+ * production logs, unlike a passing throttle or outage.
3671
+ */
3672
+ if (response.statusCode === 404) {
3673
+ logger.warn(`Microsoft Graph has no chat with the id of Microsoft Teams chat ${data.chatId}, so its name cannot be read.`);
3674
+ }
3675
+ else {
3676
+ logger.debug(`Could not read Microsoft Teams chat ${data.chatId}:`);
3677
+ logger.debug(response);
3678
+ }
3679
+ return { status: MicrosoftTeamsChatTopicLookupStatus.Unknown };
3680
+ }
3681
+ const topic = (_a = response.data) === null || _a === void 0 ? void 0 : _a["topic"];
3682
+ if (typeof topic === "string" && topic.trim()) {
3683
+ return {
3684
+ status: MicrosoftTeamsChatTopicLookupStatus.Found,
3685
+ topic: topic.trim(),
3686
+ };
3687
+ }
3688
+ return { status: MicrosoftTeamsChatTopicLookupStatus.NoTopic };
3689
+ }
3690
+ catch (err) {
3691
+ logger.debug(`Error reading Microsoft Teams chat ${data.chatId}:`);
3692
+ logger.debug(err);
3693
+ return { status: MicrosoftTeamsChatTopicLookupStatus.Unknown };
3694
+ }
3695
+ }
3696
+ /*
3697
+ * What "Refresh Chats" does. Microsoft does not let an app list chats, but
3698
+ * it does let it read one it is in — so every stored group chat is re-read,
3699
+ * which fixes chats captured under their member names and picks up renames.
3700
+ *
3701
+ * A chat whose name was removed in Teams goes back to its member names when
3702
+ * they were stored with it; otherwise it keeps its current name, unless
3703
+ * that was the removed Teams name. A chat whose name could not be read is
3704
+ * left as it is and reported, so the page can say why.
3705
+ *
3706
+ * Concurrent refreshes of one project (within this App process) share a
3707
+ * single run, so a held-down button costs one pass over the chats, not one
3708
+ * per click.
3709
+ */
3710
+ static async refreshChatNamesForProject(data) {
3711
+ const key = data.projectId.toString();
3712
+ const inFlight = this.chatNameRefreshesInFlight.get(key);
3713
+ if (inFlight) {
3714
+ return inFlight;
3715
+ }
3716
+ const refresh = this.runChatNameRefresh(data).finally(() => {
3717
+ this.chatNameRefreshesInFlight.delete(key);
3718
+ });
3719
+ this.chatNameRefreshesInFlight.set(key, refresh);
3720
+ return refresh;
3721
+ }
3722
+ static async runChatNameRefresh(data) {
3723
+ var _a;
3724
+ const projectAuth = await WorkspaceProjectAuthTokenService.getProjectAuth({
3725
+ projectId: data.projectId,
3726
+ workspaceType: WorkspaceType.MicrosoftTeams,
3727
+ });
3728
+ const storedChats = ((_a = projectAuth === null || projectAuth === void 0 ? void 0 : projectAuth.miscData) === null || _a === void 0 ? void 0 : _a.availableChats) || {};
3729
+ const result = {
3730
+ chats: Object.assign({}, storedChats),
3731
+ permissionDeniedChatIds: [],
3732
+ failedChatIds: [],
3733
+ };
3734
+ const tenantId = projectAuth === null || projectAuth === void 0 ? void 0 : projectAuth.workspaceProjectId;
3735
+ const groupChats = Object.values(storedChats).filter((chat) => {
3736
+ return Boolean(chat && chat.id && chat.chatType === "groupChat");
3737
+ });
3738
+ if (!tenantId || groupChats.length === 0) {
3739
+ return result;
3740
+ }
3741
+ /*
3742
+ * One token for every lookup. Without one nothing can be read, and that
3743
+ * is a failure the caller must see — not a refresh that silently changed
3744
+ * nothing.
3745
+ */
3746
+ const accessToken = await this.getValidAccessToken({
3747
+ authToken: "",
3748
+ projectId: data.projectId,
3749
+ });
3750
+ const updates = {};
3751
+ for (let index = 0; index < groupChats.length; index += MICROSOFT_TEAMS_CHAT_TOPIC_LOOKUP_CONCURRENCY) {
3752
+ const batch = groupChats.slice(index, index + MICROSOFT_TEAMS_CHAT_TOPIC_LOOKUP_CONCURRENCY);
3753
+ const lookups = await Promise.all(batch.map((chat) => {
3754
+ return this.getGroupChatTopicFromGraph({
3755
+ projectId: data.projectId,
3756
+ chatId: chat.id,
3757
+ accessToken: accessToken,
3758
+ });
3759
+ }));
3760
+ batch.forEach((chat, batchIndex) => {
3761
+ const lookup = lookups[batchIndex];
3762
+ if (lookup.status === MicrosoftTeamsChatTopicLookupStatus.PermissionDenied) {
3763
+ result.permissionDeniedChatIds.push(chat.id);
3764
+ return;
3765
+ }
3766
+ if (lookup.status === MicrosoftTeamsChatTopicLookupStatus.Unknown) {
3767
+ result.failedChatIds.push(chat.id);
3768
+ return;
3769
+ }
3770
+ const update = this.getChatNameUpdate({
3771
+ chat: chat,
3772
+ lookup: lookup,
3773
+ });
3774
+ if (update.name !== chat.name || update.topic !== chat.topic) {
3775
+ updates[chat.id] = update;
3776
+ }
3777
+ });
3778
+ }
3779
+ if (Object.keys(updates).length > 0) {
3780
+ await this.renameChatsInProjectAuthTokens({
3781
+ tenantId: tenantId,
3782
+ chatNames: updates,
3783
+ });
3784
+ }
3785
+ /*
3786
+ * What is stored now, whether or not anything was renamed: a chat
3787
+ * removed while names were being read is gone, and is not reported.
3788
+ */
3789
+ result.chats = await this.getChatsForProject({
3790
+ projectId: data.projectId,
3791
+ });
3792
+ return result;
3793
+ }
3794
+ // The name a stored group chat gets from a lookup that Graph answered.
3795
+ static getChatNameUpdate(data) {
3796
+ const chat = data.chat;
3797
+ if (data.lookup.status === MicrosoftTeamsChatTopicLookupStatus.Found &&
3798
+ data.lookup.topic) {
3799
+ return {
3800
+ name: this.getChatDisplayName({
3801
+ chatType: chat.chatType,
3802
+ topic: data.lookup.topic,
3803
+ memberNames: [],
3804
+ }),
3805
+ topic: data.lookup.topic,
3806
+ };
3807
+ }
3808
+ // The chat has no name in Teams.
3809
+ if (chat.memberNames && chat.memberNames.length > 0) {
3810
+ return {
3811
+ name: this.getChatDisplayName({
3812
+ chatType: chat.chatType,
3813
+ memberNames: chat.memberNames,
3814
+ memberCount: chat.memberCount,
3815
+ }),
3816
+ };
3817
+ }
3818
+ /*
3819
+ * No members to name it after. Keep the current name — unless it was the
3820
+ * Teams name that has just been removed.
3821
+ */
3822
+ return {
3823
+ name: chat.topic
3824
+ ? this.getChatDisplayName({ chatType: chat.chatType, memberNames: [] })
3825
+ : chat.name,
3826
+ };
3827
+ }
3828
+ /*
3829
+ * Sets the name (and the Teams name it came from) of chats already stored
3830
+ * for a tenant, on every connected project. Only those fields are written,
3831
+ * onto each record as it is now — a chat removed or re-captured while names
3832
+ * were being looked up is neither resurrected nor rolled back.
3833
+ */
3834
+ static async renameChatsInProjectAuthTokens(data) {
3835
+ const projectAuths = await WorkspaceProjectAuthTokenService.findBy({
3836
+ query: {
3837
+ workspaceType: WorkspaceType.MicrosoftTeams,
3838
+ workspaceProjectId: data.tenantId,
3839
+ },
3840
+ select: {
3841
+ _id: true,
3842
+ miscData: true,
3843
+ },
3844
+ limit: LIMIT_MAX,
3845
+ skip: 0,
3846
+ props: {
3847
+ isRoot: true,
3848
+ },
3849
+ });
3850
+ for (const projectAuth of projectAuths) {
3851
+ const miscData = Object.assign({}, (projectAuth.miscData || {}));
3852
+ const availableChats = Object.assign({}, (miscData.availableChats || {}));
3853
+ let changed = false;
3854
+ for (const [chatId, update] of Object.entries(data.chatNames)) {
3855
+ const existingChat = availableChats[chatId];
3856
+ if (!existingChat ||
3857
+ (existingChat.name === update.name &&
3858
+ existingChat.topic === update.topic)) {
3859
+ continue;
3860
+ }
3861
+ const renamedChat = Object.assign(Object.assign({}, existingChat), { name: update.name });
3862
+ if (update.topic) {
3863
+ renamedChat.topic = update.topic;
3864
+ }
3865
+ else {
3866
+ delete renamedChat.topic;
3867
+ }
3868
+ availableChats[chatId] = renamedChat;
3869
+ changed = true;
3870
+ }
3871
+ if (!changed) {
3872
+ continue;
3873
+ }
3874
+ miscData.availableChats = availableChats;
3875
+ await WorkspaceProjectAuthTokenService.updateOneById({
3876
+ id: projectAuth.id,
3877
+ data: {
3878
+ miscData: miscData,
3879
+ },
3880
+ props: {
3881
+ isRoot: true,
3882
+ },
3883
+ });
3884
+ }
3885
+ }
3443
3886
  static async getChatsForProject(data) {
3444
3887
  const projectAuth = await WorkspaceProjectAuthTokenService.getProjectAuth({
3445
3888
  projectId: data.projectId,
@@ -4323,6 +4766,8 @@ MicrosoftTeamsUtil.AI_OPS_ACK_TEXT = "Looking into it…";
4323
4766
  * engine also clamps history internally, but we keep the payload small.
4324
4767
  */
4325
4768
  MicrosoftTeamsUtil.AI_OPS_MAX_HISTORY_TURNS = 12;
4769
+ // Refreshes in progress, by project: a second click joins the first.
4770
+ MicrosoftTeamsUtil.chatNameRefreshesInFlight = new Map();
4326
4771
  export default MicrosoftTeamsUtil;
4327
4772
  __decorate([
4328
4773
  CaptureSpan(),
@@ -4618,6 +5063,24 @@ __decorate([
4618
5063
  __metadata("design:paramtypes", [Object]),
4619
5064
  __metadata("design:returntype", Promise)
4620
5065
  ], MicrosoftTeamsUtil, "removeChatFromProjectAuthTokens", null);
5066
+ __decorate([
5067
+ CaptureSpan(),
5068
+ __metadata("design:type", Function),
5069
+ __metadata("design:paramtypes", [Object]),
5070
+ __metadata("design:returntype", Promise)
5071
+ ], MicrosoftTeamsUtil, "getGroupChatTopicFromGraph", null);
5072
+ __decorate([
5073
+ CaptureSpan(),
5074
+ __metadata("design:type", Function),
5075
+ __metadata("design:paramtypes", [Object]),
5076
+ __metadata("design:returntype", Promise)
5077
+ ], MicrosoftTeamsUtil, "runChatNameRefresh", null);
5078
+ __decorate([
5079
+ CaptureSpan(),
5080
+ __metadata("design:type", Function),
5081
+ __metadata("design:paramtypes", [Object]),
5082
+ __metadata("design:returntype", Promise)
5083
+ ], MicrosoftTeamsUtil, "renameChatsInProjectAuthTokens", null);
4621
5084
  __decorate([
4622
5085
  CaptureSpan(),
4623
5086
  __metadata("design:type", Function),