@oneuptime/common 13.0.6 → 13.0.7

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 (589) hide show
  1. package/Models/DatabaseModels/AIAgentOwnerTeam.ts +6 -0
  2. package/Models/DatabaseModels/AIAgentOwnerUser.ts +6 -0
  3. package/Models/DatabaseModels/Alert.ts +12 -0
  4. package/Models/DatabaseModels/AlertEpisodeOwnerTeam.ts +6 -1
  5. package/Models/DatabaseModels/AlertEpisodeOwnerUser.ts +6 -1
  6. package/Models/DatabaseModels/AlertOwnerTeam.ts +6 -1
  7. package/Models/DatabaseModels/AlertOwnerUser.ts +6 -1
  8. package/Models/DatabaseModels/CephClusterOwnerTeam.ts +6 -0
  9. package/Models/DatabaseModels/CephClusterOwnerUser.ts +6 -0
  10. package/Models/DatabaseModels/CloudResourceOwnerTeam.ts +6 -0
  11. package/Models/DatabaseModels/CloudResourceOwnerUser.ts +6 -0
  12. package/Models/DatabaseModels/DashboardOwnerTeam.ts +6 -1
  13. package/Models/DatabaseModels/DashboardOwnerUser.ts +6 -1
  14. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +8 -0
  15. package/Models/DatabaseModels/DockerHostOwnerTeam.ts +6 -0
  16. package/Models/DatabaseModels/DockerHostOwnerUser.ts +6 -0
  17. package/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.ts +6 -0
  18. package/Models/DatabaseModels/DockerSwarmClusterOwnerUser.ts +6 -0
  19. package/Models/DatabaseModels/HostOwnerTeam.ts +6 -0
  20. package/Models/DatabaseModels/HostOwnerUser.ts +6 -0
  21. package/Models/DatabaseModels/Incident.ts +12 -0
  22. package/Models/DatabaseModels/IncidentEpisodeOwnerTeam.ts +6 -1
  23. package/Models/DatabaseModels/IncidentEpisodeOwnerUser.ts +6 -1
  24. package/Models/DatabaseModels/IncidentOwnerTeam.ts +6 -1
  25. package/Models/DatabaseModels/IncidentOwnerUser.ts +6 -1
  26. package/Models/DatabaseModels/IncidentTemplateOwnerTeam.ts +6 -0
  27. package/Models/DatabaseModels/IncidentTemplateOwnerUser.ts +6 -0
  28. package/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.ts +6 -1
  29. package/Models/DatabaseModels/IncomingCallPolicyOwnerUser.ts +6 -1
  30. package/Models/DatabaseModels/IoTFleetOwnerTeam.ts +6 -0
  31. package/Models/DatabaseModels/IoTFleetOwnerUser.ts +6 -0
  32. package/Models/DatabaseModels/KubernetesClusterOwnerTeam.ts +6 -0
  33. package/Models/DatabaseModels/KubernetesClusterOwnerUser.ts +6 -0
  34. package/Models/DatabaseModels/Monitor.ts +2 -3
  35. package/Models/DatabaseModels/MonitorGroupOwnerTeam.ts +6 -0
  36. package/Models/DatabaseModels/MonitorGroupOwnerUser.ts +6 -0
  37. package/Models/DatabaseModels/MonitorOwnerTeam.ts +6 -1
  38. package/Models/DatabaseModels/MonitorOwnerUser.ts +6 -1
  39. package/Models/DatabaseModels/MonitorTemplate.ts +2 -3
  40. package/Models/DatabaseModels/NetworkDeviceOwnerTeam.ts +6 -0
  41. package/Models/DatabaseModels/NetworkDeviceOwnerUser.ts +6 -0
  42. package/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.ts +6 -1
  43. package/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.ts +6 -1
  44. package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.ts +6 -1
  45. package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.ts +6 -1
  46. package/Models/DatabaseModels/PodmanHostOwnerTeam.ts +6 -0
  47. package/Models/DatabaseModels/PodmanHostOwnerUser.ts +6 -0
  48. package/Models/DatabaseModels/ProbeOwnerTeam.ts +6 -0
  49. package/Models/DatabaseModels/ProbeOwnerUser.ts +6 -0
  50. package/Models/DatabaseModels/ProxmoxClusterOwnerTeam.ts +6 -0
  51. package/Models/DatabaseModels/ProxmoxClusterOwnerUser.ts +6 -0
  52. package/Models/DatabaseModels/RumApplicationOwnerTeam.ts +6 -0
  53. package/Models/DatabaseModels/RumApplicationOwnerUser.ts +6 -0
  54. package/Models/DatabaseModels/RunbookOwnerTeam.ts +6 -1
  55. package/Models/DatabaseModels/RunbookOwnerUser.ts +6 -1
  56. package/Models/DatabaseModels/RunnerOwnerTeam.ts +6 -1
  57. package/Models/DatabaseModels/RunnerOwnerUser.ts +6 -1
  58. package/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.ts +6 -1
  59. package/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.ts +6 -1
  60. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.ts +8 -0
  61. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +8 -0
  62. package/Models/DatabaseModels/ServerlessFunctionOwnerTeam.ts +6 -0
  63. package/Models/DatabaseModels/ServerlessFunctionOwnerUser.ts +6 -0
  64. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +6 -1
  65. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +6 -1
  66. package/Models/DatabaseModels/ServiceOwnerTeam.ts +6 -0
  67. package/Models/DatabaseModels/ServiceOwnerUser.ts +6 -0
  68. package/Models/DatabaseModels/StatusPageOwnerTeam.ts +6 -1
  69. package/Models/DatabaseModels/StatusPageOwnerUser.ts +6 -1
  70. package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +6 -0
  71. package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +6 -0
  72. package/Models/DatabaseModels/WorkflowOwnerTeam.ts +6 -1
  73. package/Models/DatabaseModels/WorkflowOwnerUser.ts +6 -1
  74. package/Scripts/benchmark-fanin-capacity.js +2 -2
  75. package/Server/API/AIAgentDataAPI.ts +1 -1
  76. package/Server/API/AIChatAPI.ts +6 -4
  77. package/Server/API/AIInvestigationAPI.ts +7 -0
  78. package/Server/API/StatusPageAPI.ts +13 -0
  79. package/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.ts +1 -1
  80. package/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.ts +1057 -0
  81. package/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.ts +25 -0
  82. package/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.ts +31 -0
  83. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  84. package/Server/Infrastructure/Postgres/SchemaMigrations/Readme.md +6 -4
  85. package/Server/Middleware/IdentityRateLimit.ts +34 -1
  86. package/Server/Middleware/PublicDashboardRateLimit.ts +169 -39
  87. package/Server/Services/AlertEpisodeService.ts +13 -34
  88. package/Server/Services/AlertGroupingEngineService.ts +7 -4
  89. package/Server/Services/AlertService.ts +13 -32
  90. package/Server/Services/CephClusterOwnerRuleEngineService.ts +18 -10
  91. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +18 -10
  92. package/Server/Services/DashboardOwnerRuleEngineService.ts +18 -10
  93. package/Server/Services/DatabaseService.ts +101 -1
  94. package/Server/Services/DockerHostOwnerRuleEngineService.ts +18 -10
  95. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +18 -10
  96. package/Server/Services/HostOwnerRuleEngineService.ts +18 -10
  97. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +6 -4
  98. package/Server/Services/IncidentEpisodeService.ts +15 -75
  99. package/Server/Services/IncidentGroupingEngineService.ts +7 -4
  100. package/Server/Services/IncidentService.ts +13 -32
  101. package/Server/Services/IncidentTemplateService.ts +13 -36
  102. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +18 -10
  103. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +18 -10
  104. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +18 -10
  105. package/Server/Services/MonitorService.ts +13 -32
  106. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +18 -10
  107. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +18 -10
  108. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +18 -10
  109. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +18 -10
  110. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +18 -10
  111. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +18 -10
  112. package/Server/Services/RunbookOwnerRuleEngineService.ts +18 -10
  113. package/Server/Services/ScheduledMaintenanceService.ts +13 -34
  114. package/Server/Services/ScheduledMaintenanceTemplateService.ts +12 -34
  115. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +18 -10
  116. package/Server/Services/ServiceOwnerRuleEngineService.ts +18 -10
  117. package/Server/Services/StatusPagePrivateUserService.ts +38 -29
  118. package/Server/Services/StatusPagePrivateUserSessionService.ts +49 -1
  119. package/Server/Services/StatusPageService.ts +59 -36
  120. package/Server/Services/UserSessionService.ts +6 -0
  121. package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +18 -10
  122. package/Server/Services/WorkflowOwnerRuleEngineService.ts +18 -10
  123. package/Server/Static/Brand/README.md +7 -7
  124. package/Server/Static/Vendor/README.md +7 -7
  125. package/Server/Types/Database/Permissions/OwnedScopePermission.ts +18 -9
  126. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +82 -0
  127. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +21 -8
  128. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +41 -4
  129. package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +1 -1
  130. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +1 -1
  131. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +13 -5
  132. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +53 -13
  133. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +51 -14
  134. package/Server/Utils/AI/SRE/InvestigationEligibility.ts +292 -0
  135. package/Server/Utils/AI/SRE/InvestigationQueue.ts +25 -0
  136. package/Server/Utils/AI/Toolbox/Index.ts +43 -13
  137. package/Server/Utils/AI/Toolbox/ResourceTools.ts +952 -0
  138. package/Server/Utils/AI/Toolbox/RumTools.ts +424 -0
  139. package/Server/Utils/AI/Toolbox/ToolTypes.ts +10 -0
  140. package/Server/Utils/AI/Toolbox/TraceTools.ts +2 -1
  141. package/Server/Utils/Database/PostgresErrorTranslator.ts +14 -0
  142. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +137 -126
  143. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +4 -1
  144. package/Server/Utils/Rules/OwnerRuleAssignment.ts +157 -6
  145. package/Server/Utils/Telemetry/TelemetryEntity.ts +205 -6
  146. package/SslCertificates/GlobalSign.crt +26 -0
  147. package/SslCertificates/Readme.md +3 -0
  148. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +451 -0
  149. package/Tests/App/Dashboard/AIInsightsChatPanel.test.tsx +881 -0
  150. package/Tests/App/Dashboard/AIInsightsPageContext.test.ts +458 -0
  151. package/Tests/App/Dashboard/AIInsightsResourceCitations.test.ts +124 -0
  152. package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +798 -0
  153. package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +7 -0
  154. package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +104 -0
  155. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +156 -64
  156. package/Tests/App/Dashboard/DiscoveryScanStatusMessage.test.tsx +970 -0
  157. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +406 -12
  158. package/Tests/App/Dashboard/EmbeddedMetricEventScope.test.tsx +358 -0
  159. package/Tests/App/Dashboard/ErrorPatternEventScope.test.tsx +148 -0
  160. package/Tests/App/Dashboard/EventOverlayAdditionalResourceScope.test.ts +255 -0
  161. package/Tests/App/Dashboard/EventOverlayScope.test.ts +845 -0
  162. package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +903 -0
  163. package/Tests/App/Dashboard/ExternalStatusPageCriteriaFilter.test.ts +3 -3
  164. package/Tests/App/Dashboard/InvestigationDrawer.test.tsx +21 -0
  165. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +761 -0
  166. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +7 -4
  167. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +15 -7
  168. package/Tests/App/Dashboard/MetricsViewerEventScopeNavigation.test.tsx +264 -0
  169. package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +342 -0
  170. package/Tests/App/Dashboard/MonitorTestForm.test.tsx +612 -0
  171. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +301 -0
  172. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +74 -2
  173. package/Tests/App/Dashboard/TextClampLayoutHarness.ts +224 -0
  174. package/Tests/Models/InventoryItemNaming.test.ts +54 -0
  175. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +161 -0
  176. package/Tests/Server/API/AIInvestigationAPI.test.ts +14 -0
  177. package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +260 -0
  178. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +133 -0
  179. package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +482 -0
  180. package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +1 -1
  181. package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +1 -1
  182. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +38 -16
  183. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +106 -31
  184. package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +46 -12
  185. package/Tests/Server/Infrastructure/Postgres/MonitorDescriptionMigration.test.ts +422 -0
  186. package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +1 -1
  187. package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +25 -4
  188. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +72 -0
  189. package/Tests/Server/Middleware/PublicDashboardRateLimit.test.ts +12 -12
  190. package/Tests/Server/Middleware/PublicDashboardRateLimitStatusPage.test.ts +800 -0
  191. package/Tests/Server/Services/AIInvestigationDecisionPostgres.test.ts +346 -0
  192. package/Tests/Server/Services/AddOwnersIdempotency.test.ts +471 -0
  193. package/Tests/Server/Services/DatabaseServiceAutoOwnerOnCreate.test.ts +250 -0
  194. package/Tests/Server/Services/DatabaseServiceUniqueColumnsTogether.test.ts +622 -0
  195. package/Tests/Server/Services/MonitorDescriptionValidation.test.ts +211 -0
  196. package/Tests/Server/Services/MonitorTemplateDescriptionPropagation.test.ts +269 -0
  197. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +504 -0
  198. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +43 -0
  199. package/Tests/Server/Services/SessionRetention.test.ts +334 -0
  200. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +172 -0
  201. package/Tests/Server/Services/StatusPagePrivateUserReadAccess.test.ts +178 -0
  202. package/Tests/Server/Services/StatusPagePrivateUserReadAccessPostgres.test.ts +311 -0
  203. package/Tests/Server/Services/StatusPagePrivateUserSessionService.test.ts +216 -1
  204. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +1 -1
  205. package/Tests/Server/Services/UserOnCallLogNoNotificationRules.test.ts +1 -1
  206. package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +626 -0
  207. package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +668 -0
  208. package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +1 -0
  209. package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +1 -1
  210. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +16 -9
  211. package/Tests/Server/Utils/AI/ChatAgentRunner.test.ts +137 -1
  212. package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +697 -0
  213. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +105 -0
  214. package/Tests/Server/Utils/AI/RemediationHandoff.test.ts +16 -5
  215. package/Tests/Server/Utils/AI/ResourceTools.test.ts +1304 -0
  216. package/Tests/Server/Utils/AI/RumTools.test.ts +769 -0
  217. package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +63 -0
  218. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaEvaluateOverTime.test.ts +11 -9
  219. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +62 -45
  220. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +25 -24
  221. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaHumanMessages.test.ts +513 -0
  222. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +2 -2
  223. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +1 -1
  224. package/Tests/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.test.ts +9 -9
  225. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +7 -5
  226. package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +2 -2
  227. package/Tests/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.test.ts +4 -3
  228. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +2 -2
  229. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +3 -2
  230. package/Tests/Server/Utils/Monitor/MonitorCriteriaHumanMessages.test.ts +529 -0
  231. package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +412 -4
  232. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts +1 -1
  233. package/Tests/Server/Utils/TailwindBuildCopy.test.ts +14 -2
  234. package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +235 -0
  235. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +385 -2
  236. package/Tests/Server/Utils/VendorAssets.test.ts +17 -3
  237. package/Tests/Types/AI/AIChatPageContext.test.ts +0 -0
  238. package/Tests/Types/AI/AIResourceContext.test.ts +312 -0
  239. package/Tests/Types/Database/UniqueColumnsTogether.test.ts +100 -0
  240. package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +4 -4
  241. package/Tests/Types/Monitor/MonitorStepRetryPersistence.test.ts +125 -0
  242. package/Tests/Types/WebsiteRequest.test.ts +44 -0
  243. package/Tests/UI/Components/Forms/MonitorDescriptionForm.test.tsx +410 -0
  244. package/Tests/UI/Components/ModelTable/BaseModelTableReadPermissions.test.tsx +439 -0
  245. package/Tests/UI/Components/NavBarMenuSearch.test.tsx +372 -0
  246. package/Tests/UI/EsbuildConfig.test.ts +1 -1
  247. package/Tests/UI/Monitor/MonitorStepRetrySettings.test.tsx +616 -0
  248. package/Tests/UI/ReactRouterSingletonBuild.test.ts +4 -2
  249. package/Tests/UI/Rum/ReplayEngine.test.ts +179 -0
  250. package/Tests/UI/Rum/ReplayHeader.test.tsx +23 -0
  251. package/Tests/UI/Rum/ReplayScrubber.test.tsx +88 -0
  252. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +83 -0
  253. package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +33 -0
  254. package/Tests/Utils/API.test.ts +96 -0
  255. package/Tests/Utils/HTTPResponseBodyReader.test.ts +188 -1
  256. package/Tests/Utils/Metrics/MetricEventScopeUrl.test.ts +101 -0
  257. package/Tests/Utils/Monitor/MonitorTestAvailabilityUtil.test.ts +256 -0
  258. package/Tests/Utils/Telemetry/HostIpAddresses.test.ts +105 -0
  259. package/Types/AI/AIChatPageContext.ts +87 -2
  260. package/Types/AI/AIChatTypes.ts +4 -0
  261. package/Types/AI/AIResourceContext.ts +198 -0
  262. package/Types/AI/InvestigationNotStartedReason.ts +30 -0
  263. package/Types/Database/UniqueColumnsTogether.ts +55 -0
  264. package/Types/Metrics/MetricQueryConfigData.ts +8 -0
  265. package/Types/Rum/WebVitals.ts +71 -0
  266. package/Types/WebsiteRequest.ts +2 -0
  267. package/UI/Components/EditionLabel/EditionLabel.tsx +7 -5
  268. package/UI/Components/KeyboardShortcut/Screenshots/README.md +1 -1
  269. package/UI/Components/ModelTable/BaseModelTable.tsx +8 -0
  270. package/UI/Components/Navbar/NavBar.tsx +2 -0
  271. package/UI/Components/Navbar/NavBarMenuModal.tsx +6 -2
  272. package/UI/esbuild-config.js +4 -4
  273. package/Utils/API.ts +10 -1
  274. package/Utils/Dashboard/HtmlWidgetDocument.ts +1 -1
  275. package/Utils/HTTPResponseBodyReader.ts +64 -8
  276. package/Utils/Metrics/MetricExplorerUrl.ts +19 -0
  277. package/Utils/Monitor/MonitorTestAvailabilityUtil.ts +92 -0
  278. package/Utils/Telemetry/HostIpAddresses.ts +46 -2
  279. package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js +4 -1
  280. package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js.map +1 -1
  281. package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js +4 -1
  282. package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js.map +1 -1
  283. package/build/dist/Models/DatabaseModels/Alert.js +12 -0
  284. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  285. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js +3 -1
  286. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js.map +1 -1
  287. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js +3 -1
  288. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js.map +1 -1
  289. package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js +3 -1
  290. package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js.map +1 -1
  291. package/build/dist/Models/DatabaseModels/AlertOwnerUser.js +3 -1
  292. package/build/dist/Models/DatabaseModels/AlertOwnerUser.js.map +1 -1
  293. package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js +4 -1
  294. package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js.map +1 -1
  295. package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js +4 -1
  296. package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js.map +1 -1
  297. package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js +4 -1
  298. package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js.map +1 -1
  299. package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js +4 -1
  300. package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js.map +1 -1
  301. package/build/dist/Models/DatabaseModels/DashboardOwnerTeam.js +3 -1
  302. package/build/dist/Models/DatabaseModels/DashboardOwnerTeam.js.map +1 -1
  303. package/build/dist/Models/DatabaseModels/DashboardOwnerUser.js +3 -1
  304. package/build/dist/Models/DatabaseModels/DashboardOwnerUser.js.map +1 -1
  305. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +3 -0
  306. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  307. package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js +4 -1
  308. package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js.map +1 -1
  309. package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js +4 -1
  310. package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js.map +1 -1
  311. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js +4 -1
  312. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js.map +1 -1
  313. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js +4 -1
  314. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js.map +1 -1
  315. package/build/dist/Models/DatabaseModels/HostOwnerTeam.js +4 -1
  316. package/build/dist/Models/DatabaseModels/HostOwnerTeam.js.map +1 -1
  317. package/build/dist/Models/DatabaseModels/HostOwnerUser.js +4 -1
  318. package/build/dist/Models/DatabaseModels/HostOwnerUser.js.map +1 -1
  319. package/build/dist/Models/DatabaseModels/Incident.js +12 -0
  320. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  321. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js +3 -1
  322. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js.map +1 -1
  323. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js +3 -1
  324. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js.map +1 -1
  325. package/build/dist/Models/DatabaseModels/IncidentOwnerTeam.js +3 -1
  326. package/build/dist/Models/DatabaseModels/IncidentOwnerTeam.js.map +1 -1
  327. package/build/dist/Models/DatabaseModels/IncidentOwnerUser.js +3 -1
  328. package/build/dist/Models/DatabaseModels/IncidentOwnerUser.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerTeam.js +4 -1
  330. package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerTeam.js.map +1 -1
  331. package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerUser.js +4 -1
  332. package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerUser.js.map +1 -1
  333. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.js +3 -1
  334. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.js.map +1 -1
  335. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerUser.js +3 -1
  336. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerUser.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js +4 -1
  338. package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js.map +1 -1
  339. package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js +4 -1
  340. package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js.map +1 -1
  341. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js +4 -1
  342. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js.map +1 -1
  343. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js +4 -1
  344. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js.map +1 -1
  345. package/build/dist/Models/DatabaseModels/Monitor.js +2 -3
  346. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  347. package/build/dist/Models/DatabaseModels/MonitorGroupOwnerTeam.js +4 -1
  348. package/build/dist/Models/DatabaseModels/MonitorGroupOwnerTeam.js.map +1 -1
  349. package/build/dist/Models/DatabaseModels/MonitorGroupOwnerUser.js +4 -1
  350. package/build/dist/Models/DatabaseModels/MonitorGroupOwnerUser.js.map +1 -1
  351. package/build/dist/Models/DatabaseModels/MonitorOwnerTeam.js +3 -1
  352. package/build/dist/Models/DatabaseModels/MonitorOwnerTeam.js.map +1 -1
  353. package/build/dist/Models/DatabaseModels/MonitorOwnerUser.js +3 -1
  354. package/build/dist/Models/DatabaseModels/MonitorOwnerUser.js.map +1 -1
  355. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -3
  356. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js +4 -1
  358. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js +4 -1
  360. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.js +3 -1
  362. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.js +3 -1
  364. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.js +3 -1
  366. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.js.map +1 -1
  367. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.js +3 -1
  368. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.js.map +1 -1
  369. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js +4 -1
  370. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js.map +1 -1
  371. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js +4 -1
  372. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js.map +1 -1
  373. package/build/dist/Models/DatabaseModels/ProbeOwnerTeam.js +4 -1
  374. package/build/dist/Models/DatabaseModels/ProbeOwnerTeam.js.map +1 -1
  375. package/build/dist/Models/DatabaseModels/ProbeOwnerUser.js +4 -1
  376. package/build/dist/Models/DatabaseModels/ProbeOwnerUser.js.map +1 -1
  377. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js +4 -1
  378. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js.map +1 -1
  379. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js +4 -1
  380. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js.map +1 -1
  381. package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js +4 -1
  382. package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js.map +1 -1
  383. package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js +4 -1
  384. package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js.map +1 -1
  385. package/build/dist/Models/DatabaseModels/RunbookOwnerTeam.js +3 -1
  386. package/build/dist/Models/DatabaseModels/RunbookOwnerTeam.js.map +1 -1
  387. package/build/dist/Models/DatabaseModels/RunbookOwnerUser.js +3 -1
  388. package/build/dist/Models/DatabaseModels/RunbookOwnerUser.js.map +1 -1
  389. package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js +3 -1
  390. package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js.map +1 -1
  391. package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js +3 -1
  392. package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js.map +1 -1
  393. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.js +3 -1
  394. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.js.map +1 -1
  395. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.js +3 -1
  396. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.js.map +1 -1
  397. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.js +6 -1
  398. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.js.map +1 -1
  399. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +6 -1
  400. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js.map +1 -1
  401. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js +4 -1
  402. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js.map +1 -1
  403. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js +4 -1
  404. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js.map +1 -1
  405. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +3 -1
  406. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
  407. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +3 -1
  408. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
  409. package/build/dist/Models/DatabaseModels/ServiceOwnerTeam.js +4 -1
  410. package/build/dist/Models/DatabaseModels/ServiceOwnerTeam.js.map +1 -1
  411. package/build/dist/Models/DatabaseModels/ServiceOwnerUser.js +4 -1
  412. package/build/dist/Models/DatabaseModels/ServiceOwnerUser.js.map +1 -1
  413. package/build/dist/Models/DatabaseModels/StatusPageOwnerTeam.js +3 -1
  414. package/build/dist/Models/DatabaseModels/StatusPageOwnerTeam.js.map +1 -1
  415. package/build/dist/Models/DatabaseModels/StatusPageOwnerUser.js +3 -1
  416. package/build/dist/Models/DatabaseModels/StatusPageOwnerUser.js.map +1 -1
  417. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +4 -1
  418. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -1
  419. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +4 -1
  420. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -1
  421. package/build/dist/Models/DatabaseModels/WorkflowOwnerTeam.js +3 -1
  422. package/build/dist/Models/DatabaseModels/WorkflowOwnerTeam.js.map +1 -1
  423. package/build/dist/Models/DatabaseModels/WorkflowOwnerUser.js +3 -1
  424. package/build/dist/Models/DatabaseModels/WorkflowOwnerUser.js.map +1 -1
  425. package/build/dist/Server/API/AIAgentDataAPI.js +1 -1
  426. package/build/dist/Server/API/AIChatAPI.js +3 -1
  427. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  428. package/build/dist/Server/API/AIInvestigationAPI.js +3 -0
  429. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  430. package/build/dist/Server/API/StatusPageAPI.js +9 -1
  431. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  432. package/build/dist/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.js +1 -1
  433. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.js +602 -0
  434. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.js.map +1 -0
  435. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.js +14 -0
  436. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.js.map +1 -0
  437. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.js +20 -0
  438. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.js.map +1 -0
  439. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  440. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  441. package/build/dist/Server/Middleware/IdentityRateLimit.js +22 -1
  442. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
  443. package/build/dist/Server/Middleware/PublicDashboardRateLimit.js +117 -36
  444. package/build/dist/Server/Middleware/PublicDashboardRateLimit.js.map +1 -1
  445. package/build/dist/Server/Services/AlertEpisodeService.js +13 -31
  446. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  447. package/build/dist/Server/Services/AlertGroupingEngineService.js +7 -4
  448. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  449. package/build/dist/Server/Services/AlertService.js +13 -31
  450. package/build/dist/Server/Services/AlertService.js.map +1 -1
  451. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +12 -8
  452. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  453. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +12 -8
  454. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  455. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +12 -8
  456. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  457. package/build/dist/Server/Services/DatabaseService.js +71 -1
  458. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  459. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +12 -8
  460. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  461. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +12 -8
  462. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  463. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +12 -8
  464. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  465. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +6 -4
  466. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  467. package/build/dist/Server/Services/IncidentEpisodeService.js +15 -68
  468. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  469. package/build/dist/Server/Services/IncidentGroupingEngineService.js +7 -4
  470. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  471. package/build/dist/Server/Services/IncidentService.js +13 -31
  472. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  473. package/build/dist/Server/Services/IncidentTemplateService.js +13 -31
  474. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  475. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +12 -8
  476. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  477. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +12 -8
  478. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  479. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +12 -8
  480. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  481. package/build/dist/Server/Services/MonitorService.js +13 -31
  482. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  483. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +12 -8
  484. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  485. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +12 -8
  486. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  487. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +12 -8
  488. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  489. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +12 -8
  490. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  491. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +12 -8
  492. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  493. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +12 -8
  494. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  495. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +12 -8
  496. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  497. package/build/dist/Server/Services/ScheduledMaintenanceService.js +13 -31
  498. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  499. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +12 -29
  500. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  501. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +12 -8
  502. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  503. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +12 -8
  504. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  505. package/build/dist/Server/Services/StatusPagePrivateUserService.js +33 -25
  506. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  507. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js +36 -1
  508. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js.map +1 -1
  509. package/build/dist/Server/Services/StatusPageService.js +50 -35
  510. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  511. package/build/dist/Server/Services/UserSessionService.js +5 -0
  512. package/build/dist/Server/Services/UserSessionService.js.map +1 -1
  513. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +12 -8
  514. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
  515. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +12 -8
  516. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  517. package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js +15 -10
  518. package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js.map +1 -1
  519. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +82 -0
  520. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  521. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +12 -3
  522. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  523. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +32 -4
  524. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  525. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +1 -1
  526. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +1 -1
  527. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +8 -5
  528. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  529. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +33 -13
  530. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  531. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +31 -10
  532. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  533. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +205 -0
  534. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -0
  535. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +13 -0
  536. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  537. package/build/dist/Server/Utils/AI/Toolbox/Index.js +30 -6
  538. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  539. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +721 -0
  540. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -0
  541. package/build/dist/Server/Utils/AI/Toolbox/RumTools.js +330 -0
  542. package/build/dist/Server/Utils/AI/Toolbox/RumTools.js.map +1 -0
  543. package/build/dist/Server/Utils/AI/Toolbox/ToolTypes.js.map +1 -1
  544. package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js +1 -1
  545. package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js.map +1 -1
  546. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +11 -0
  547. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
  548. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +106 -101
  549. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  550. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +4 -2
  551. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  552. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +94 -0
  553. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
  554. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +171 -6
  555. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  556. package/build/dist/Types/AI/AIChatPageContext.js +68 -2
  557. package/build/dist/Types/AI/AIChatPageContext.js.map +1 -1
  558. package/build/dist/Types/AI/AIChatTypes.js +4 -0
  559. package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
  560. package/build/dist/Types/AI/AIResourceContext.js +162 -0
  561. package/build/dist/Types/AI/AIResourceContext.js.map +1 -0
  562. package/build/dist/Types/AI/InvestigationNotStartedReason.js +2 -0
  563. package/build/dist/Types/AI/InvestigationNotStartedReason.js.map +1 -0
  564. package/build/dist/Types/Database/UniqueColumnsTogether.js +19 -0
  565. package/build/dist/Types/Database/UniqueColumnsTogether.js.map +1 -0
  566. package/build/dist/Types/Metrics/MetricQueryConfigData.js.map +1 -1
  567. package/build/dist/Types/Rum/WebVitals.js +64 -0
  568. package/build/dist/Types/Rum/WebVitals.js.map +1 -0
  569. package/build/dist/Types/WebsiteRequest.js +2 -0
  570. package/build/dist/Types/WebsiteRequest.js.map +1 -1
  571. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +7 -5
  572. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  573. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +7 -0
  574. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  575. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  576. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +4 -2
  577. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  578. package/build/dist/Utils/API.js +8 -4
  579. package/build/dist/Utils/API.js.map +1 -1
  580. package/build/dist/Utils/HTTPResponseBodyReader.js +50 -6
  581. package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -1
  582. package/build/dist/Utils/Metrics/MetricExplorerUrl.js +14 -3
  583. package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
  584. package/build/dist/Utils/Monitor/MonitorTestAvailabilityUtil.js +68 -0
  585. package/build/dist/Utils/Monitor/MonitorTestAvailabilityUtil.js.map +1 -0
  586. package/build/dist/Utils/Telemetry/HostIpAddresses.js +42 -3
  587. package/build/dist/Utils/Telemetry/HostIpAddresses.js.map +1 -1
  588. package/package.json +5 -5
  589. package/test-setup.sh +2 -2
@@ -15,26 +15,26 @@ browser drew a broken image. See
15
15
  https://github.com/OneUptime/oneuptime/issues/3457.
16
16
 
17
17
  Every service mounts this directory read-only at `/oneuptime-assets/brand` (see
18
- `Common/Server/Utils/VendorAssets.ts`). Reference the files from a view by that
18
+ `packages/Common/Server/Utils/VendorAssets.ts`). Reference the files from a view by that
19
19
  absolute path, or from server code via the `OneUptimeLogoUrl` constant -
20
- `Common/Tests/Server/Utils/OfflineAssetHygiene.test.ts` fails the build on a
20
+ `packages/Common/Tests/Server/Utils/OfflineAssetHygiene.test.ts` fails the build on a
21
21
  `/oneuptime-assets/...` URL that does not resolve to a file on disk.
22
22
 
23
23
  ## Contents
24
24
 
25
25
  | Path | Source |
26
26
  | ------------------------- | ------------------------------------------------------- |
27
- | `oneuptime-logo.svg` | `Common/UI/Images/logos/OneUptimeSVG/3-transparent.svg` |
28
- | `ou-wb.svg`, `hou-wb.svg` | `Home/Static/img/` |
29
- | `favicons/` | `Home/Static/img/favicons/` |
27
+ | `oneuptime-logo.svg` | `packages/Common/UI/Images/logos/OneUptimeSVG/3-transparent.svg` |
28
+ | `ou-wb.svg`, `hou-wb.svg` | `packages/Home/Static/img/` |
29
+ | `favicons/` | `packages/Home/Static/img/favicons/` |
30
30
 
31
31
  `favicons/oneuptime-up-v1.svg` is the cache-versioned browser-tab icon shared
32
32
  by the Dashboard, Admin Dashboard, and Home page. It keeps the white `Up.` mark
33
33
  on its own dark background so the lettering remains visible in both light and
34
34
  dark browser chrome.
35
35
 
36
- `Common/Tests/Server/Utils/VendorAssets.test.ts` asserts `oneuptime-logo.svg` is
37
- byte-identical to the copies under `Common/UI` and `Home/Static`, so a rebrand
36
+ `packages/Common/Tests/Server/Utils/VendorAssets.test.ts` asserts `oneuptime-logo.svg` is
37
+ byte-identical to the copies under `packages/Common/UI` and `packages/Home/Static`, so a rebrand
38
38
  that updates one of them and not this one fails the build rather than leaving
39
39
  the acknowledge page on the old mark.
40
40
 
@@ -7,11 +7,11 @@ CDN `<script>` does not degrade, it hangs. See
7
7
  https://github.com/OneUptime/oneuptime/issues/2570.
8
8
 
9
9
  Every service mounts this directory read-only at `/oneuptime-assets` (see
10
- `Common/Server/Utils/VendorAssets.ts`). Reference the files from a view by that
10
+ `packages/Common/Server/Utils/VendorAssets.ts`). Reference the files from a view by that
11
11
  absolute path, never by a CDN URL -
12
- `Common/Tests/Server/Utils/OfflineAssetHygiene.test.ts` fails the build on a CDN
13
- URL in any `.ejs` under `Common/Server/Views`, `App/FeatureSet/*/{Views,views}`
14
- or `Home/Views`.
12
+ `packages/Common/Tests/Server/Utils/OfflineAssetHygiene.test.ts` fails the build on a CDN
13
+ URL in any `.ejs` under `packages/Common/Server/Views`, `packages/App/FeatureSet/*/{Views,views}`
14
+ or `packages/Home/Views`.
15
15
 
16
16
  ## Contents
17
17
 
@@ -19,10 +19,10 @@ or `Home/Views`.
19
19
  | -------------------------- | ----------------------------------------------------------- |
20
20
  | `tailwind/tailwind-3.4.5.js` | Tailwind Play CDN build 3.4.5 |
21
21
  | `highlight/` | highlight.js 11.11.1, from cdnjs |
22
- | `fonts/InterVariable.woff2` | Inter variable font, byte-identical to the copies under `App/FeatureSet/{Docs,APIReference}/Static/fonts/` |
22
+ | `fonts/InterVariable.woff2` | Inter variable font, byte-identical to the copies under `packages/App/FeatureSet/{Docs,APIReference}/Static/fonts/` |
23
23
 
24
24
  The Tailwind file is the **only** copy in the tree. The five frontends used to
25
- commit one each; `Common/UI/esbuild-config.js` now copies this one into each
25
+ commit one each; `packages/Common/UI/esbuild-config.js` now copies this one into each
26
26
  `public/assets/js/` at build time, next to where it already copies Monaco, and
27
27
  the built copies are gitignored. Their `index.ejs` still loads it from their own
28
28
  prefix (`/dashboard/assets/js/...`) rather than through `/oneuptime-assets` - the
@@ -49,7 +49,7 @@ highlighting offline.
49
49
 
50
50
  ```bash
51
51
  BASE="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1"
52
- DEST="Common/Server/Static/Vendor/highlight"
52
+ DEST="packages/Common/Server/Static/Vendor/highlight"
53
53
 
54
54
  curl -sSfL "$BASE/highlight.min.js" -o "$DEST/highlight.min.js"
55
55
 
@@ -62,13 +62,19 @@ export default class OwnedScopePermission {
62
62
 
63
63
  /*
64
64
  * Owned scope only restricts resources that can carry ownership:
65
- * operational resources (own *OwnerUser / *OwnerTeam tables) or
65
+ * operational resources, explicitly registered ownership roots, or
66
66
  * nested resources that inherit ownership via @OwnedThrough. For
67
67
  * everything else (settings / config tables like IncidentState,
68
68
  * Label, Team, etc.) the table-level permission check is the only
69
69
  * gate — Owned has no resources to scope to, so it's a no-op.
70
+ * Registry membership only enables ownership filtering; operational
71
+ * wildcard grants still require the existing decorator.
70
72
  */
71
- if (!model.isOperationalResource && !model.ownedThrough) {
73
+ if (
74
+ !model.isOperationalResource &&
75
+ !model.ownedThrough &&
76
+ !this.getOwnerTableRegistry().has(model.constructor.name)
77
+ ) {
72
78
  return query;
73
79
  }
74
80
 
@@ -212,6 +218,15 @@ export default class OwnedScopePermission {
212
218
  }
213
219
  }
214
220
 
221
+ private static getOwnerTableRegistry(): Map<string, OwnerTablePair> {
222
+ /*
223
+ * Services in this registry extend DatabaseService, which imports this
224
+ * permission class. Resolve at request time after both classes exist.
225
+ */
226
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
227
+ return require("./OwnerTableRegistry").default;
228
+ }
229
+
215
230
  /*
216
231
  * Computes the set of resource IDs the requesting user can access via
217
232
  * ownership: those where they personally sit in *OwnerUser OR where any of
@@ -244,14 +259,8 @@ export default class OwnedScopePermission {
244
259
  : // eslint-disable-next-line @typescript-eslint/no-explicit-any
245
260
  [(modelType as any).name];
246
261
 
247
- /*
248
- * Lazy require to avoid the circular dep cycle: this file is reachable
249
- * from DatabaseService at module-load time, and the registry imports
250
- * services that extend DatabaseService.
251
- */
252
262
  const ownerTableRegistry: Map<string, OwnerTablePair> =
253
- // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
254
- require("./OwnerTableRegistry").default;
263
+ this.getOwnerTableRegistry();
255
264
 
256
265
  const seen: Set<string> = new Set<string>();
257
266
 
@@ -30,6 +30,18 @@ import CloudResourceOwnerTeamService from "../../../Services/CloudResourceOwnerT
30
30
  import CloudResourceOwnerUserService from "../../../Services/CloudResourceOwnerUserService";
31
31
  import RumApplicationOwnerTeamService from "../../../Services/RumApplicationOwnerTeamService";
32
32
  import RumApplicationOwnerUserService from "../../../Services/RumApplicationOwnerUserService";
33
+ import ProxmoxClusterOwnerTeamService from "../../../Services/ProxmoxClusterOwnerTeamService";
34
+ import ProxmoxClusterOwnerUserService from "../../../Services/ProxmoxClusterOwnerUserService";
35
+ import CephClusterOwnerTeamService from "../../../Services/CephClusterOwnerTeamService";
36
+ import CephClusterOwnerUserService from "../../../Services/CephClusterOwnerUserService";
37
+ import DockerSwarmClusterOwnerTeamService from "../../../Services/DockerSwarmClusterOwnerTeamService";
38
+ import DockerSwarmClusterOwnerUserService from "../../../Services/DockerSwarmClusterOwnerUserService";
39
+ import VMwareVCenterOwnerTeamService from "../../../Services/VMwareVCenterOwnerTeamService";
40
+ import VMwareVCenterOwnerUserService from "../../../Services/VMwareVCenterOwnerUserService";
41
+ import IoTFleetOwnerTeamService from "../../../Services/IoTFleetOwnerTeamService";
42
+ import IoTFleetOwnerUserService from "../../../Services/IoTFleetOwnerUserService";
43
+ import NetworkDeviceOwnerTeamService from "../../../Services/NetworkDeviceOwnerTeamService";
44
+ import NetworkDeviceOwnerUserService from "../../../Services/NetworkDeviceOwnerUserService";
33
45
  import StatusPageOwnerTeamService from "../../../Services/StatusPageOwnerTeamService";
34
46
  import StatusPageOwnerUserService from "../../../Services/StatusPageOwnerUserService";
35
47
  import WorkflowOwnerTeamService from "../../../Services/WorkflowOwnerTeamService";
@@ -49,6 +61,12 @@ import KubernetesClusterService from "../../../Services/KubernetesClusterService
49
61
  import ServerlessFunctionService from "../../../Services/ServerlessFunctionService";
50
62
  import CloudResourceService from "../../../Services/CloudResourceService";
51
63
  import RumApplicationService from "../../../Services/RumApplicationService";
64
+ import ProxmoxClusterService from "../../../Services/ProxmoxClusterService";
65
+ import CephClusterService from "../../../Services/CephClusterService";
66
+ import DockerSwarmClusterService from "../../../Services/DockerSwarmClusterService";
67
+ import VMwareVCenterService from "../../../Services/VMwareVCenterService";
68
+ import IoTFleetService from "../../../Services/IoTFleetService";
69
+ import NetworkDeviceService from "../../../Services/NetworkDeviceService";
52
70
 
53
71
  /*
54
72
  * Maps an operational model name (e.g. "Monitor") to the two services that
@@ -248,6 +266,70 @@ const ownerTableRegistry: Map<string, OwnerTablePair> = new Map<
248
266
  modelService: RumApplicationService,
249
267
  },
250
268
  ],
269
+ [
270
+ "ProxmoxCluster",
271
+ {
272
+ ownerUserService: ProxmoxClusterOwnerUserService,
273
+ ownerTeamService: ProxmoxClusterOwnerTeamService,
274
+ fkColumn: "proxmoxClusterId",
275
+ canOwnTelemetry: true,
276
+ modelService: ProxmoxClusterService,
277
+ },
278
+ ],
279
+ [
280
+ "CephCluster",
281
+ {
282
+ ownerUserService: CephClusterOwnerUserService,
283
+ ownerTeamService: CephClusterOwnerTeamService,
284
+ fkColumn: "cephClusterId",
285
+ canOwnTelemetry: true,
286
+ modelService: CephClusterService,
287
+ },
288
+ ],
289
+ [
290
+ "DockerSwarmCluster",
291
+ {
292
+ ownerUserService: DockerSwarmClusterOwnerUserService,
293
+ ownerTeamService: DockerSwarmClusterOwnerTeamService,
294
+ fkColumn: "dockerSwarmClusterId",
295
+ canOwnTelemetry: true,
296
+ modelService: DockerSwarmClusterService,
297
+ },
298
+ ],
299
+ [
300
+ "VMwareVCenter",
301
+ {
302
+ ownerUserService: VMwareVCenterOwnerUserService,
303
+ ownerTeamService: VMwareVCenterOwnerTeamService,
304
+ fkColumn: "vmwareVCenterId",
305
+ canOwnTelemetry: true,
306
+ modelService: VMwareVCenterService,
307
+ },
308
+ ],
309
+ [
310
+ /*
311
+ * IoT telemetry carries the fleet ID in primaryEntityId even though its
312
+ * primaryEntityType discriminator is IoTDevice. Ownership is fleet-wide.
313
+ */
314
+ "IoTFleet",
315
+ {
316
+ ownerUserService: IoTFleetOwnerUserService,
317
+ ownerTeamService: IoTFleetOwnerTeamService,
318
+ fkColumn: "iotFleetId",
319
+ canOwnTelemetry: true,
320
+ modelService: IoTFleetService,
321
+ },
322
+ ],
323
+ [
324
+ "NetworkDevice",
325
+ {
326
+ ownerUserService: NetworkDeviceOwnerUserService,
327
+ ownerTeamService: NetworkDeviceOwnerTeamService,
328
+ fkColumn: "networkDeviceId",
329
+ canOwnTelemetry: true,
330
+ modelService: NetworkDeviceService,
331
+ },
332
+ ],
251
333
  [
252
334
  "Workflow",
253
335
  {
@@ -9,7 +9,10 @@ import { JSONObject } from "../../../../Types/JSON";
9
9
  import ObjectID from "../../../../Types/ObjectID";
10
10
  import AIChatMessageRole from "../../../../Types/AI/AIChatMessageRole";
11
11
  import AIChatMessageStatus from "../../../../Types/AI/AIChatMessageStatus";
12
- import { AIChatPageContext } from "../../../../Types/AI/AIChatPageContext";
12
+ import {
13
+ AIChatPageContext,
14
+ AIChatPageContextHelper,
15
+ } from "../../../../Types/AI/AIChatPageContext";
13
16
  import AIChatPermissionMode from "../../../../Types/AI/AIChatPermissionMode";
14
17
  import AIRunEventType from "../../../../Types/AI/AIRunEventType";
15
18
  import AIRunStatus from "../../../../Types/AI/AIRunStatus";
@@ -54,9 +57,10 @@ export interface ChatTurnRequest {
54
57
  * subject; later turns that arrive without a page context (the user
55
58
  * navigated away mid-conversation) fall back to that persisted subject so
56
59
  * "this incident" keeps resolving. Not needed on resume (the paused state
57
- * already contains the built prompt).
60
+ * already contains the built prompt). Explicit null detaches the page and
61
+ * clears that persisted subject.
58
62
  */
59
- pageContext?: AIChatPageContext | undefined;
63
+ pageContext?: AIChatPageContext | null | undefined;
60
64
  // The requesting user's real permission props, captured at request time.
61
65
  props: DatabaseCommonInteractionProps;
62
66
  }
@@ -1377,6 +1381,15 @@ export default class ChatAgentRunner {
1377
1381
  request: ChatTurnRequest,
1378
1382
  ): Promise<AIChatPageContext | undefined> {
1379
1383
  try {
1384
+ if (request.pageContext === null) {
1385
+ await AIConversationService.updateOneById({
1386
+ id: request.conversationId,
1387
+ data: { pageContext: null } as never,
1388
+ props: { isRoot: true },
1389
+ });
1390
+ return undefined;
1391
+ }
1392
+
1380
1393
  const conversation: AIConversation | null =
1381
1394
  await AIConversationService.findOneById({
1382
1395
  id: request.conversationId,
@@ -1400,11 +1413,11 @@ export default class ChatAgentRunner {
1400
1413
  * stale first subject would silently flip the conversation back.
1401
1414
  */
1402
1415
  const persistedSignature: string = persisted
1403
- ? `${persisted.type}:${persisted.entityId || ""}`
1416
+ ? AIChatPageContextHelper.getIdentity(persisted)
1404
1417
  : "";
1405
- const incomingSignature: string = `${request.pageContext.type}:${
1406
- request.pageContext.entityId || ""
1407
- }`;
1418
+ const incomingSignature: string = AIChatPageContextHelper.getIdentity(
1419
+ request.pageContext,
1420
+ );
1408
1421
 
1409
1422
  if (persistedSignature !== incomingSignature) {
1410
1423
  await AIConversationService.updateOneById({
@@ -1423,7 +1436,7 @@ export default class ChatAgentRunner {
1423
1436
  error instanceof Error ? error.message : String(error)
1424
1437
  }`,
1425
1438
  );
1426
- return request.pageContext;
1439
+ return request.pageContext || undefined;
1427
1440
  }
1428
1441
  }
1429
1442
 
@@ -2,6 +2,10 @@ import AIChatPageContextType, {
2
2
  AIChatPageContext,
3
3
  } from "../../../../Types/AI/AIChatPageContext";
4
4
  import AIChatPermissionMode from "../../../../Types/AI/AIChatPermissionMode";
5
+ import {
6
+ getAIResourceDefinition,
7
+ isAIResourceType,
8
+ } from "../../../../Types/AI/AIResourceContext";
5
9
 
6
10
  /*
7
11
  * System prompt for the observability chat agent. The binding rules here
@@ -42,6 +46,8 @@ function buildEntityContextGuidance(context: AIChatPageContext): string {
42
46
  : "";
43
47
 
44
48
  switch (context.type) {
49
+ case AIChatPageContextType.Resource:
50
+ return buildResourceContextGuidance(context);
45
51
  case AIChatPageContextType.Incident:
46
52
  return `an incident${titlePart}. Fetch its full details with query_incidents using incidentId="${id}" before answering questions about it. An autonomous AI investigation may already exist for this incident — call get_ai_investigation first and build on (and cite) its findings rather than re-deriving them from raw telemetry. get_incident_timeline is how to answer "what's the latest": it returns the incident's state changes, notes and notifications in order. Incident actions (acknowledge_incident, resolve_incident, post_incident_status_update, change_incident_severity, page_on_call_policy, run_runbook) take this same incidentId. Use the incident's start time and affected monitors to scope log, trace and metric queries when investigating it.`;
47
53
  case AIChatPageContextType.Alert:
@@ -52,6 +58,8 @@ function buildEntityContextGuidance(context: AIChatPageContext): string {
52
58
  return `a scheduled maintenance event${titlePart}. Fetch its full details with query_scheduled_maintenance using scheduledMaintenanceId="${id}" — including its window (startsAt/endsAt) and affected monitors. Use that window to scope log, trace and metric queries, and to judge whether telemetry changes during it were expected maintenance rather than a real problem.`;
53
59
  case AIChatPageContextType.TelemetryService:
54
60
  return `a telemetry service${titlePart}. Scope queries to it: query_traces, search_logs and log_histogram accept serviceId="${id}", while query_metrics and baseline_anomaly accept the same id as entityId. Use lookup_context to discover this service's metric names.`;
61
+ case AIChatPageContextType.RumApplication:
62
+ return `a Real User Monitoring application${titlePart}. Fetch its name and connection health with query_rum_applications using rumApplicationId="${id}". Use query_rum_web_vitals with the same rumApplicationId to compare LCP, INP, CLS, FCP and TTFB in an explicit time window against the preceding equal-length window. It returns measured averages, units, ratings and changes; missing measurements are not zero. For a trend chart, use the returned metric name with query_metrics and entityId="${id}". For slow browser operations or error spans, use query_traces with serviceId="${id}" and metric="p95Duration" or metric="errorCount", grouped by name. Span counts are not page views or unique users. These tools do not read session recordings. Report observed regressions and distinguish them from statistically established anomalies; do not infer a root cause from a change alone.`;
55
63
  case AIChatPageContextType.Trace:
56
64
  return `a distributed trace. Fetch its span tree with get_trace using traceId="${id}", and its logs with search_logs using the same traceId.`;
57
65
  case AIChatPageContextType.Exception:
@@ -72,8 +80,10 @@ function buildEntityContextGuidance(context: AIChatPageContext): string {
72
80
  * "which incidents are currently active or unresolved?". Every affordance an
73
81
  * area page's suggested prompts depend on has to be named here.
74
82
  */
75
- function buildAreaContextGuidance(type: AIChatPageContextType): string {
76
- switch (type) {
83
+ function buildAreaContextGuidance(context: AIChatPageContext): string {
84
+ switch (context.type) {
85
+ case AIChatPageContextType.ResourcesList:
86
+ return buildResourceContextGuidance(context);
77
87
  case AIChatPageContextType.IncidentsList:
78
88
  return `the incidents list. Questions about "these incidents" or incident activity are answered with query_incidents: pass state="active" to list every incident that is unresolved RIGHT NOW (this drops the time window, so incidents opened weeks ago are still returned), leave state unset for recent activity in a window, or pass incidentId for one incident's full details. search_incidents does free-text search over past incidents.`;
79
89
  case AIChatPageContextType.AlertsList:
@@ -90,11 +100,36 @@ function buildAreaContextGuidance(type: AIChatPageContextType): string {
90
100
  return `the metrics explorer. Discover metric names with lookup_context, then chart them with query_metrics; baseline_anomaly checks a metric against its learned baseline.`;
91
101
  case AIChatPageContextType.ExceptionsList:
92
102
  return `the exceptions list. Questions about exceptions are answered with top_exceptions; find_code_for_exception maps one to source code.`;
103
+ case AIChatPageContextType.RumApplications:
104
+ return `the Real User Monitoring applications list. Discover application ids, names and connection health with query_rum_applications before querying their data. Use query_rum_web_vitals with a rumApplicationId to compare web-vital averages and ratings against the preceding equal-length window. It returns the exact metric names to chart with query_metrics using entityId. query_traces accepts an application's id as serviceId for slow browser operations and error spans. Scope every query to the selected application and state the time window and any missing measurements. Span counts are not page views or unique users, and these tools do not read session recordings.`;
105
+ case AIChatPageContextType.TelemetryServicesList:
106
+ return `the telemetry services list. Discover services with lookup_context using type="services", then scope query_traces, search_logs and log_histogram with serviceId. Compare latency and error counts with query_traces grouped by primaryEntityId; discover metrics with lookup_context before calling query_metrics or baseline_anomaly with entityId.`;
93
107
  default:
94
108
  return "";
95
109
  }
96
110
  }
97
111
 
112
+ function buildResourceContextGuidance(context: AIChatPageContext): string {
113
+ if (!isAIResourceType(context.resourceType)) {
114
+ return "";
115
+ }
116
+ const label: string = getAIResourceDefinition(context.resourceType).label;
117
+ const pluralLabel: string = getAIResourceDefinition(
118
+ context.resourceType,
119
+ ).pluralLabel;
120
+ const resourceArgs: string = JSON.stringify({
121
+ resourceType: context.resourceType,
122
+ ...(context.entityId ? { resourceId: context.entityId } : {}),
123
+ });
124
+ const subject: string = context.entityId
125
+ ? `a ${label}${context.entityTitle ? ` titled ${JSON.stringify(context.entityTitle)}` : ""}`
126
+ : `the ${pluralLabel} list`;
127
+ const childGuidance: string = context.subresource
128
+ ? ` The selected child or collection is ${JSON.stringify(context.subresource)}. Child names are UI hints, not verified unique identities: Kubernetes names may exist in multiple namespaces, container names may be reused and process IDs may be recycled. Do not invent a namespace or child ID. The resource telemetry tool returns the parent resource's data; explicitly state that scope and never describe it as child-only measurements. If the question needs child-specific evidence that the tools cannot retrieve, explain that limitation.`
129
+ : "";
130
+ return `${subject}. Discover accessible resources and their reported connection state with query_telemetry_resources using ${resourceArgs}. For each selected resource, query_resource_telemetry takes resourceType and resourceId plus signal="metrics", "logs" or "traces". For metrics, omit metricName first to discover metric names within that resource, then pass an observed name and mode="trend" for a chart or mode="summary" for a range aggregate. Logs return a severity histogram; traces return operation summaries. Use explicit time windows and cite measured results. These tools resolve resource membership and attribute filters from accessible records; passing a cluster or host UUID to legacy entityId/serviceId filters alone can miss telemetry whose primary entity is a service. Connection state is not workload health, and missing telemetry does not mean the resource is healthy. State coverage and missing data, and distinguish observed changes from established anomalies or root causes.${childGuidance}`;
131
+ }
132
+
98
133
  export function buildPageContextSection(
99
134
  context: AIChatPageContext | undefined,
100
135
  ): string {
@@ -106,7 +141,7 @@ export function buildPageContextSection(
106
141
 
107
142
  const guidance: string = isEntity
108
143
  ? buildEntityContextGuidance(context)
109
- : buildAreaContextGuidance(context.type);
144
+ : buildAreaContextGuidance(context);
110
145
 
111
146
  if (!guidance) {
112
147
  return "";
@@ -132,7 +167,7 @@ export function buildObservabilityChatSystemPrompt(data: {
132
167
  permissionMode: AIChatPermissionMode;
133
168
  pageContext?: AIChatPageContext | undefined;
134
169
  }): string {
135
- return `You are OneUptime's observability copilot: a careful SRE analyst that answers questions about — and can take action on — this project's traces, metrics, logs, exceptions, incidents, monitors, alerts and scheduled maintenance, the on-call, status page, SLO and runbook platform around them, and the source code in its connected code repositories.
170
+ return `You are OneUptime's observability copilot: a careful SRE analyst that answers questions about — and can take action on — this project's traces, metrics, logs, exceptions, incidents, monitors, alerts and scheduled maintenance, Real User Monitoring applications and web vitals, the on-call, status page, SLO and runbook platform around them, and the source code in its connected code repositories.
136
171
 
137
172
  The current time is ${data.currentTime.toISOString()}.${buildPageContextSection(
138
173
  data.pageContext,
@@ -149,6 +184,8 @@ ${buildActionGuidance(data.permissionMode)}
149
184
  ## How to investigate
150
185
 
151
186
  - Resolve names first: use lookup_context to turn a service name into its ID before filtering other tools by service, and to discover metric names.
187
+ - For infrastructure (hosts, Docker, Podman, Kubernetes, Docker Swarm, Proxmox, VMware, Ceph, serverless, cloud, IoT and network devices), discover resources with query_telemetry_resources and use query_resource_telemetry for their scoped metric trends, log severity and trace operations. Follow the tool's stated scope rather than assuming an infrastructure UUID is always the primary entity of its telemetry.
188
+ - For Real User Monitoring, resolve applications with query_rum_applications and compare measured web vitals with query_rum_web_vitals. Use returned metric names with query_metrics to chart trends. Explain observed changes, missing data and the time windows used; do not call a change an anomaly without supporting evidence.
152
189
  - Prefer aggregations (query_traces, log_histogram, query_metrics, top_exceptions, security_event_summary) to establish the shape of a problem, then drill into raw data (search_logs, get_trace, search_security_events) for evidence.
153
190
  - Always pass explicit ISO 8601 time ranges. If the user did not specify one, use the last hour for logs and the last 24 hours for metrics/traces, and say which window you used.
154
191
  - When durations are involved they are in milliseconds unless stated otherwise.
@@ -3,7 +3,7 @@ import path from "path";
3
3
 
4
4
  /*
5
5
  * Pure guards for the in-house code agent's workspace tools (B4 Tier 0,
6
- * Internal/Roadmap/CodeFixSandboxDesign.md): every file-system tool call is
6
+ * Docs/Internal/Roadmap/CodeFixSandboxDesign.md): every file-system tool call is
7
7
  * path-guarded to the run's ephemeral workspace (the same escape posture as
8
8
  * WorkspaceManager.deleteWorkspace's base-directory check), and every tool
9
9
  * output is truncated before it re-enters the model context. Kept pure —
@@ -23,7 +23,7 @@ import CaptureSpan from "../../Telemetry/CaptureSpan";
23
23
 
24
24
  /*
25
25
  * Server-mediated LLM completions for the in-house code-fix agent (B4 Tier
26
- * 0, Internal/Roadmap/CodeFixSandboxDesign.md). The worker never holds a
26
+ * 0, Docs/Internal/Roadmap/CodeFixSandboxDesign.md). The worker never holds a
27
27
  * provider secret: every completion of its tool loop is executed HERE via
28
28
  * AIService.executeWithLogging — logged to LlmLog, linked to the run, billed
29
29
  * when the provider is the costed global one, and inside the G4 daily
@@ -1,3 +1,4 @@
1
+ import { InvestigationNotStartedCode } from "../../../../Types/AI/InvestigationNotStartedReason";
1
2
  import ObjectID from "../../../../Types/ObjectID";
2
3
  import OneUptimeDate from "../../../../Types/Date";
3
4
  import { JSONObject } from "../../../../Types/JSON";
@@ -186,6 +187,13 @@ export default class AIInvestigationEngine {
186
187
  projectId: ObjectID,
187
188
  subjectType: AISubjectType,
188
189
  ): Promise<boolean> {
190
+ return (await this.getDisabledReason(projectId, subjectType)) === null;
191
+ }
192
+
193
+ public static async getDisabledReason(
194
+ projectId: ObjectID,
195
+ subjectType: AISubjectType,
196
+ ): Promise<InvestigationNotStartedCode | null> {
189
197
  const project: Project | null = await ProjectService.findOneById({
190
198
  id: projectId,
191
199
  select: {
@@ -197,11 +205,11 @@ export default class AIInvestigationEngine {
197
205
  });
198
206
 
199
207
  if (!project) {
200
- return false;
208
+ return "eligibility_check_failed";
201
209
  }
202
210
 
203
211
  if (project.enableAi === false) {
204
- return false;
212
+ return "ai_disabled";
205
213
  }
206
214
 
207
215
  const isOptedIn: boolean =
@@ -210,7 +218,7 @@ export default class AIInvestigationEngine {
210
218
  : project.enableAutomaticIncidentInvestigation === true;
211
219
 
212
220
  if (!isOptedIn) {
213
- return false;
221
+ return "automatic_investigation_disabled";
214
222
  }
215
223
 
216
224
  const llmProvider: LlmProvider | null =
@@ -220,10 +228,10 @@ export default class AIInvestigationEngine {
220
228
  logger.debug(
221
229
  `AI: skipping investigation for project ${projectId.toString()} — no LLM provider configured.`,
222
230
  );
223
- return false;
231
+ return "provider_missing";
224
232
  }
225
233
 
226
- return true;
234
+ return null;
227
235
  }
228
236
 
229
237
  /*
@@ -1,3 +1,8 @@
1
+ import {
2
+ InvestigationNotStartedCode,
3
+ InvestigationGateDetails,
4
+ } from "../../../../Types/AI/InvestigationNotStartedReason";
5
+ import InvestigationEligibility from "./InvestigationEligibility";
1
6
  import ObjectID from "../../../../Types/ObjectID";
2
7
  import OneUptimeDate from "../../../../Types/Date";
3
8
  import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
@@ -16,7 +21,10 @@ import QueryHelper from "../../../Types/Database/QueryHelper";
16
21
  import AlertAIContextBuilder, {
17
22
  AlertContextData,
18
23
  } from "../AlertAIContextBuilder";
19
- import { AI_ALERT_INVESTIGATION_FEATURE } from "../../../Services/AIService";
24
+ import {
25
+ AI_ALERT_INVESTIGATION_FEATURE,
26
+ AutonomousBudgetStatus,
27
+ } from "../../../Services/AIService";
20
28
  import AIInvestigationEngine from "./AIInvestigationEngine";
21
29
  import AIInvestigationQueue from "./InvestigationQueue";
22
30
  import AIConfidenceSignal, { ConfidenceSignal } from "./ConfidenceSignal";
@@ -51,6 +59,8 @@ const MAX_DEDUPE_WINDOW_MINUTES: number = 24 * 60;
51
59
 
52
60
  export interface AlertGateDecision {
53
61
  investigate: boolean;
62
+ notStartedCode?: InvestigationNotStartedCode | undefined;
63
+ notStartedDetails?: InvestigationGateDetails | undefined;
54
64
  // Human-readable reason recorded in the debug log when skipping.
55
65
  reason: string;
56
66
  // Passed through to the AIRun as the dedupe key for future windows.
@@ -77,9 +87,10 @@ export default class AIAlertInvestigationRunner {
77
87
  const { alertId, projectId } = data;
78
88
 
79
89
  try {
80
- if (
81
- !(await AIInvestigationEngine.isEnabledForProject(projectId, "Alert"))
82
- ) {
90
+ const disabled: InvestigationNotStartedCode | null =
91
+ await AIInvestigationEngine.getDisabledReason(projectId, "Alert");
92
+ if (disabled) {
93
+ await InvestigationEligibility.recordSkipped(data, disabled);
83
94
  return false;
84
95
  }
85
96
 
@@ -89,6 +100,12 @@ export default class AIAlertInvestigationRunner {
89
100
  });
90
101
 
91
102
  if (!gate.investigate) {
103
+ await InvestigationEligibility.recordSkipped(
104
+ data,
105
+ gate.notStartedCode || "eligibility_check_failed",
106
+ undefined,
107
+ gate.notStartedDetails,
108
+ );
92
109
  logger.debug(
93
110
  `AI: skipping investigation for alert ${alertId.toString()} — ${gate.reason}.`,
94
111
  );
@@ -100,11 +117,21 @@ export default class AIAlertInvestigationRunner {
100
117
  projectId,
101
118
  subjectAlertId: alertId,
102
119
  subjectMonitorId: gate.monitorId,
120
+ onNotEnqueued: async (
121
+ code: InvestigationNotStartedCode,
122
+ budget?: AutonomousBudgetStatus,
123
+ ): Promise<void> => {
124
+ await InvestigationEligibility.recordSkipped(data, code, budget);
125
+ },
103
126
  },
104
127
  );
105
128
 
106
129
  return enqueuedRunId !== null;
107
130
  } catch (error) {
131
+ await InvestigationEligibility.recordSkipped(
132
+ data,
133
+ "eligibility_check_failed",
134
+ );
108
135
  logger.error(
109
136
  `AI: unexpected error enqueueing investigation for alert ${alertId.toString()}: ${error}`,
110
137
  );
@@ -276,13 +303,18 @@ export default class AIAlertInvestigationRunner {
276
303
  monitorId: true,
277
304
  alertSeverity: {
278
305
  order: true,
306
+ name: true,
279
307
  },
280
308
  },
281
309
  props: { isRoot: true },
282
310
  });
283
311
 
284
312
  if (!alert) {
285
- return { investigate: false, reason: "alert not found" };
313
+ return {
314
+ investigate: false,
315
+ reason: "alert not found",
316
+ notStartedCode: "eligibility_check_failed",
317
+ };
286
318
  }
287
319
 
288
320
  // One project read serves both the severity floor and the dedupe window.
@@ -296,19 +328,25 @@ export default class AIAlertInvestigationRunner {
296
328
  });
297
329
 
298
330
  // Severity floor.
299
- const floorOrder: number | null = await this.getSeverityFloorOrder(
331
+ const floorSeverity: AlertSeverity | null = await this.getSeverityFloor(
300
332
  projectId,
301
333
  project?.alertInvestigationMinimumSeverityId,
302
334
  );
335
+ const floorOrder: number | undefined = floorSeverity?.order;
303
336
  const alertOrder: number | undefined = alert.alertSeverity?.order;
304
337
 
305
338
  if (
306
- floorOrder !== null &&
339
+ floorOrder !== undefined &&
307
340
  alertOrder !== undefined &&
308
341
  alertOrder > floorOrder
309
342
  ) {
310
343
  return {
311
344
  investigate: false,
345
+ notStartedCode: "severity_below_threshold",
346
+ notStartedDetails: {
347
+ severityName: alert.alertSeverity?.name,
348
+ minimumSeverityName: floorSeverity?.name,
349
+ },
312
350
  reason: `severity order ${alertOrder} is below the investigation floor (order ${floorOrder})`,
313
351
  monitorId: alert.monitorId,
314
352
  };
@@ -349,6 +387,8 @@ export default class AIAlertInvestigationRunner {
349
387
  if (recentRunCount > 0) {
350
388
  return {
351
389
  investigate: false,
390
+ notStartedCode: "monitor_cooldown",
391
+ notStartedDetails: { cooldownWindowMinutes: dedupeWindowMinutes },
352
392
  reason: `monitor ${alert.monitorId.toString()} was already investigated within the last ${dedupeWindowMinutes} minutes`,
353
393
  monitorId: alert.monitorId,
354
394
  };
@@ -369,27 +409,27 @@ export default class AIAlertInvestigationRunner {
369
409
  * configured severity has been deleted — the default is the project's top
370
410
  * two tiers. Returns null when no floor applies (no severities configured).
371
411
  */
372
- private static async getSeverityFloorOrder(
412
+ private static async getSeverityFloor(
373
413
  projectId: ObjectID,
374
414
  minimumSeverityId: ObjectID | undefined,
375
- ): Promise<number | null> {
415
+ ): Promise<AlertSeverity | null> {
376
416
  if (minimumSeverityId) {
377
417
  const floorSeverity: AlertSeverity | null =
378
418
  await AlertSeverityService.findOneById({
379
419
  id: minimumSeverityId,
380
- select: { order: true },
420
+ select: { order: true, name: true },
381
421
  props: { isRoot: true },
382
422
  });
383
423
 
384
424
  if (floorSeverity && floorSeverity.order !== undefined) {
385
- return floorSeverity.order;
425
+ return floorSeverity;
386
426
  }
387
427
  }
388
428
 
389
429
  // Default: the top two severity tiers (the two lowest order values).
390
430
  const topTiers: Array<AlertSeverity> = await AlertSeverityService.findBy({
391
431
  query: { projectId },
392
- select: { order: true },
432
+ select: { order: true, name: true },
393
433
  sort: { order: SortOrder.Ascending },
394
434
  limit: 2,
395
435
  skip: 0,
@@ -401,7 +441,7 @@ export default class AIAlertInvestigationRunner {
401
441
  }
402
442
 
403
443
  const lastTier: AlertSeverity = topTiers[topTiers.length - 1]!;
404
- return lastTier.order ?? null;
444
+ return lastTier.order !== undefined ? lastTier : null;
405
445
  }
406
446
 
407
447
  // Build a compact alert record to seed the investigation.