@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
@@ -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 AIRunType from "../../../../Types/AI/AIRunType";
@@ -17,7 +22,10 @@ import IncidentService from "../../../Services/IncidentService";
17
22
  import IncidentAIContextBuilder, {
18
23
  IncidentContextData,
19
24
  } from "../IncidentAIContextBuilder";
20
- import { AI_INCIDENT_INVESTIGATION_FEATURE } from "../../../Services/AIService";
25
+ import {
26
+ AI_INCIDENT_INVESTIGATION_FEATURE,
27
+ AutonomousBudgetStatus,
28
+ } from "../../../Services/AIService";
21
29
  import AIInvestigationEngine from "./AIInvestigationEngine";
22
30
  import AIInvestigationQueue from "./InvestigationQueue";
23
31
  import AIConfidenceSignal, { ConfidenceSignal } from "./ConfidenceSignal";
@@ -50,6 +58,8 @@ const MAX_INCIDENT_DEDUPE_WINDOW_MINUTES: number = 24 * 60;
50
58
 
51
59
  export interface IncidentGateDecision {
52
60
  investigate: boolean;
61
+ notStartedCode?: InvestigationNotStartedCode | undefined;
62
+ notStartedDetails?: InvestigationGateDetails | undefined;
53
63
  reason: string;
54
64
  monitorId?: ObjectID | undefined;
55
65
  }
@@ -74,12 +84,10 @@ export default class AIIncidentInvestigationRunner {
74
84
  const { incidentId, projectId } = data;
75
85
 
76
86
  try {
77
- if (
78
- !(await AIInvestigationEngine.isEnabledForProject(
79
- projectId,
80
- "Incident",
81
- ))
82
- ) {
87
+ const disabled: InvestigationNotStartedCode | null =
88
+ await AIInvestigationEngine.getDisabledReason(projectId, "Incident");
89
+ if (disabled) {
90
+ await InvestigationEligibility.recordSkipped(data, disabled);
83
91
  return false;
84
92
  }
85
93
 
@@ -89,6 +97,12 @@ export default class AIIncidentInvestigationRunner {
89
97
  });
90
98
 
91
99
  if (!gate.investigate) {
100
+ await InvestigationEligibility.recordSkipped(
101
+ data,
102
+ gate.notStartedCode || "eligibility_check_failed",
103
+ undefined,
104
+ gate.notStartedDetails,
105
+ );
92
106
  logger.debug(
93
107
  `AI: skipping investigation for incident ${incidentId.toString()} — ${gate.reason}.`,
94
108
  );
@@ -100,11 +114,21 @@ export default class AIIncidentInvestigationRunner {
100
114
  projectId,
101
115
  subjectIncidentId: incidentId,
102
116
  subjectMonitorId: gate.monitorId,
117
+ onNotEnqueued: async (
118
+ code: InvestigationNotStartedCode,
119
+ budget?: AutonomousBudgetStatus,
120
+ ): Promise<void> => {
121
+ await InvestigationEligibility.recordSkipped(data, code, budget);
122
+ },
103
123
  },
104
124
  );
105
125
 
106
126
  return enqueuedRunId !== null;
107
127
  } catch (error) {
128
+ await InvestigationEligibility.recordSkipped(
129
+ data,
130
+ "eligibility_check_failed",
131
+ );
108
132
  logger.error(
109
133
  `AI: unexpected error enqueueing investigation for incident ${incidentId.toString()}: ${error}`,
110
134
  );
@@ -140,13 +164,18 @@ export default class AIIncidentInvestigationRunner {
140
164
  },
141
165
  incidentSeverity: {
142
166
  order: true,
167
+ name: true,
143
168
  },
144
169
  },
145
170
  props: { isRoot: true },
146
171
  });
147
172
 
148
173
  if (!incident) {
149
- return { investigate: false, reason: "incident not found" };
174
+ return {
175
+ investigate: false,
176
+ reason: "incident not found",
177
+ notStartedCode: "eligibility_check_failed",
178
+ };
150
179
  }
151
180
 
152
181
  const monitorIds: Array<ObjectID> = (incident.monitors || [])
@@ -175,18 +204,24 @@ export default class AIIncidentInvestigationRunner {
175
204
  * whose severity order cannot be determined passes, as does every
176
205
  * incident when no floor is configured.
177
206
  */
178
- const floorOrder: number | null = await this.getSeverityFloorOrder(
207
+ const floorSeverity: IncidentSeverity | null = await this.getSeverityFloor(
179
208
  project?.incidentInvestigationMinimumSeverityId,
180
209
  );
210
+ const floorOrder: number | undefined = floorSeverity?.order;
181
211
  const incidentOrder: number | undefined = incident.incidentSeverity?.order;
182
212
 
183
213
  if (
184
- floorOrder !== null &&
214
+ floorOrder !== undefined &&
185
215
  incidentOrder !== undefined &&
186
216
  incidentOrder > floorOrder
187
217
  ) {
188
218
  return {
189
219
  investigate: false,
220
+ notStartedCode: "severity_below_threshold",
221
+ notStartedDetails: {
222
+ severityName: incident.incidentSeverity?.name,
223
+ minimumSeverityName: floorSeverity?.name,
224
+ },
190
225
  reason: `severity order ${incidentOrder} is below the investigation floor (order ${floorOrder})`,
191
226
  monitorId: primaryMonitorId,
192
227
  };
@@ -227,6 +262,8 @@ export default class AIIncidentInvestigationRunner {
227
262
  if (recentRunCount > 0) {
228
263
  return {
229
264
  investigate: false,
265
+ notStartedCode: "monitor_cooldown",
266
+ notStartedDetails: { cooldownWindowMinutes: dedupeWindowMinutes },
230
267
  reason: `a monitor affected by this incident was already investigated within the last ${dedupeWindowMinutes} minutes`,
231
268
  monitorId: primaryMonitorId,
232
269
  };
@@ -246,9 +283,9 @@ export default class AIIncidentInvestigationRunner {
246
283
  * Returns null when no floor applies — which, unlike the alert lane, is the
247
284
  * default: no configured minimum means investigate everything.
248
285
  */
249
- private static async getSeverityFloorOrder(
286
+ private static async getSeverityFloor(
250
287
  minimumSeverityId: ObjectID | undefined,
251
- ): Promise<number | null> {
288
+ ): Promise<IncidentSeverity | null> {
252
289
  if (!minimumSeverityId) {
253
290
  return null;
254
291
  }
@@ -256,7 +293,7 @@ export default class AIIncidentInvestigationRunner {
256
293
  const floorSeverity: IncidentSeverity | null =
257
294
  await IncidentSeverityService.findOneById({
258
295
  id: minimumSeverityId,
259
- select: { order: true },
296
+ select: { order: true, name: true },
260
297
  props: { isRoot: true },
261
298
  });
262
299
 
@@ -268,7 +305,7 @@ export default class AIIncidentInvestigationRunner {
268
305
  return null;
269
306
  }
270
307
 
271
- return floorSeverity.order;
308
+ return floorSeverity;
272
309
  }
273
310
 
274
311
  /*
@@ -0,0 +1,292 @@
1
+ import Alert from "../../../../Models/DatabaseModels/Alert";
2
+ import Incident from "../../../../Models/DatabaseModels/Incident";
3
+ import InvestigationNotStartedReason, {
4
+ InvestigationNotStartedCode,
5
+ InvestigationGateDetails,
6
+ } from "../../../../Types/AI/InvestigationNotStartedReason";
7
+ import ObjectID from "../../../../Types/ObjectID";
8
+ import AIService, { AutonomousBudgetStatus } from "../../../Services/AIService";
9
+ import AlertService from "../../../Services/AlertService";
10
+ import IncidentService from "../../../Services/IncidentService";
11
+ import logger from "../../Logger";
12
+ import AIInvestigationEngine from "./AIInvestigationEngine";
13
+ import AIAlertInvestigationRunner from "./AlertInvestigationRunner";
14
+ import AIIncidentInvestigationRunner from "./IncidentInvestigationRunner";
15
+
16
+ export interface InvestigationSubject {
17
+ projectId: ObjectID;
18
+ incidentId?: ObjectID | undefined;
19
+ alertId?: ObjectID | undefined;
20
+ }
21
+
22
+ export default class InvestigationEligibility {
23
+ public static reason(
24
+ code: InvestigationNotStartedCode,
25
+ subject: InvestigationSubject,
26
+ budget?: AutonomousBudgetStatus,
27
+ details?: InvestigationGateDetails,
28
+ ): InvestigationNotStartedReason {
29
+ return this.buildReason("recorded", code, subject, budget, details);
30
+ }
31
+
32
+ private static buildReason(
33
+ source: "recorded" | "current_configuration",
34
+ code: InvestigationNotStartedCode,
35
+ subject: InvestigationSubject,
36
+ budget?: AutonomousBudgetStatus,
37
+ details?: InvestigationGateDetails,
38
+ ): InvestigationNotStartedReason {
39
+ const kind: string = subject.alertId ? "alert" : "incident";
40
+ const recorded: boolean = source === "recorded";
41
+ const cooldownWindow: string =
42
+ details?.cooldownWindowMinutes !== undefined
43
+ ? `${details.cooldownWindowMinutes}-minute`
44
+ : "configured";
45
+ const reasons: Record<
46
+ InvestigationNotStartedCode,
47
+ { title: string; description: string; nextStep: string }
48
+ > = {
49
+ ai_disabled: {
50
+ title: recorded
51
+ ? "Project AI was turned off at creation"
52
+ : "Project AI is currently turned off",
53
+ description: recorded
54
+ ? `AI was disabled for this project when this ${kind} was created, so its automatic investigation did not start.`
55
+ : "AI is currently disabled for this project, so new automatic investigations cannot start.",
56
+ nextStep: recorded
57
+ ? "Review project AI settings for new records. Existing records are not automatically retried when AI is enabled."
58
+ : "Enable project AI and automatic investigations to investigate new records. Existing records are not automatically retried.",
59
+ },
60
+ automatic_investigation_disabled: {
61
+ title: recorded
62
+ ? `Automatic ${kind} investigation was off at creation`
63
+ : `Automatic ${kind} investigation is currently turned off`,
64
+ description: `${recorded ? `Automatic investigation was not enabled for ${kind}s when this ${kind} was created.` : `Automatic investigation is not currently enabled for ${kind}s.`} Alerts and incidents have separate investigation settings.`,
65
+ nextStep: recorded
66
+ ? `Review automatic ${kind} investigation settings for new ${kind}s. Enabling investigation later does not automatically retry this ${kind}.`
67
+ : `Enable automatic ${kind} investigation for new ${kind}s. Existing records are not automatically retried.`,
68
+ },
69
+ provider_missing: {
70
+ title: recorded
71
+ ? "No AI provider was available at creation"
72
+ : "No AI provider is currently available",
73
+ description: recorded
74
+ ? `Automatic investigation was enabled when this ${kind} was created, but no configured AI provider was available to run it.`
75
+ : "Automatic investigation is currently enabled, but this project has no configured AI provider available to run new investigations.",
76
+ nextStep: recorded
77
+ ? "Review the AI provider configuration for new investigations. Configuring a provider later does not automatically retry existing records."
78
+ : "Configure an AI provider in project settings. New eligible records can then be investigated; existing records are not automatically retried.",
79
+ },
80
+ severity_below_threshold: {
81
+ title: recorded
82
+ ? "Severity was below the investigation threshold at creation"
83
+ : "Severity is below the current investigation threshold",
84
+ description: `${recorded ? `When this ${kind} was created, its` : `This ${kind}'s`}${details?.severityName ? ` ${details.severityName}` : ""} severity ${recorded ? "did not meet" : "does not meet"} ${details?.minimumSeverityName ? `the minimum ${details.minimumSeverityName} investigation severity` : "the configured investigation threshold"}.${kind === "alert" ? " By default, only the two highest alert severity tiers are investigated." : ""}`,
85
+ nextStep:
86
+ "Review the minimum investigation severity in AI settings. Changes apply to new records and do not retry this record.",
87
+ },
88
+ monitor_cooldown: {
89
+ title: recorded
90
+ ? "Skipped during the monitor cooldown"
91
+ : "A monitor is currently within its investigation cooldown",
92
+ description: recorded
93
+ ? `Another ${kind} investigation was already queued or started for an affected monitor within the ${cooldownWindow} investigation cooldown window. This repeat ${kind} did not start another investigation.`
94
+ : `An investigation for an affected monitor was queued or started within the current ${cooldownWindow} cooldown window, which prevents another automatic ${kind} investigation right now.`,
95
+ nextStep:
96
+ "Review recent investigations for the affected monitor, or adjust the investigation cooldown for new records. An earlier run may still be queued, running, or may have failed.",
97
+ },
98
+ daily_budget_exhausted: {
99
+ title:
100
+ budget?.limitInTokens === 0
101
+ ? recorded
102
+ ? "Automatic investigation was paused by its token limit"
103
+ : "Automatic investigation is currently paused by its token limit"
104
+ : recorded
105
+ ? "Daily AI token budget had been reached"
106
+ : "Daily AI token budget is currently exhausted",
107
+ description: budget
108
+ ? `AI work for ${kind}s ${recorded ? "had used" : "has used"} ${budget.usedTokensToday.toLocaleString("en-US")} of its ${budget.limitInTokens?.toLocaleString("en-US")} token daily allowance ${recorded ? "when checked at creation. No investigation was queued." : "today. The current allowance does not permit a new investigation."}`
109
+ : `The daily autonomous token allowance for ${kind}s ${recorded ? "had been reached when this record was created, so no investigation was queued." : "is currently exhausted, so new investigations cannot start."}`,
110
+ nextStep:
111
+ "Review the daily token limit in AI settings. Usage resets at midnight UTC; skipped records are not automatically retried after the reset.",
112
+ },
113
+ budget_check_failed: {
114
+ title: recorded
115
+ ? "The AI budget could not be checked"
116
+ : "The current AI budget cannot be checked",
117
+ description: recorded
118
+ ? "The system could not verify the available AI budget. It did not queue an investigation to avoid exceeding the configured spending limit."
119
+ : "The available AI budget cannot currently be verified, so eligibility for a new investigation cannot be confirmed.",
120
+ nextStep:
121
+ "Ask a project administrator to check service health and AI settings. This record was not queued for automatic retry.",
122
+ },
123
+ enqueue_failed: {
124
+ title: recorded
125
+ ? "The investigation could not be queued"
126
+ : "Investigation queue availability could not be verified",
127
+ description: recorded
128
+ ? "The system could not save an investigation to the queue, so no investigation started for this record."
129
+ : "The service could not confirm whether a new investigation can currently be saved to the queue.",
130
+ nextStep:
131
+ "Ask a project administrator to check service health and server logs. This record was not queued for automatic retry.",
132
+ },
133
+ eligibility_check_failed: {
134
+ title: recorded
135
+ ? "Investigation eligibility could not be verified"
136
+ : "Current investigation eligibility cannot be verified",
137
+ description: recorded
138
+ ? "The system could not complete the checks required to start an automatic investigation."
139
+ : "The current checks required to start an automatic investigation could not be completed.",
140
+ nextStep:
141
+ "Ask a project administrator to check service health and AI settings. No automatic retry is scheduled for this record.",
142
+ },
143
+ no_run_recorded: {
144
+ title: "No investigation was recorded",
145
+ description: `This ${kind} passes the current automatic investigation checks, but no investigation or original skip decision was found. Settings may have changed since it was created, or automatic investigation may not have started when this record was created.`,
146
+ nextStep:
147
+ "Automatic investigations are triggered when a record is created. Enabling investigation later does not backfill existing records; check the AI logs and service health if new eligible records are also missing investigations.",
148
+ },
149
+ };
150
+ return {
151
+ code,
152
+ ...reasons[code],
153
+ description: recorded
154
+ ? reasons[code].description
155
+ : `${reasons[code].description} These are the current conditions; the original decision was not recorded, so they do not confirm why this record was skipped at creation.`,
156
+ source,
157
+ evaluatedAt: new Date().toISOString(),
158
+ };
159
+ }
160
+
161
+ /** Best effort, without overriding the first decision or failing creation. */
162
+ public static async recordSkipped(
163
+ subject: InvestigationSubject,
164
+ code: InvestigationNotStartedCode,
165
+ budget?: AutonomousBudgetStatus,
166
+ details?: InvestigationGateDetails,
167
+ ): Promise<void> {
168
+ try {
169
+ const decision: InvestigationNotStartedReason = this.reason(
170
+ code,
171
+ subject,
172
+ budget,
173
+ details,
174
+ );
175
+ if (subject.alertId) {
176
+ await AlertService.updateColumnsByIdWithoutHooks({
177
+ id: subject.alertId,
178
+ data: { aiInvestigationDecision: decision },
179
+ expectedData: {
180
+ projectId: subject.projectId,
181
+ aiInvestigationDecision: null,
182
+ },
183
+ skipUpdateDateColumn: true,
184
+ });
185
+ } else if (subject.incidentId) {
186
+ await IncidentService.updateColumnsByIdWithoutHooks({
187
+ id: subject.incidentId,
188
+ data: { aiInvestigationDecision: decision },
189
+ expectedData: {
190
+ projectId: subject.projectId,
191
+ aiInvestigationDecision: null,
192
+ },
193
+ skipUpdateDateColumn: true,
194
+ });
195
+ }
196
+ } catch (error) {
197
+ logger.error(`AI: could not record investigation decision: ${error}`);
198
+ }
199
+ }
200
+
201
+ /** Read-only; the caller must first authorize access to the subject. */
202
+ public static async getNotStartedReason(
203
+ subject: InvestigationSubject,
204
+ ): Promise<InvestigationNotStartedReason> {
205
+ try {
206
+ const row: Alert | Incident | null = subject.alertId
207
+ ? await AlertService.findOneBy({
208
+ query: {
209
+ _id: subject.alertId.toString(),
210
+ projectId: subject.projectId,
211
+ },
212
+ select: { aiInvestigationDecision: true },
213
+ props: { isRoot: true },
214
+ })
215
+ : await IncidentService.findOneBy({
216
+ query: {
217
+ _id: subject.incidentId!.toString(),
218
+ projectId: subject.projectId,
219
+ },
220
+ select: { aiInvestigationDecision: true },
221
+ props: { isRoot: true },
222
+ });
223
+ if (row?.aiInvestigationDecision) {
224
+ return row.aiInvestigationDecision;
225
+ }
226
+
227
+ const disabled: InvestigationNotStartedCode | null =
228
+ await AIInvestigationEngine.getDisabledReason(
229
+ subject.projectId,
230
+ subject.alertId ? "Alert" : "Incident",
231
+ );
232
+ if (disabled) {
233
+ return this.currentReason(disabled, subject);
234
+ }
235
+
236
+ const gate: {
237
+ investigate: boolean;
238
+ notStartedCode?: InvestigationNotStartedCode | undefined;
239
+ notStartedDetails?: InvestigationGateDetails | undefined;
240
+ } = subject.alertId
241
+ ? await AIAlertInvestigationRunner.shouldInvestigateAlert({
242
+ projectId: subject.projectId,
243
+ alertId: subject.alertId,
244
+ })
245
+ : await AIIncidentInvestigationRunner.shouldInvestigateIncident({
246
+ projectId: subject.projectId,
247
+ incidentId: subject.incidentId!,
248
+ });
249
+ if (!gate.investigate) {
250
+ return this.currentReason(
251
+ gate.notStartedCode || "eligibility_check_failed",
252
+ subject,
253
+ undefined,
254
+ gate.notStartedDetails,
255
+ );
256
+ }
257
+
258
+ const budget: AutonomousBudgetStatus =
259
+ await AIService.getAutonomousDailyBudgetStatus(subject.projectId, {
260
+ incidentId: subject.incidentId,
261
+ alertId: subject.alertId,
262
+ });
263
+ if (budget.exhausted) {
264
+ return this.currentReason("daily_budget_exhausted", subject, budget);
265
+ }
266
+ return { ...this.reason("no_run_recorded", subject), source: "unknown" };
267
+ } catch (error) {
268
+ logger.error(`AI: could not explain missing investigation: ${error}`);
269
+ return {
270
+ ...this.reason("eligibility_check_failed", subject),
271
+ description:
272
+ "No investigation was found. The original decision or current eligibility checks could not be loaded.",
273
+ source: "unknown",
274
+ };
275
+ }
276
+ }
277
+
278
+ private static currentReason(
279
+ code: InvestigationNotStartedCode,
280
+ subject: InvestigationSubject,
281
+ budget?: AutonomousBudgetStatus,
282
+ details?: InvestigationGateDetails,
283
+ ): InvestigationNotStartedReason {
284
+ return this.buildReason(
285
+ "current_configuration",
286
+ code,
287
+ subject,
288
+ budget,
289
+ details,
290
+ );
291
+ }
292
+ }
@@ -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 Query from "../../../../Types/BaseDatabase/Query";
@@ -127,6 +128,12 @@ export default class AIInvestigationQueue {
127
128
  subjectAlertId?: ObjectID | undefined;
128
129
  subjectMonitorId?: ObjectID | undefined;
129
130
  subjectAIInsightId?: ObjectID | undefined;
131
+ onNotEnqueued?:
132
+ | ((
133
+ code: InvestigationNotStartedCode,
134
+ budget?: AutonomousBudgetStatus,
135
+ ) => Promise<void>)
136
+ | undefined;
130
137
  /*
131
138
  * When set, the run is a remediation run (not an Investigation): by
132
139
  * default a read-only RemediationPlan that picks a runbook for this
@@ -146,6 +153,21 @@ export default class AIInvestigationQueue {
146
153
  }): Promise<ObjectID | null> {
147
154
  const { projectId } = data;
148
155
 
156
+ // Diagnostic persistence must never change queue admission or remediation.
157
+ const recordSkip: (
158
+ code: InvestigationNotStartedCode,
159
+ budget?: AutonomousBudgetStatus,
160
+ ) => Promise<void> = async (
161
+ code: InvestigationNotStartedCode,
162
+ budget?: AutonomousBudgetStatus,
163
+ ): Promise<void> => {
164
+ try {
165
+ await data.onNotEnqueued?.(code, budget);
166
+ } catch (error) {
167
+ logger.error(`AI: could not record queue admission decision: ${error}`);
168
+ }
169
+ };
170
+
149
171
  if (data.subjectIncidentId && data.subjectAlertId) {
150
172
  logger.error(
151
173
  `AI: not enqueueing investigation for project ${projectId.toString()} — a run cannot belong to both an incident and an alert.`,
@@ -166,12 +188,14 @@ export default class AIInvestigationQueue {
166
188
  });
167
189
 
168
190
  if (budget.exhausted) {
191
+ await recordSkip("daily_budget_exhausted", budget);
169
192
  logger.debug(
170
193
  `AI: not enqueueing investigation for project ${projectId.toString()} — daily autonomous token budget exhausted (${budget.usedTokensToday} of ${budget.limitInTokens} tokens used today).`,
171
194
  );
172
195
  return null;
173
196
  }
174
197
  } catch (error) {
198
+ await recordSkip("budget_check_failed");
175
199
  logger.error(
176
200
  `AI: budget check failed, not enqueueing investigation: ${error}`,
177
201
  );
@@ -240,6 +264,7 @@ export default class AIInvestigationQueue {
240
264
  )
241
265
  : await createRun();
242
266
  } catch (error) {
267
+ await recordSkip("enqueue_failed");
243
268
  logger.error(`AI: failed to enqueue investigation run: ${error}`);
244
269
  return null;
245
270
  }
@@ -16,6 +16,11 @@ import {
16
16
  import { QueryIncidentsTool, SearchIncidentsTool } from "./IncidentTools";
17
17
  import { QueryAlertsTool } from "./AlertTools";
18
18
  import { QueryMonitorsTool } from "./MonitorTools";
19
+ import { QueryRumApplicationsTool, QueryRumWebVitalsTool } from "./RumTools";
20
+ import {
21
+ QueryTelemetryResourcesTool,
22
+ QueryResourceTelemetryTool,
23
+ } from "./ResourceTools";
19
24
  import { QueryScheduledMaintenanceTool } from "./ScheduledMaintenanceTools";
20
25
  import {
21
26
  GetOnCallStatusTool,
@@ -100,6 +105,10 @@ export default class AIToolbox {
100
105
  GetAlertTimelineTool,
101
106
  QueryAlertsTool,
102
107
  QueryMonitorsTool,
108
+ QueryRumApplicationsTool,
109
+ QueryRumWebVitalsTool,
110
+ QueryTelemetryResourcesTool,
111
+ QueryResourceTelemetryTool,
103
112
  QueryScheduledMaintenanceTool,
104
113
  /*
105
114
  * Platform reads: the operational surface an on-call product exists to
@@ -246,6 +255,7 @@ export default class AIToolbox {
246
255
  public static hasPermissionForTool(
247
256
  tool: ObservabilityTool,
248
257
  ctx: ToolContext,
258
+ args?: JSONObject,
249
259
  ): boolean {
250
260
  if (ctx.props.isRoot || ctx.props.isMasterAdmin) {
251
261
  return true;
@@ -270,15 +280,6 @@ export default class AIToolbox {
270
280
  return userPermission.permission;
271
281
  });
272
282
 
273
- if (
274
- PermissionHelper.doesPermissionsIntersect(
275
- blockedPermissions,
276
- tool.requiredPermissions,
277
- )
278
- ) {
279
- return false;
280
- }
281
-
282
283
  const userPermissions: Array<Permission> =
283
284
  DatabaseCommonInteractionPropsUtil.getUserPermissions(
284
285
  ctx.props,
@@ -287,9 +288,22 @@ export default class AIToolbox {
287
288
  return userPermission.permission;
288
289
  });
289
290
 
290
- return PermissionHelper.doesPermissionsIntersect(
291
- userPermissions,
292
- tool.requiredPermissions,
291
+ const groups: Array<Array<Permission>> =
292
+ args !== undefined && tool.getRequiredPermissionGroups
293
+ ? tool.getRequiredPermissionGroups(args)
294
+ : [tool.requiredPermissions];
295
+ return (
296
+ groups.length > 0 &&
297
+ groups.every((group: Array<Permission>): boolean => {
298
+ return (
299
+ group.length > 0 &&
300
+ !PermissionHelper.doesPermissionsIntersect(
301
+ blockedPermissions,
302
+ group,
303
+ ) &&
304
+ PermissionHelper.doesPermissionsIntersect(userPermissions, group)
305
+ );
306
+ })
293
307
  );
294
308
  }
295
309
 
@@ -321,7 +335,23 @@ export default class AIToolbox {
321
335
  };
322
336
  }
323
337
 
324
- if (!this.hasPermissionForTool(tool, data.ctx)) {
338
+ /*
339
+ * Tool JSON is untrusted at runtime even though callers are typed. Check
340
+ * the envelope before argument-dependent permission functions read it.
341
+ */
342
+ if (
343
+ !data.args ||
344
+ typeof data.args !== "object" ||
345
+ Array.isArray(data.args)
346
+ ) {
347
+ return {
348
+ success: false,
349
+ textForLlm: `Error: arguments for ${data.name} must be a JSON object. Adjust the arguments and try again.`,
350
+ errorMessage: `Invalid arguments for tool: ${data.name}; expected a JSON object`,
351
+ };
352
+ }
353
+
354
+ if (!this.hasPermissionForTool(tool, data.ctx, data.args)) {
325
355
  return {
326
356
  success: false,
327
357
  textForLlm: `Error: the current user does not have permission to use ${data.name}. Answer with the data you already have, and tell the user which permission is missing.`,