@oneuptime/common 12.0.4 → 12.0.5

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 (374) hide show
  1. package/Models/DatabaseModels/AIRun.ts +38 -1
  2. package/Models/DatabaseModels/AlertFeed.ts +30 -0
  3. package/Models/DatabaseModels/Dashboard.ts +28 -0
  4. package/Models/DatabaseModels/Incident.ts +2 -0
  5. package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
  6. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
  7. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  8. package/Models/DatabaseModels/IncidentFeed.ts +30 -0
  9. package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
  10. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  11. package/Models/DatabaseModels/LogSavedView.ts +33 -0
  12. package/Models/DatabaseModels/Project.ts +231 -9
  13. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
  14. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
  15. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  16. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +4 -4
  17. package/Models/DatabaseModels/StatusPage.ts +28 -0
  18. package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
  19. package/Server/API/AIAgentDataAPI.ts +44 -55
  20. package/Server/API/AIInvestigationAPI.ts +175 -17
  21. package/Server/API/DashboardAPI.ts +10 -10
  22. package/Server/API/StatusPageAPI.ts +38 -19
  23. package/Server/EnvironmentConfig.ts +16 -0
  24. package/Server/Infrastructure/ClickhouseConfig.ts +15 -1
  25. package/Server/Infrastructure/ClickhouseDatabase.ts +1 -1
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.ts +27 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.ts +89 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.ts +27 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.ts +40 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.ts +26 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  32. package/Server/Services/AIRunService.ts +78 -10
  33. package/Server/Services/AIService.ts +94 -22
  34. package/Server/Services/AlertFeedService.ts +5 -0
  35. package/Server/Services/AnalyticsDatabaseService.ts +29 -0
  36. package/Server/Services/DatabaseService.ts +43 -2
  37. package/Server/Services/IncidentFeedService.ts +5 -0
  38. package/Server/Services/LlmLogService.ts +46 -2
  39. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +6 -0
  40. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +4 -0
  41. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +8 -5
  42. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +90 -16
  43. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +2 -0
  44. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +2 -0
  45. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +223 -22
  46. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +25 -24
  47. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +182 -71
  48. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +252 -43
  49. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +25 -24
  50. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +47 -13
  51. package/Server/Utils/AI/SRE/InvestigationGrader.ts +9 -5
  52. package/Server/Utils/AI/SRE/InvestigationQueue.ts +141 -24
  53. package/Server/Utils/AI/SRE/InvestigationSubjectLock.ts +66 -0
  54. package/Server/Utils/AI/SRE/PostedRootCause.ts +94 -3
  55. package/Server/Utils/AI/SRE/README.md +1 -1
  56. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +132 -10
  57. package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +24 -0
  58. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +29 -0
  59. package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +56 -0
  60. package/Server/Utils/Monitor/MonitorMetricUtil.ts +46 -0
  61. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
  62. package/Server/Utils/PasswordHash.ts +28 -4
  63. package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +251 -0
  64. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +747 -0
  65. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +480 -0
  66. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1184 -0
  67. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +500 -0
  68. package/Tests/App/Dashboard/PortMonitorCriteriaFilter.test.ts +93 -0
  69. package/Tests/App/StatusPage/PublicStatusPageAPIErrorHandling.test.ts +117 -0
  70. package/Tests/App/StatusPage/StatusPageModelAPIPolymorphism.test.ts +223 -0
  71. package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +243 -0
  72. package/Tests/Server/API/AIAgentDataFixFromIncidentContext.test.ts +266 -0
  73. package/Tests/Server/API/AIInvestigationAPI.test.ts +594 -0
  74. package/Tests/Server/API/AIInvestigationCreateFixTask.test.ts +80 -0
  75. package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +172 -1
  76. package/Tests/Server/API/StatusPageMasterPasswordAPI.test.ts +335 -0
  77. package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +59 -5
  78. package/Tests/Server/Services/AIRunHumanVerdict.test.ts +127 -58
  79. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +396 -20
  80. package/Tests/Server/Services/AddMasterPasswordSaltMigration.test.ts +283 -0
  81. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +25 -1
  82. package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +45 -35
  83. package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +54 -0
  84. package/Tests/Server/Services/FeedAIRunAssociation.test.ts +125 -0
  85. package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +418 -57
  86. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +173 -14
  87. package/Tests/Server/Services/MasterPasswordScrypt.test.ts +567 -0
  88. package/Tests/Server/Services/SeparateIncidentAlertAiSettingsMigration.test.ts +194 -0
  89. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +37 -4
  90. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +330 -29
  91. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +25 -0
  92. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +293 -5
  93. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +59 -1
  94. package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +342 -19
  95. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +214 -30
  96. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +2 -0
  97. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +65 -17
  98. package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +3 -0
  99. package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +313 -20
  100. package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
  101. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +4 -0
  102. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +2 -0
  103. package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +44 -0
  104. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +30 -0
  105. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +212 -0
  106. package/Tests/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.test.ts +401 -0
  107. package/Tests/Server/Utils/Monitor/MonitorMetricUtilPortTimings.test.ts +243 -0
  108. package/Tests/Server/Utils/PasswordHash.test.ts +30 -0
  109. package/Tests/Types/Dashboard/DashboardTemplates.test.ts +111 -0
  110. package/Tests/Types/Monitor/CephMetricCatalog.test.ts +104 -0
  111. package/Tests/Types/Monitor/CriteriaFilter.test.ts +4 -0
  112. package/Tests/Types/Monitor/DockerMetricCatalog.test.ts +109 -0
  113. package/Tests/Types/Monitor/DockerSwarmMetricCatalog.test.ts +118 -0
  114. package/Tests/Types/Monitor/HostMetricCatalog.test.ts +104 -0
  115. package/Tests/Types/Monitor/IotMetricCatalog.test.ts +104 -0
  116. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +118 -0
  117. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +42 -0
  118. package/Tests/Types/Monitor/MonitorStep.test.ts +38 -0
  119. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +75 -0
  120. package/Tests/Types/Monitor/PodmanMetricCatalog.test.ts +109 -0
  121. package/Tests/Types/Monitor/ProxmoxMetricCatalog.test.ts +107 -0
  122. package/Tests/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.test.ts +151 -0
  123. package/Tests/Types/Permission.test.ts +137 -0
  124. package/Tests/Types/Rum/SessionReplayMaskingMode.test.ts +101 -0
  125. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +5 -5
  126. package/Tests/UI/Components/CardModelDetailEdit.test.tsx +3 -5
  127. package/Tests/UI/Components/ErrorBoundary.test.tsx +158 -0
  128. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +74 -0
  129. package/Tests/UI/Components/MoreMenu.test.tsx +756 -0
  130. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +62 -0
  131. package/Tests/UI/Monitor/PortMonitorView.test.tsx +237 -0
  132. package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +91 -0
  133. package/Tests/UI/Utils/DownloadFile.test.ts +103 -0
  134. package/Tests/UI/Utils/ErrorSupportBundle.test.ts +582 -0
  135. package/Tests/UI/Utils/Project.test.ts +31 -0
  136. package/Tests/UI/Utils/StatusPageModelAPIInjection.test.ts +245 -0
  137. package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +820 -0
  138. package/Tests/Utils/Dashboard/DashboardViewConfig.test.ts +329 -0
  139. package/Tests/Utils/Dashboard/GridLayout.test.ts +951 -0
  140. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +117 -0
  141. package/Tests/Utils/RecordingRuleExpression.test.ts +327 -0
  142. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +186 -0
  143. package/Tests/Utils/StatusPage/GroupTree.test.ts +456 -0
  144. package/Tests/Utils/StatusPage/OverviewGroupHierarchyVisibility.test.ts +588 -0
  145. package/Tests/Utils/Telemetry/SavedViewTimeRange.test.ts +244 -0
  146. package/Tests/Utils/Telemetry/TelemetryQueryTimeRange.test.ts +825 -0
  147. package/Types/AI/AIRunCodeFixRecommendation.ts +17 -0
  148. package/Types/AI/CodeFixTaskContext.ts +63 -3
  149. package/Types/AI/CodeFixTaskType.ts +3 -3
  150. package/Types/HashedString.ts +4 -3
  151. package/Types/Monitor/CriteriaFilter.ts +4 -0
  152. package/Types/Monitor/DomainMonitor/DomainLookupMethod.ts +23 -0
  153. package/Types/Monitor/DomainMonitor/DomainMonitorResponse.ts +7 -0
  154. package/Types/Monitor/MonitorCriteriaInstance.ts +24 -7
  155. package/Types/Monitor/MonitorMetricType.ts +8 -0
  156. package/Types/Monitor/MonitorStep.ts +10 -1
  157. package/Types/Monitor/MonitorStepDomainMonitor.ts +21 -0
  158. package/Types/Monitor/PortMonitor/PortMonitorTimings.ts +10 -0
  159. package/Types/Permission.ts +23 -175
  160. package/Types/Probe/ProbeMonitorResponse.ts +6 -0
  161. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +2 -3
  162. package/UI/Components/ErrorBoundary.tsx +138 -11
  163. package/UI/Components/Feed/FeedItem.tsx +9 -2
  164. package/UI/Components/ModelDetail/CardModelDetail.tsx +0 -12
  165. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  166. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +12 -2
  167. package/UI/Components/MoreMenu/MoreMenu.tsx +285 -97
  168. package/UI/Components/MoreMenu/MoreMenuItem.tsx +8 -5
  169. package/UI/Utils/DownloadFile.ts +16 -8
  170. package/UI/Utils/ErrorSupportBundle.ts +805 -0
  171. package/UI/Utils/ModelAPI/ModelAPI.ts +19 -8
  172. package/UI/Utils/Project.ts +4 -0
  173. package/UI/Utils/StatusPage.ts +8 -2
  174. package/UI/Utils/UseDashboardGridDnd.ts +917 -0
  175. package/Utils/Dashboard/DashboardViewConfig.ts +80 -36
  176. package/Utils/Dashboard/GridLayout.ts +523 -0
  177. package/Utils/Metrics/RecordingRuleExpression.ts +19 -17
  178. package/Utils/Monitor/MonitorMetricType.ts +44 -2
  179. package/Utils/StatusPage/GroupNestingLayout.ts +69 -0
  180. package/Utils/StatusPage/GroupTree.ts +157 -66
  181. package/Utils/StatusPage/ResourceUptime.ts +37 -2
  182. package/Utils/Telemetry/SavedViewTimeRange.ts +114 -0
  183. package/Utils/Telemetry/TelemetryQueryTimeRange.ts +334 -0
  184. package/build/dist/Models/DatabaseModels/AIRun.js +39 -1
  185. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  186. package/build/dist/Models/DatabaseModels/AlertFeed.js +32 -0
  187. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  188. package/build/dist/Models/DatabaseModels/Dashboard.js +29 -0
  189. package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
  190. package/build/dist/Models/DatabaseModels/Incident.js +2 -0
  191. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
  193. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
  194. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
  195. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  196. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  197. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  198. package/build/dist/Models/DatabaseModels/IncidentFeed.js +32 -0
  199. package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
  200. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
  201. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  202. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  203. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/LogSavedView.js +33 -0
  205. package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/Project.js +241 -11
  207. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
  209. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
  211. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  212. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  213. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  214. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +4 -4
  215. package/build/dist/Models/DatabaseModels/StatusPage.js +29 -0
  216. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  217. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
  218. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  219. package/build/dist/Server/API/AIAgentDataAPI.js +28 -46
  220. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  221. package/build/dist/Server/API/AIInvestigationAPI.js +111 -11
  222. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  223. package/build/dist/Server/API/DashboardAPI.js +8 -5
  224. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  225. package/build/dist/Server/API/StatusPageAPI.js +29 -11
  226. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  227. package/build/dist/Server/EnvironmentConfig.js +14 -0
  228. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  229. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +12 -1
  230. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  231. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +1 -1
  232. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
  233. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js +22 -0
  234. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js.map +1 -0
  235. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js +36 -0
  236. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js.map +1 -0
  237. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js +18 -0
  238. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js.map +1 -0
  239. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js +19 -0
  240. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js.map +1 -0
  241. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js +19 -0
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js.map +1 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  245. package/build/dist/Server/Services/AIRunService.js +58 -12
  246. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  247. package/build/dist/Server/Services/AIService.js +74 -21
  248. package/build/dist/Server/Services/AIService.js.map +1 -1
  249. package/build/dist/Server/Services/AlertFeedService.js +3 -0
  250. package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
  251. package/build/dist/Server/Services/AnalyticsDatabaseService.js +29 -1
  252. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  253. package/build/dist/Server/Services/DatabaseService.js +21 -2
  254. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  255. package/build/dist/Server/Services/IncidentFeedService.js +3 -0
  256. package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
  257. package/build/dist/Server/Services/LlmLogService.js +22 -1
  258. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  259. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
  260. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  261. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +4 -0
  262. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
  263. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +8 -5
  264. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  265. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +63 -24
  266. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  267. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +2 -0
  268. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  269. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +2 -0
  270. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  271. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +156 -28
  272. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  273. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +21 -19
  274. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  275. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +128 -49
  276. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
  277. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +170 -31
  278. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
  279. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +21 -19
  280. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  281. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +33 -9
  282. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
  283. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +9 -5
  284. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
  285. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +121 -41
  286. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  287. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js +46 -0
  288. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js.map +1 -0
  289. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js +61 -14
  290. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -1
  291. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +79 -1
  292. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
  293. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +21 -0
  294. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
  295. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +20 -3
  296. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  297. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +43 -0
  298. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
  299. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  300. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  301. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
  302. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  303. package/build/dist/Server/Utils/PasswordHash.js +25 -4
  304. package/build/dist/Server/Utils/PasswordHash.js.map +1 -1
  305. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js +18 -0
  306. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js.map +1 -0
  307. package/build/dist/Types/AI/CodeFixTaskContext.js +23 -3
  308. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
  309. package/build/dist/Types/AI/CodeFixTaskType.js +3 -3
  310. package/build/dist/Types/HashedString.js +4 -3
  311. package/build/dist/Types/HashedString.js.map +1 -1
  312. package/build/dist/Types/Monitor/CriteriaFilter.js +4 -0
  313. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  314. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js +24 -0
  315. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js.map +1 -0
  316. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +24 -7
  317. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  318. package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
  319. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  320. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  321. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  322. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +15 -0
  323. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
  324. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js +2 -0
  325. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js.map +1 -0
  326. package/build/dist/Types/Permission.js +23 -155
  327. package/build/dist/Types/Permission.js.map +1 -1
  328. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +2 -5
  329. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  330. package/build/dist/UI/Components/ErrorBoundary.js +67 -8
  331. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  332. package/build/dist/UI/Components/Feed/FeedItem.js +2 -2
  333. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  334. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +0 -12
  335. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  336. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  337. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  338. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +12 -2
  339. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  340. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +193 -65
  341. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  342. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +1 -1
  343. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  344. package/build/dist/UI/Utils/DownloadFile.js +15 -8
  345. package/build/dist/UI/Utils/DownloadFile.js.map +1 -1
  346. package/build/dist/UI/Utils/ErrorSupportBundle.js +476 -0
  347. package/build/dist/UI/Utils/ErrorSupportBundle.js.map +1 -0
  348. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -8
  349. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  350. package/build/dist/UI/Utils/Project.js +3 -0
  351. package/build/dist/UI/Utils/Project.js.map +1 -1
  352. package/build/dist/UI/Utils/StatusPage.js +4 -4
  353. package/build/dist/UI/Utils/StatusPage.js.map +1 -1
  354. package/build/dist/UI/Utils/UseDashboardGridDnd.js +551 -0
  355. package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -0
  356. package/build/dist/Utils/Dashboard/DashboardViewConfig.js +42 -26
  357. package/build/dist/Utils/Dashboard/DashboardViewConfig.js.map +1 -1
  358. package/build/dist/Utils/Dashboard/GridLayout.js +338 -0
  359. package/build/dist/Utils/Dashboard/GridLayout.js.map +1 -0
  360. package/build/dist/Utils/Metrics/RecordingRuleExpression.js +19 -17
  361. package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -1
  362. package/build/dist/Utils/Monitor/MonitorMetricType.js +38 -6
  363. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  364. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +46 -0
  365. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -1
  366. package/build/dist/Utils/StatusPage/GroupTree.js +79 -34
  367. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -1
  368. package/build/dist/Utils/StatusPage/ResourceUptime.js +22 -1
  369. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  370. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js +79 -0
  371. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js.map +1 -0
  372. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js +236 -0
  373. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js.map +1 -0
  374. package/package.json +1 -1
@@ -264,6 +264,8 @@ export default class RemediationPlanRunner {
264
264
  attemptCount,
265
265
  request: {
266
266
  feature: AI_REMEDIATION_PLANNING_FEATURE,
267
+ incidentId: suggestion!.incidentId,
268
+ alertId: suggestion!.alertId,
267
269
  contextSummary,
268
270
  postAnalysis: async (postData: {
269
271
  analysisMarkdown: string;
@@ -6,6 +6,7 @@ import {
6
6
  AIRunEventResultSummary,
7
7
  } from "../../../../Types/AI/AIChatTypes";
8
8
  import AIRunStatus from "../../../../Types/AI/AIRunStatus";
9
+ import AIRunCodeFixRecommendation from "../../../../Types/AI/AIRunCodeFixRecommendation";
9
10
  import AIRunEventType from "../../../../Types/AI/AIRunEventType";
10
11
  import AIRunEvent from "../../../../Models/DatabaseModels/AIRunEvent";
11
12
  import Project from "../../../../Models/DatabaseModels/Project";
@@ -49,6 +50,12 @@ const MAX_TOOL_CALLS: number = 12;
49
50
  const MAX_WALL_CLOCK_MS: number = 150 * 1000;
50
51
  const MAX_OUTPUT_TOKENS: number = 2000;
51
52
 
53
+ /*
54
+ * Conditional recommendation persistence is idempotent, so transient
55
+ * database failures can be retried without risking a second decision.
56
+ */
57
+ const CODE_FIX_RECOMMENDATION_PERSIST_ATTEMPTS: number = 3;
58
+
52
59
  /*
53
60
  * Failures a retry cannot fix within the run's usefulness window: missing/
54
61
  * broken provider configuration and budget exhaustion (both messages minted
@@ -89,6 +96,12 @@ export type AISubjectType = "Incident" | "Alert";
89
96
  export interface InvestigationRequest {
90
97
  // Label recorded on LlmLog, e.g. "AI Incident Investigation".
91
98
  feature: string;
99
+ /*
100
+ * The subject lane used for per-incident / per-alert autonomous budgets.
101
+ * Insight triage is intentionally subjectless and leaves both unset.
102
+ */
103
+ incidentId?: ObjectID | undefined;
104
+ alertId?: ObjectID | undefined;
92
105
  // A compact markdown summary of the subject that seeds the investigation.
93
106
  contextSummary: string;
94
107
  /*
@@ -105,6 +118,21 @@ export interface InvestigationRequest {
105
118
  confidence: ConfidenceSignal;
106
119
  result: ObservabilityAssistantResult;
107
120
  }) => Promise<void>;
121
+ /*
122
+ * Incident and alert RCA runs opt into a persisted code-fix decision.
123
+ * Other users of this engine (insight triage and remediation) omit it and
124
+ * remain NotRecommended throughout their lifecycle.
125
+ */
126
+ persistCodeFixRecommendation?: boolean | undefined;
127
+ /*
128
+ * Runs only after a Recommended decision and its exact analysis snapshot
129
+ * have been durably committed. Incident/alert runners use this for the
130
+ * optional automatic FixFromIncident lane; persistence failure means the
131
+ * callback is never invoked.
132
+ */
133
+ onCodeFixRecommended?:
134
+ | ((data: { analysisMarkdown: string }) => Promise<void>)
135
+ | undefined;
108
136
  /*
109
137
  * Optional: called exactly once when THIS attempt settles the run into a
110
138
  * terminal state — Completed (with or without an analysis, and even when
@@ -264,7 +292,7 @@ export default class AIInvestigationEngine {
264
292
  * EVERY step — a slow self-hosted LLM call can approach the sweeper's
265
293
  * timeout, so the heartbeat must be as frequent as we can make it.
266
294
  */
267
- await this.touchHeartbeat(aiRunId);
295
+ await this.touchHeartbeat(aiRunId, data.attemptCount);
268
296
  };
269
297
 
270
298
  /*
@@ -279,6 +307,9 @@ export default class AIInvestigationEngine {
279
307
  const result: ObservabilityAssistantResult =
280
308
  await ObservabilityAssistant.answerQuestion({
281
309
  projectId,
310
+ incidentId: request.incidentId,
311
+ alertId: request.alertId,
312
+ aiRunId,
282
313
  // System run — full read access to the project's telemetry.
283
314
  props: { isRoot: true },
284
315
  feature: request.feature,
@@ -307,8 +338,14 @@ export default class AIInvestigationEngine {
307
338
  {
308
339
  aiRunId,
309
340
  fromStatus: AIRunStatus.Running,
341
+ expectedAttemptCount: data.attemptCount,
310
342
  set: {
311
343
  status: AIRunStatus.Completed,
344
+ ...(request.persistCodeFixRecommendation === true
345
+ ? {
346
+ codeFixRecommendation: AIRunCodeFixRecommendation.Pending,
347
+ }
348
+ : {}),
312
349
  completedAt: OneUptimeDate.getCurrentDate(),
313
350
  lastHeartbeatAt: OneUptimeDate.getCurrentDate(),
314
351
  llmCallCount: result.llmCallCount,
@@ -327,13 +364,6 @@ export default class AIInvestigationEngine {
327
364
 
328
365
  settledAsCompleted = true;
329
366
 
330
- await this.emitEvent({
331
- projectId,
332
- aiRunId,
333
- sequence: sequence++,
334
- eventType: AIRunEventType.RunCompleted,
335
- });
336
-
337
367
  const analysis: string = (result.contentInMarkdown || "").trim();
338
368
 
339
369
  if (!analysis) {
@@ -341,10 +371,24 @@ export default class AIInvestigationEngine {
341
371
  `AI: investigation (run ${aiRunId.toString()}) produced no analysis; nothing posted.`,
342
372
  );
343
373
 
374
+ if (request.persistCodeFixRecommendation === true) {
375
+ await this.finalizeCodeFixRecommendation({
376
+ aiRunId,
377
+ recommendation: AIRunCodeFixRecommendation.NotRecommended,
378
+ });
379
+ }
380
+
344
381
  /*
345
382
  * No analysis is still a settled run — the subject must not lose
346
383
  * its deferred remediation because the model had nothing to say.
347
384
  */
385
+ await this.emitEvent({
386
+ projectId,
387
+ aiRunId,
388
+ sequence: sequence++,
389
+ eventType: AIRunEventType.RunCompleted,
390
+ });
391
+
348
392
  await this.invokeOnSettled(request, aiRunId);
349
393
  return;
350
394
  }
@@ -367,18 +411,78 @@ export default class AIInvestigationEngine {
367
411
  await AIConfidenceSignal.computeConfidenceSignal({
368
412
  projectId,
369
413
  aiRunId,
414
+ incidentId: request.incidentId,
415
+ alertId: request.alertId,
370
416
  analysisMarkdown: analysis,
371
417
  evidence: AIConfidenceSignal.evidenceFromCitations(
372
418
  result.citations || [],
373
419
  ),
374
420
  });
375
421
 
422
+ /*
423
+ * Build the posted form exactly once. The same immutable string is
424
+ * handed to the subject feed, persisted with the recommendation, and
425
+ * supplied to the automatic fix trigger by the subject runner.
426
+ */
427
+ const investigationAnalysisMarkdown: string = this.buildBrandedMarkdown(
428
+ result,
429
+ analysis,
430
+ );
431
+
376
432
  await request.postAnalysis({
377
- analysisMarkdown: this.buildBrandedMarkdown(result, analysis),
433
+ analysisMarkdown: investigationAnalysisMarkdown,
378
434
  confidence,
379
435
  result,
380
436
  });
381
437
 
438
+ /*
439
+ * Only expose the manual Fix PR action after the cited analysis has
440
+ * actually been posted. The same structured, fail-closed decision also
441
+ * gates the automatic FixFromIncident lane in the subject runner.
442
+ */
443
+ if (request.persistCodeFixRecommendation === true) {
444
+ if (AIConfidenceSignal.isCodeFixRecommended(confidence)) {
445
+ const recommendationPersisted: boolean =
446
+ await this.finalizeCodeFixRecommendation({
447
+ aiRunId,
448
+ recommendation: AIRunCodeFixRecommendation.Recommended,
449
+ investigationAnalysisMarkdown,
450
+ });
451
+
452
+ if (recommendationPersisted && request.onCodeFixRecommended) {
453
+ try {
454
+ await request.onCodeFixRecommended({
455
+ analysisMarkdown: investigationAnalysisMarkdown,
456
+ });
457
+ } catch (error) {
458
+ logger.error(
459
+ `AI: post-recommendation follow-up failed for run ${aiRunId.toString()}: ${error}`,
460
+ );
461
+ }
462
+ }
463
+ } else {
464
+ await this.finalizeCodeFixRecommendation({
465
+ aiRunId,
466
+ recommendation: AIRunCodeFixRecommendation.NotRecommended,
467
+ });
468
+ }
469
+ }
470
+
471
+ /*
472
+ * RunCompleted is the durable publication-settlement signal, not just
473
+ * the earlier status CAS. The dashboard keeps polling a Completed run
474
+ * until either the matching report exists or this final event proves
475
+ * that finalization ended without one. Recommendation settlement and
476
+ * its post-persistence callback have finished before this event. If
477
+ * confidence/postAnalysis throws, the catch path emits RunFailed.
478
+ */
479
+ await this.emitEvent({
480
+ projectId,
481
+ aiRunId,
482
+ sequence: sequence++,
483
+ eventType: AIRunEventType.RunCompleted,
484
+ });
485
+
382
486
  logger.debug(
383
487
  `AI: investigation complete (run ${aiRunId.toString()}, confident=${confidence.confident} via ${confidence.source}, ${result.llmCallCount} LLM calls, ${result.toolCallCount} tools, ${result.totalTokens} tokens).`,
384
488
  );
@@ -389,12 +493,17 @@ export default class AIInvestigationEngine {
389
493
  const message: string =
390
494
  error instanceof Error ? error.message : String(error);
391
495
 
392
- await this.emitEvent({
393
- projectId,
394
- aiRunId,
395
- sequence: sequence++,
396
- eventType: AIRunEventType.RunFailed,
397
- });
496
+ /*
497
+ * A failure after the Running -> Completed transition (classification
498
+ * or posting the RCA) must not strand the panel in Pending forever or
499
+ * offer a PR without a posted analysis. Fail closed.
500
+ */
501
+ if (settledAsCompleted && request.persistCodeFixRecommendation === true) {
502
+ await this.finalizeCodeFixRecommendation({
503
+ aiRunId,
504
+ recommendation: AIRunCodeFixRecommendation.NotRecommended,
505
+ });
506
+ }
398
507
 
399
508
  /*
400
509
  * Hand the failure to the queue's retry policy: transient errors
@@ -423,7 +532,22 @@ export default class AIInvestigationEngine {
423
532
  * settled (the retry owns it), and "noop" without a won Completed
424
533
  * means another actor moved the run and owns settlement.
425
534
  */
426
- if (settledAsCompleted || outcome === "finalized") {
535
+ const ownsTerminalOutcome: boolean =
536
+ settledAsCompleted || outcome === "finalized";
537
+
538
+ if (ownsTerminalOutcome) {
539
+ /*
540
+ * Emit terminal failure only after ownership is established. A stale
541
+ * or requeued attempt can finish after the retry's RunStarted; letting
542
+ * it append RunFailed would falsely look like the retry settled.
543
+ */
544
+ await this.emitEvent({
545
+ projectId,
546
+ aiRunId,
547
+ sequence: sequence++,
548
+ eventType: AIRunEventType.RunFailed,
549
+ });
550
+
427
551
  await this.invokeOnSettled(request, aiRunId);
428
552
  }
429
553
 
@@ -455,6 +579,78 @@ export default class AIInvestigationEngine {
455
579
  }
456
580
  }
457
581
 
582
+ /*
583
+ * Resolve the recommendation exactly once. Pending is written by the
584
+ * winning Completed CAS, so this conditional update cannot race a stale
585
+ * attempt or overwrite a decision another actor already settled. A
586
+ * Recommended decision carries the exact analysis snapshot it classified;
587
+ * manual and automatic fix tasks never have to re-read mutable feed state.
588
+ *
589
+ * Best-effort like the event trail: transient database errors are retried,
590
+ * but recommendation persistence never turns a completed investigation
591
+ * into a failed run. A zero-row update is safe (the row was already settled
592
+ * or removed) and is logged rather than retried.
593
+ */
594
+ private static async finalizeCodeFixRecommendation(
595
+ data:
596
+ | {
597
+ aiRunId: ObjectID;
598
+ recommendation: AIRunCodeFixRecommendation.Recommended;
599
+ investigationAnalysisMarkdown: string;
600
+ }
601
+ | {
602
+ aiRunId: ObjectID;
603
+ recommendation: AIRunCodeFixRecommendation.NotRecommended;
604
+ },
605
+ ): Promise<boolean> {
606
+ for (
607
+ let attempt: number = 1;
608
+ attempt <= CODE_FIX_RECOMMENDATION_PERSIST_ATTEMPTS;
609
+ attempt++
610
+ ) {
611
+ try {
612
+ const updatedCount: number =
613
+ await AIRunService.finalizeInvestigationCodeFixRecommendation(
614
+ data.recommendation === AIRunCodeFixRecommendation.Recommended
615
+ ? {
616
+ aiRunId: data.aiRunId,
617
+ recommendation: data.recommendation,
618
+ taskContext: {
619
+ sourceInvestigationRunId: data.aiRunId.toString(),
620
+ sourceInvestigationAnalysisMarkdown:
621
+ data.investigationAnalysisMarkdown,
622
+ },
623
+ }
624
+ : {
625
+ aiRunId: data.aiRunId,
626
+ recommendation: data.recommendation,
627
+ },
628
+ );
629
+
630
+ if (updatedCount === 0) {
631
+ logger.warn(
632
+ `AI: code-fix recommendation for run ${data.aiRunId.toString()} was no longer Pending; leaving the existing decision unchanged.`,
633
+ );
634
+ return false;
635
+ }
636
+ return true;
637
+ } catch (error) {
638
+ if (attempt === CODE_FIX_RECOMMENDATION_PERSIST_ATTEMPTS) {
639
+ logger.error(
640
+ `AI: failed to persist code-fix recommendation for run ${data.aiRunId.toString()} after ${attempt} attempts: ${error}`,
641
+ );
642
+ return false;
643
+ }
644
+
645
+ logger.warn(
646
+ `AI: failed to persist code-fix recommendation for run ${data.aiRunId.toString()} (attempt ${attempt}/${CODE_FIX_RECOMMENDATION_PERSIST_ATTEMPTS}); retrying: ${error}`,
647
+ );
648
+ }
649
+ }
650
+
651
+ return false;
652
+ }
653
+
458
654
  // Wrap the agent's analysis with AI branding + an evidence list.
459
655
  private static buildBrandedMarkdown(
460
656
  result: ObservabilityAssistantResult,
@@ -481,14 +677,19 @@ export default class AIInvestigationEngine {
481
677
  }
482
678
 
483
679
  // Refresh lastHeartbeatAt so a long-running investigation isn't swept as stale.
484
- private static async touchHeartbeat(aiRunId: ObjectID): Promise<void> {
680
+ private static async touchHeartbeat(
681
+ aiRunId: ObjectID,
682
+ attemptCount: number,
683
+ ): Promise<void> {
485
684
  try {
486
- await AIRunService.updateOneBy({
487
- query: { _id: aiRunId.toString(), status: AIRunStatus.Running },
488
- data: {
685
+ await AIRunService.attemptStatusTransition({
686
+ aiRunId,
687
+ fromStatus: AIRunStatus.Running,
688
+ expectedAttemptCount: attemptCount,
689
+ set: {
690
+ status: AIRunStatus.Running,
489
691
  lastHeartbeatAt: OneUptimeDate.getCurrentDate(),
490
- } as never,
491
- props: { isRoot: true },
692
+ },
492
693
  });
493
694
  } catch (error) {
494
695
  logger.error(`AI: heartbeat update failed: ${error}`);
@@ -169,7 +169,9 @@ export default class AIAlertInvestigationRunner {
169
169
  request: {
170
170
  // Persisted LlmLog label — owned by AIService (G4 budget list).
171
171
  feature: AI_ALERT_INVESTIGATION_FEATURE,
172
+ alertId,
172
173
  contextSummary,
174
+ persistCodeFixRecommendation: true,
173
175
  postAnalysis: async (postData: {
174
176
  analysisMarkdown: string;
175
177
  confidence: ConfidenceSignal;
@@ -178,6 +180,7 @@ export default class AIAlertInvestigationRunner {
178
180
  await AlertFeedService.createAlertFeedItem({
179
181
  alertId,
180
182
  projectId,
183
+ aiRunId,
181
184
  alertFeedEventType: AlertFeedEventType.RootCause,
182
185
  displayColor: Blue500,
183
186
  feedInfoInMarkdown: postData.analysisMarkdown,
@@ -197,7 +200,7 @@ export default class AIAlertInvestigationRunner {
197
200
 
198
201
  /*
199
202
  * Inconclusive means the telemetry was insufficient — for
200
- * opted-in projects (Project.enableInstrumentationFixTasks,
203
+ * opted-in projects (the alert instrumentation-fix setting,
201
204
  * default false), queue an ImproveInstrumentation fix task that
202
205
  * opens a PR adding the missing observability. Runs strictly
203
206
  * AFTER the analysis is posted, and the trigger never throws, so
@@ -218,29 +221,25 @@ export default class AIAlertInvestigationRunner {
218
221
  },
219
222
  );
220
223
  }
221
-
222
- /*
223
- * The confident twin: a POSITIVE confident classification means
224
- * the posted analysis asserts an evidenced root cause — for
225
- * opted-in projects (Project.enableAutomaticCodeFixes, default
226
- * false), automatically queue the FixFromIncident task that
227
- * opens a draft fix PR from this analysis (the automatic form
228
- * of the "Open Fix PR from this analysis" button). Runs strictly
229
- * AFTER the analysis is posted because the posted RootCause feed
230
- * item IS the fix task's entire context, and the trigger never
231
- * throws. Fail direction (G6): the deterministic floor and a
232
- * failed classification never auto-open a PR.
233
- */
234
- if (
235
- AIConfidenceSignal.shouldAutoEnqueueCodeFixTask(postData.confidence)
236
- ) {
237
- await FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation(
238
- {
239
- projectId,
240
- alertId,
241
- },
242
- );
243
- }
224
+ },
225
+ /*
226
+ * The engine calls this only after it atomically persists Recommended
227
+ * with the exact posted analysis snapshot. That durable decision is
228
+ * the prerequisite for the optional automatic FixFromIncident task;
229
+ * the trigger then applies the alert lane's independent opt-in and
230
+ * remaining repository, budget and dedupe gates.
231
+ */
232
+ onCodeFixRecommended: async (data: {
233
+ analysisMarkdown: string;
234
+ }): Promise<void> => {
235
+ await FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation(
236
+ {
237
+ projectId,
238
+ investigationRunId: aiRunId,
239
+ analysisMarkdown: data.analysisMarkdown,
240
+ alertId,
241
+ },
242
+ );
244
243
  },
245
244
  /*
246
245
  * RCA-first ordering: auto-remediation for this alert was deferred
@@ -338,6 +337,8 @@ export default class AIAlertInvestigationRunner {
338
337
  projectId,
339
338
  monitorId: alert.monitorId,
340
339
  runType: AIRunType.Investigation,
340
+ triggeredByIncidentId: QueryHelper.isNull(),
341
+ triggeredByAlertId: QueryHelper.notNull(),
341
342
  createdAt: QueryHelper.greaterThan(windowStart),
342
343
  },
343
344
  props: { isRoot: true },