@oneuptime/common 12.0.3 → 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 (516) hide show
  1. package/Models/DatabaseModels/AIRun.ts +38 -1
  2. package/Models/DatabaseModels/AlertFeed.ts +30 -0
  3. package/Models/DatabaseModels/CephCluster.ts +14 -0
  4. package/Models/DatabaseModels/CodeRepository.ts +14 -6
  5. package/Models/DatabaseModels/Dashboard.ts +28 -0
  6. package/Models/DatabaseModels/DockerHost.ts +14 -0
  7. package/Models/DatabaseModels/GlobalOidcProject.ts +18 -0
  8. package/Models/DatabaseModels/GlobalSsoProject.ts +18 -0
  9. package/Models/DatabaseModels/Incident.ts +2 -0
  10. package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
  11. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
  12. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  13. package/Models/DatabaseModels/IncidentFeed.ts +30 -0
  14. package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
  15. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  16. package/Models/DatabaseModels/IoTFleet.ts +14 -0
  17. package/Models/DatabaseModels/KubernetesCluster.ts +14 -0
  18. package/Models/DatabaseModels/LogSavedView.ts +33 -0
  19. package/Models/DatabaseModels/NetworkDevice.ts +14 -0
  20. package/Models/DatabaseModels/NetworkInterface.ts +18 -0
  21. package/Models/DatabaseModels/Project.ts +247 -11
  22. package/Models/DatabaseModels/ProxmoxCluster.ts +14 -0
  23. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
  24. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
  25. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  26. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +4 -4
  27. package/Models/DatabaseModels/Service.ts +30 -0
  28. package/Models/DatabaseModels/StatusPage.ts +28 -0
  29. package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
  30. package/Models/DatabaseModels/StatusPagePrivateUser.ts +30 -0
  31. package/Models/DatabaseModels/User.ts +30 -0
  32. package/Server/API/AIAgentDataAPI.ts +75 -55
  33. package/Server/API/AIInvestigationAPI.ts +175 -17
  34. package/Server/API/DashboardAPI.ts +429 -22
  35. package/Server/API/GitHubAPI.ts +119 -283
  36. package/Server/API/StatusPageAPI.ts +38 -19
  37. package/Server/API/UserAPI.ts +263 -1
  38. package/Server/EnvironmentConfig.ts +23 -3
  39. package/Server/Infrastructure/ClickhouseConfig.ts +15 -1
  40. package/Server/Infrastructure/ClickhouseDatabase.ts +1 -1
  41. package/Server/Infrastructure/GlobalCache.ts +37 -0
  42. package/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.ts +21 -0
  43. package/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.ts +68 -0
  44. package/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.ts +27 -0
  45. package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +100 -0
  46. package/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.ts +89 -0
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.ts +27 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts +214 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.ts +69 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.ts +40 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.ts +26 -0
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
  53. package/Server/Services/AIRunService.ts +78 -10
  54. package/Server/Services/AIService.ts +94 -22
  55. package/Server/Services/AlertFeedService.ts +5 -0
  56. package/Server/Services/AnalyticsDatabaseService.ts +101 -1
  57. package/Server/Services/CodeRepositoryService.ts +105 -2
  58. package/Server/Services/DatabaseService.ts +227 -3
  59. package/Server/Services/IncidentFeedService.ts +5 -0
  60. package/Server/Services/LlmLogService.ts +46 -2
  61. package/Server/Services/OpenTelemetryIngestService.ts +230 -26
  62. package/Server/Services/UserService.ts +184 -0
  63. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +6 -0
  64. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +4 -0
  65. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +8 -5
  66. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +90 -16
  67. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +2 -0
  68. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +2 -0
  69. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +223 -22
  70. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +25 -24
  71. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +182 -71
  72. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +252 -43
  73. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +25 -24
  74. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +47 -13
  75. package/Server/Utils/AI/SRE/InvestigationGrader.ts +9 -5
  76. package/Server/Utils/AI/SRE/InvestigationQueue.ts +141 -24
  77. package/Server/Utils/AI/SRE/InvestigationSubjectLock.ts +66 -0
  78. package/Server/Utils/AI/SRE/PostedRootCause.ts +94 -3
  79. package/Server/Utils/AI/SRE/README.md +1 -1
  80. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +132 -10
  81. package/Server/Utils/AI/Toolbox/CodeTools.ts +45 -4
  82. package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +24 -0
  83. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -0
  84. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +157 -4
  85. package/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.ts +130 -0
  86. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +29 -0
  87. package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +56 -0
  88. package/Server/Utils/Monitor/MonitorMetricUtil.ts +46 -0
  89. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
  90. package/Server/Utils/PasswordHash.ts +330 -0
  91. package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +251 -0
  92. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +747 -0
  93. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +480 -0
  94. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1184 -0
  95. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +500 -0
  96. package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +333 -0
  97. package/Tests/App/Dashboard/PortMonitorCriteriaFilter.test.ts +93 -0
  98. package/Tests/App/Dashboard/UserCustomFields.test.tsx +392 -0
  99. package/Tests/App/StatusPage/PublicStatusPageAPIErrorHandling.test.ts +117 -0
  100. package/Tests/App/StatusPage/StatusPageModelAPIPolymorphism.test.ts +223 -0
  101. package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +243 -0
  102. package/Tests/Server/API/AIAgentDataFixFromIncidentContext.test.ts +266 -0
  103. package/Tests/Server/API/AIAgentDataRepositoryToken.test.ts +381 -0
  104. package/Tests/Server/API/AIInvestigationAPI.test.ts +594 -0
  105. package/Tests/Server/API/AIInvestigationCreateFixTask.test.ts +80 -0
  106. package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +172 -1
  107. package/Tests/Server/API/DashboardPublicAttributeValuesAPI.test.ts +943 -0
  108. package/Tests/Server/API/DashboardPublicMetricsAggregateAPI.test.ts +1296 -0
  109. package/Tests/Server/API/DashboardPublicTemplatePayloads.test.ts +598 -0
  110. package/Tests/Server/API/GitHubAppInstallationBindingAPI.test.ts +539 -0
  111. package/Tests/Server/API/Helpers.ts +6 -1
  112. package/Tests/Server/API/StatusPageMasterPasswordAPI.test.ts +335 -0
  113. package/Tests/Server/API/UserProjectsAPI.test.ts +852 -0
  114. package/Tests/Server/Infrastructure/GlobalCache.test.ts +128 -0
  115. package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +215 -0
  116. package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +59 -5
  117. package/Tests/Server/Services/AIRunHumanVerdict.test.ts +127 -58
  118. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +396 -20
  119. package/Tests/Server/Services/AddMasterPasswordSaltMigration.test.ts +283 -0
  120. package/Tests/Server/Services/AddPerUserPasswordSaltMigration.test.ts +178 -0
  121. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +582 -0
  122. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +30 -1
  123. package/Tests/Server/Services/CodeRepositoryInstallationBinding.test.ts +305 -0
  124. package/Tests/Server/Services/CodeRepositoryResolutionBinding.test.ts +147 -0
  125. package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +880 -0
  126. package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +54 -0
  127. package/Tests/Server/Services/FeedAIRunAssociation.test.ts +125 -0
  128. package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +418 -57
  129. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +173 -14
  130. package/Tests/Server/Services/MasterPasswordScrypt.test.ts +567 -0
  131. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +568 -0
  132. package/Tests/Server/Services/RestoreDroppedUniqueIndexesMigration.test.ts +386 -0
  133. package/Tests/Server/Services/RestoreServiceLowerNameIndexMigration.test.ts +240 -0
  134. package/Tests/Server/Services/SeparateIncidentAlertAiSettingsMigration.test.ts +194 -0
  135. package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +885 -0
  136. package/Tests/Server/Services/WidenHashedStringColumnsForScryptMigration.test.ts +220 -0
  137. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +37 -4
  138. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +330 -29
  139. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +25 -0
  140. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +293 -5
  141. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +59 -1
  142. package/Tests/Server/Utils/AI/CodeTools.test.ts +47 -1
  143. package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +10 -0
  144. package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +342 -19
  145. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +214 -30
  146. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +2 -0
  147. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +65 -17
  148. package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +3 -0
  149. package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +313 -20
  150. package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
  151. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +4 -0
  152. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +2 -0
  153. package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +44 -0
  154. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +30 -0
  155. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +120 -0
  156. package/Tests/Server/Utils/CodeRepository/GitHubInstallationBinding.test.ts +292 -0
  157. package/Tests/Server/Utils/GitHubInstallationOwnershipVerification.test.ts +340 -0
  158. package/Tests/Server/Utils/GitHubWebhookAndTreeCacheIsolation.test.ts +250 -0
  159. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +212 -0
  160. package/Tests/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.test.ts +401 -0
  161. package/Tests/Server/Utils/Monitor/MonitorMetricUtilPortTimings.test.ts +243 -0
  162. package/Tests/Server/Utils/PasswordHash.test.ts +585 -0
  163. package/Tests/Types/Dashboard/DashboardTemplates.test.ts +111 -0
  164. package/Tests/Types/Database/ColumnLength.test.ts +7 -1
  165. package/Tests/Types/HashedStringPerUserSalt.test.ts +476 -0
  166. package/Tests/Types/Monitor/CephMetricCatalog.test.ts +104 -0
  167. package/Tests/Types/Monitor/CriteriaFilter.test.ts +4 -0
  168. package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +293 -0
  169. package/Tests/Types/Monitor/DockerMetricCatalog.test.ts +109 -0
  170. package/Tests/Types/Monitor/DockerSwarmMetricCatalog.test.ts +118 -0
  171. package/Tests/Types/Monitor/HostAlertTemplates.test.ts +249 -0
  172. package/Tests/Types/Monitor/HostMetricCatalog.test.ts +104 -0
  173. package/Tests/Types/Monitor/IotAlertTemplates.test.ts +320 -0
  174. package/Tests/Types/Monitor/IotMetricCatalog.test.ts +104 -0
  175. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +118 -0
  176. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +42 -0
  177. package/Tests/Types/Monitor/MonitorStep.test.ts +38 -0
  178. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +75 -0
  179. package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +271 -0
  180. package/Tests/Types/Monitor/PodmanMetricCatalog.test.ts +109 -0
  181. package/Tests/Types/Monitor/ProxmoxMetricCatalog.test.ts +107 -0
  182. package/Tests/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.test.ts +151 -0
  183. package/Tests/Types/Permission.test.ts +137 -0
  184. package/Tests/Types/Rum/SessionReplayMaskingMode.test.ts +101 -0
  185. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +5 -5
  186. package/Tests/UI/Components/CardModelDetailEdit.test.tsx +3 -5
  187. package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +696 -0
  188. package/Tests/UI/Components/ErrorBoundary.test.tsx +158 -0
  189. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +74 -0
  190. package/Tests/UI/Components/MoreMenu.test.tsx +756 -0
  191. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +62 -0
  192. package/Tests/UI/Monitor/PortMonitorView.test.tsx +237 -0
  193. package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +91 -0
  194. package/Tests/UI/Utils/DownloadFile.test.ts +103 -0
  195. package/Tests/UI/Utils/ErrorSupportBundle.test.ts +582 -0
  196. package/Tests/UI/Utils/Project.test.ts +31 -0
  197. package/Tests/UI/Utils/StatusPageModelAPIInjection.test.ts +245 -0
  198. package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +820 -0
  199. package/Tests/UI/Utils/UserProjectsModelAPI.test.ts +714 -0
  200. package/Tests/Utils/Dashboard/DashboardViewConfig.test.ts +329 -0
  201. package/Tests/Utils/Dashboard/GridLayout.test.ts +951 -0
  202. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +117 -0
  203. package/Tests/Utils/RecordingRuleExpression.test.ts +327 -0
  204. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +186 -0
  205. package/Tests/Utils/StatusPage/GroupTree.test.ts +456 -0
  206. package/Tests/Utils/StatusPage/OverviewGroupHierarchyVisibility.test.ts +588 -0
  207. package/Tests/Utils/TeamMembersByProject.test.ts +655 -0
  208. package/Tests/Utils/Telemetry/SavedViewTimeRange.test.ts +244 -0
  209. package/Tests/Utils/Telemetry/TelemetryQueryTimeRange.test.ts +825 -0
  210. package/Types/AI/AIRunCodeFixRecommendation.ts +17 -0
  211. package/Types/AI/CodeFixTaskContext.ts +63 -3
  212. package/Types/AI/CodeFixTaskType.ts +3 -3
  213. package/Types/Database/ColumnLength.ts +9 -1
  214. package/Types/Database/TableColumn.ts +11 -0
  215. package/Types/Database/UnsynchronizedIndex.ts +48 -0
  216. package/Types/HashedString.ts +140 -4
  217. package/Types/Monitor/CriteriaFilter.ts +4 -0
  218. package/Types/Monitor/DomainMonitor/DomainLookupMethod.ts +23 -0
  219. package/Types/Monitor/DomainMonitor/DomainMonitorResponse.ts +7 -0
  220. package/Types/Monitor/MonitorCriteriaInstance.ts +24 -7
  221. package/Types/Monitor/MonitorMetricType.ts +8 -0
  222. package/Types/Monitor/MonitorStep.ts +10 -1
  223. package/Types/Monitor/MonitorStepDomainMonitor.ts +21 -0
  224. package/Types/Monitor/PortMonitor/PortMonitorTimings.ts +10 -0
  225. package/Types/Permission.ts +23 -175
  226. package/Types/Probe/ProbeMonitorResponse.ts +6 -0
  227. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +2 -3
  228. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +85 -11
  229. package/UI/Components/ErrorBoundary.tsx +138 -11
  230. package/UI/Components/Feed/FeedItem.tsx +9 -2
  231. package/UI/Components/ModelDetail/CardModelDetail.tsx +0 -12
  232. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  233. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +12 -2
  234. package/UI/Components/MoreMenu/MoreMenu.tsx +285 -97
  235. package/UI/Components/MoreMenu/MoreMenuItem.tsx +8 -5
  236. package/UI/Components/Navbar/NavBar.tsx +12 -2
  237. package/UI/Components/Navbar/NavBarMenuModal.tsx +19 -7
  238. package/UI/Utils/DownloadFile.ts +16 -8
  239. package/UI/Utils/ErrorSupportBundle.ts +805 -0
  240. package/UI/Utils/ModelAPI/ModelAPI.ts +19 -8
  241. package/UI/Utils/ModelAPI/UserProjectsModelAPI.ts +257 -0
  242. package/UI/Utils/Project.ts +4 -0
  243. package/UI/Utils/StatusPage.ts +8 -2
  244. package/UI/Utils/UseDashboardGridDnd.ts +917 -0
  245. package/Utils/Dashboard/DashboardViewConfig.ts +80 -36
  246. package/Utils/Dashboard/GridLayout.ts +523 -0
  247. package/Utils/Metrics/RecordingRuleExpression.ts +19 -17
  248. package/Utils/Monitor/MonitorMetricType.ts +44 -2
  249. package/Utils/StatusPage/GroupNestingLayout.ts +69 -0
  250. package/Utils/StatusPage/GroupTree.ts +157 -66
  251. package/Utils/StatusPage/ResourceUptime.ts +37 -2
  252. package/Utils/TeamMembersByProject.ts +237 -0
  253. package/Utils/Telemetry/SavedViewTimeRange.ts +114 -0
  254. package/Utils/Telemetry/TelemetryQueryTimeRange.ts +334 -0
  255. package/build/dist/Models/DatabaseModels/AIRun.js +39 -1
  256. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  257. package/build/dist/Models/DatabaseModels/AlertFeed.js +32 -0
  258. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  259. package/build/dist/Models/DatabaseModels/CephCluster.js +16 -1
  260. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  261. package/build/dist/Models/DatabaseModels/CodeRepository.js +14 -6
  262. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  263. package/build/dist/Models/DatabaseModels/Dashboard.js +29 -0
  264. package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
  265. package/build/dist/Models/DatabaseModels/DockerHost.js +16 -1
  266. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  267. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +16 -1
  268. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
  269. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +16 -1
  270. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
  271. package/build/dist/Models/DatabaseModels/Incident.js +2 -0
  272. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  273. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
  274. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
  275. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
  276. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  277. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  278. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  279. package/build/dist/Models/DatabaseModels/IncidentFeed.js +32 -0
  280. package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
  281. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
  282. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  283. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  284. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  285. package/build/dist/Models/DatabaseModels/IoTFleet.js +16 -1
  286. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
  287. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +16 -1
  288. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  289. package/build/dist/Models/DatabaseModels/LogSavedView.js +33 -0
  290. package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
  291. package/build/dist/Models/DatabaseModels/NetworkDevice.js +16 -1
  292. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  293. package/build/dist/Models/DatabaseModels/NetworkInterface.js +16 -1
  294. package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
  295. package/build/dist/Models/DatabaseModels/Project.js +257 -13
  296. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  297. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +16 -1
  298. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  299. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
  300. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  301. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
  302. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  303. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  304. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  305. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +4 -4
  306. package/build/dist/Models/DatabaseModels/Service.js +28 -1
  307. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/StatusPage.js +29 -0
  309. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
  311. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +32 -0
  313. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/User.js +32 -0
  315. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  316. package/build/dist/Server/API/AIAgentDataAPI.js +49 -48
  317. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  318. package/build/dist/Server/API/AIInvestigationAPI.js +111 -11
  319. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  320. package/build/dist/Server/API/DashboardAPI.js +312 -15
  321. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  322. package/build/dist/Server/API/GitHubAPI.js +94 -167
  323. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  324. package/build/dist/Server/API/StatusPageAPI.js +29 -11
  325. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  326. package/build/dist/Server/API/UserAPI.js +187 -2
  327. package/build/dist/Server/API/UserAPI.js.map +1 -1
  328. package/build/dist/Server/EnvironmentConfig.js +21 -3
  329. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  330. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +12 -1
  331. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  332. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +1 -1
  333. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
  334. package/build/dist/Server/Infrastructure/GlobalCache.js +29 -0
  335. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  336. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js +14 -0
  337. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js.map +1 -0
  338. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js +59 -0
  339. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js.map +1 -0
  340. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js +22 -0
  341. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js.map +1 -0
  342. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js +93 -0
  343. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js.map +1 -0
  344. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js +36 -0
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js.map +1 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js +18 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js.map +1 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js +101 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js.map +1 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js +66 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js.map +1 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js +19 -0
  353. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js.map +1 -0
  354. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js +19 -0
  355. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js.map +1 -0
  356. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
  357. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  358. package/build/dist/Server/Services/AIRunService.js +58 -12
  359. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  360. package/build/dist/Server/Services/AIService.js +74 -21
  361. package/build/dist/Server/Services/AIService.js.map +1 -1
  362. package/build/dist/Server/Services/AlertFeedService.js +3 -0
  363. package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
  364. package/build/dist/Server/Services/AnalyticsDatabaseService.js +86 -2
  365. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  366. package/build/dist/Server/Services/CodeRepositoryService.js +90 -2
  367. package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
  368. package/build/dist/Server/Services/DatabaseService.js +180 -3
  369. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  370. package/build/dist/Server/Services/IncidentFeedService.js +3 -0
  371. package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
  372. package/build/dist/Server/Services/LlmLogService.js +22 -1
  373. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  374. package/build/dist/Server/Services/OpenTelemetryIngestService.js +155 -25
  375. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  376. package/build/dist/Server/Services/UserService.js +165 -0
  377. package/build/dist/Server/Services/UserService.js.map +1 -1
  378. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
  379. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  380. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +4 -0
  381. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
  382. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +8 -5
  383. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  384. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +63 -24
  385. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  386. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +2 -0
  387. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  388. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +2 -0
  389. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  390. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +156 -28
  391. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  392. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +21 -19
  393. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  394. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +128 -49
  395. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
  396. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +170 -31
  397. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
  398. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +21 -19
  399. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  400. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +33 -9
  401. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
  402. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +9 -5
  403. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
  404. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +121 -41
  405. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  406. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js +46 -0
  407. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js.map +1 -0
  408. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js +61 -14
  409. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -1
  410. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +79 -1
  411. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
  412. package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js +31 -1
  413. package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js.map +1 -1
  414. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +21 -0
  415. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
  416. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -0
  417. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  418. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +126 -4
  419. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  420. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js +136 -0
  421. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js.map +1 -0
  422. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +20 -3
  423. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  424. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +43 -0
  425. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
  426. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  427. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  428. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
  429. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  430. package/build/dist/Server/Utils/PasswordHash.js +258 -0
  431. package/build/dist/Server/Utils/PasswordHash.js.map +1 -0
  432. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js +18 -0
  433. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js.map +1 -0
  434. package/build/dist/Types/AI/CodeFixTaskContext.js +23 -3
  435. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
  436. package/build/dist/Types/AI/CodeFixTaskType.js +3 -3
  437. package/build/dist/Types/Database/ColumnLength.js +9 -1
  438. package/build/dist/Types/Database/ColumnLength.js.map +1 -1
  439. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  440. package/build/dist/Types/Database/UnsynchronizedIndex.js +46 -0
  441. package/build/dist/Types/Database/UnsynchronizedIndex.js.map +1 -0
  442. package/build/dist/Types/HashedString.js +96 -5
  443. package/build/dist/Types/HashedString.js.map +1 -1
  444. package/build/dist/Types/Monitor/CriteriaFilter.js +4 -0
  445. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  446. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js +24 -0
  447. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js.map +1 -0
  448. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +24 -7
  449. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  450. package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
  451. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  452. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  453. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  454. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +15 -0
  455. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
  456. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js +2 -0
  457. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js.map +1 -0
  458. package/build/dist/Types/Permission.js +23 -155
  459. package/build/dist/Types/Permission.js.map +1 -1
  460. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +2 -5
  461. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  462. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +51 -10
  463. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  464. package/build/dist/UI/Components/ErrorBoundary.js +67 -8
  465. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  466. package/build/dist/UI/Components/Feed/FeedItem.js +2 -2
  467. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  468. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +0 -12
  469. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  470. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  471. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  472. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +12 -2
  473. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  474. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +193 -65
  475. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  476. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +1 -1
  477. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  478. package/build/dist/UI/Components/Navbar/NavBar.js +3 -1
  479. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  480. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +19 -7
  481. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  482. package/build/dist/UI/Utils/DownloadFile.js +15 -8
  483. package/build/dist/UI/Utils/DownloadFile.js.map +1 -1
  484. package/build/dist/UI/Utils/ErrorSupportBundle.js +476 -0
  485. package/build/dist/UI/Utils/ErrorSupportBundle.js.map +1 -0
  486. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -8
  487. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  488. package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js +156 -0
  489. package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js.map +1 -0
  490. package/build/dist/UI/Utils/Project.js +3 -0
  491. package/build/dist/UI/Utils/Project.js.map +1 -1
  492. package/build/dist/UI/Utils/StatusPage.js +4 -4
  493. package/build/dist/UI/Utils/StatusPage.js.map +1 -1
  494. package/build/dist/UI/Utils/UseDashboardGridDnd.js +551 -0
  495. package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -0
  496. package/build/dist/Utils/Dashboard/DashboardViewConfig.js +42 -26
  497. package/build/dist/Utils/Dashboard/DashboardViewConfig.js.map +1 -1
  498. package/build/dist/Utils/Dashboard/GridLayout.js +338 -0
  499. package/build/dist/Utils/Dashboard/GridLayout.js.map +1 -0
  500. package/build/dist/Utils/Metrics/RecordingRuleExpression.js +19 -17
  501. package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -1
  502. package/build/dist/Utils/Monitor/MonitorMetricType.js +38 -6
  503. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  504. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +46 -0
  505. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -1
  506. package/build/dist/Utils/StatusPage/GroupTree.js +79 -34
  507. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -1
  508. package/build/dist/Utils/StatusPage/ResourceUptime.js +22 -1
  509. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  510. package/build/dist/Utils/TeamMembersByProject.js +145 -0
  511. package/build/dist/Utils/TeamMembersByProject.js.map +1 -0
  512. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js +79 -0
  513. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js.map +1 -0
  514. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js +236 -0
  515. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js.map +1 -0
  516. package/package.json +1 -1
@@ -4,20 +4,28 @@ import FixFromIncidentTaskTrigger, {
4
4
  import SubjectCodeFixRun from "../../../../Server/Utils/AI/SRE/SubjectCodeFixRun";
5
5
  import FixRunBudget from "../../../../Server/Utils/AI/CodeFix/FixRunBudget";
6
6
  import ProjectService from "../../../../Server/Services/ProjectService";
7
+ import AIRunService from "../../../../Server/Services/AIRunService";
8
+ import Semaphore from "../../../../Server/Infrastructure/Semaphore";
9
+ import {
10
+ getInvestigationSubjectLockKey,
11
+ INVESTIGATION_SUBJECT_LOCK_NAMESPACE,
12
+ } from "../../../../Server/Utils/AI/SRE/InvestigationSubjectLock";
7
13
  import Project from "../../../../Models/DatabaseModels/Project";
8
14
  import AIRun from "../../../../Models/DatabaseModels/AIRun";
9
15
  import CodeFixTaskType from "../../../../Types/AI/CodeFixTaskType";
16
+ import AIRunStatus from "../../../../Types/AI/AIRunStatus";
17
+ import AIRunCodeFixRecommendation from "../../../../Types/AI/AIRunCodeFixRecommendation";
10
18
  import ObjectID from "../../../../Types/ObjectID";
11
19
  import { describe, expect, test, afterEach, beforeEach } from "@jest/globals";
12
20
 
13
21
  /*
14
- * The AUTOMATIC form of the FixFromIncident trigger: a CONFIDENT
22
+ * The AUTOMATIC form of the FixFromIncident trigger: a durably Recommended
15
23
  * investigation (per the structured G6 signal) enqueues a fix-PR CodeFix
16
24
  * run with no human click — but ONLY for projects that explicitly opted in
17
- * (Project.enableAutomaticCodeFixes, default FALSE — G11 posture), only
25
+ * for the investigation's incident or alert lane (both default FALSE — G11 posture), only
18
26
  * when a GitHub-App repo exists to open the PR against, at most one
19
27
  * non-terminal run per subject, and inside the daily fix-run budget. It
20
- * runs inside the investigation's postAnalysis, so it must NEVER throw,
28
+ * runs as a post-recommendation follow-up, so it must NEVER throw,
21
29
  * and the run stays system-authored (no userId). Unlike its
22
30
  * human-triggered sibling (createFixTaskFromInvestigation, tested in
23
31
  * Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts), every failed
@@ -27,15 +35,22 @@ import { describe, expect, test, afterEach, beforeEach } from "@jest/globals";
27
35
  const projectId: ObjectID = ObjectID.generate();
28
36
  const incidentId: ObjectID = ObjectID.generate();
29
37
  const alertId: ObjectID = ObjectID.generate();
38
+ const investigationRunId: ObjectID = ObjectID.generate();
39
+ const analysisMarkdown: string = "## Frozen automatic investigation report";
40
+ const enqueueSubjectCodeFixRun: typeof SubjectCodeFixRun.enqueueSubjectCodeFixRun =
41
+ SubjectCodeFixRun.enqueueSubjectCodeFixRun.bind(SubjectCodeFixRun);
30
42
 
31
43
  function fakeProject(data?: {
32
44
  enableAi?: boolean;
33
- enableAutomaticCodeFixes?: boolean;
45
+ enableAutomaticIncidentCodeFixes?: boolean;
46
+ enableAutomaticAlertCodeFixes?: boolean;
34
47
  }): Project {
35
48
  return {
36
49
  id: projectId,
37
50
  enableAi: data?.enableAi ?? true,
38
- enableAutomaticCodeFixes: data?.enableAutomaticCodeFixes ?? true,
51
+ enableAutomaticIncidentCodeFixes:
52
+ data?.enableAutomaticIncidentCodeFixes ?? true,
53
+ enableAutomaticAlertCodeFixes: data?.enableAutomaticAlertCodeFixes ?? true,
39
54
  } as unknown as Project;
40
55
  }
41
56
 
@@ -43,11 +58,27 @@ function fakeRun(): AIRun {
43
58
  return { id: ObjectID.generate() } as unknown as AIRun;
44
59
  }
45
60
 
61
+ function persistedRecommendedInvestigation(
62
+ overrides: Partial<AIRun> = {},
63
+ ): AIRun {
64
+ return {
65
+ id: investigationRunId,
66
+ status: AIRunStatus.Completed,
67
+ codeFixRecommendation: AIRunCodeFixRecommendation.Recommended,
68
+ taskContext: {
69
+ sourceInvestigationRunId: investigationRunId.toString(),
70
+ sourceInvestigationAnalysisMarkdown: analysisMarkdown,
71
+ },
72
+ ...overrides,
73
+ } as unknown as AIRun;
74
+ }
75
+
46
76
  describe("FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask", () => {
47
77
  test("does not enqueue when the project is missing", () => {
48
78
  const decision: AutoFixTaskGateDecision =
49
79
  FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
50
80
  project: null,
81
+ incidentId,
51
82
  hasConnectedRepository: true,
52
83
  existingRun: null,
53
84
  });
@@ -60,6 +91,7 @@ describe("FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask", () => {
60
91
  const decision: AutoFixTaskGateDecision =
61
92
  FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
62
93
  project: fakeProject({ enableAi: false }),
94
+ incidentId,
63
95
  hasConnectedRepository: true,
64
96
  existingRun: null,
65
97
  });
@@ -72,12 +104,13 @@ describe("FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask", () => {
72
104
  const project: Project = {
73
105
  id: projectId,
74
106
  enableAi: true,
75
- // enableAutomaticCodeFixes deliberately absent.
107
+ // enableAutomaticIncidentCodeFixes deliberately absent.
76
108
  } as unknown as Project;
77
109
 
78
110
  const decision: AutoFixTaskGateDecision =
79
111
  FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
80
112
  project,
113
+ incidentId,
81
114
  hasConnectedRepository: true,
82
115
  existingRun: null,
83
116
  });
@@ -89,7 +122,8 @@ describe("FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask", () => {
89
122
  test("an explicit false flag never enqueues", () => {
90
123
  const decision: AutoFixTaskGateDecision =
91
124
  FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
92
- project: fakeProject({ enableAutomaticCodeFixes: false }),
125
+ project: fakeProject({ enableAutomaticIncidentCodeFixes: false }),
126
+ incidentId,
93
127
  hasConnectedRepository: true,
94
128
  existingRun: null,
95
129
  });
@@ -98,10 +132,85 @@ describe("FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask", () => {
98
132
  expect(decision.reason).toMatch(/not opted in/);
99
133
  });
100
134
 
135
+ test("incident and alert opt-ins are independent: incident enabled does not enable alerts", () => {
136
+ const project: Project = fakeProject({
137
+ enableAutomaticIncidentCodeFixes: true,
138
+ enableAutomaticAlertCodeFixes: false,
139
+ });
140
+
141
+ expect(
142
+ FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
143
+ project,
144
+ incidentId,
145
+ hasConnectedRepository: true,
146
+ existingRun: null,
147
+ }).enqueue,
148
+ ).toBe(true);
149
+ expect(
150
+ FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
151
+ project,
152
+ alertId,
153
+ hasConnectedRepository: true,
154
+ existingRun: null,
155
+ }).enqueue,
156
+ ).toBe(false);
157
+ });
158
+
159
+ test("incident and alert opt-ins are independent: alert enabled does not enable incidents", () => {
160
+ const project: Project = fakeProject({
161
+ enableAutomaticIncidentCodeFixes: false,
162
+ enableAutomaticAlertCodeFixes: true,
163
+ });
164
+
165
+ expect(
166
+ FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
167
+ project,
168
+ incidentId,
169
+ hasConnectedRepository: true,
170
+ existingRun: null,
171
+ }).enqueue,
172
+ ).toBe(false);
173
+ expect(
174
+ FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
175
+ project,
176
+ alertId,
177
+ hasConnectedRepository: true,
178
+ existingRun: null,
179
+ }).enqueue,
180
+ ).toBe(true);
181
+ });
182
+
183
+ test("a subjectless gate decision is rejected instead of borrowing either opt-in", () => {
184
+ const decision: AutoFixTaskGateDecision =
185
+ FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
186
+ project: fakeProject(),
187
+ hasConnectedRepository: true,
188
+ existingRun: null,
189
+ });
190
+
191
+ expect(decision.enqueue).toBe(false);
192
+ expect(decision.reason).toMatch(/subject/);
193
+ });
194
+
195
+ test("a gate carrying both subject types is rejected instead of borrowing the incident opt-in", () => {
196
+ const decision: AutoFixTaskGateDecision =
197
+ FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
198
+ project: fakeProject(),
199
+ incidentId,
200
+ alertId,
201
+ hasConnectedRepository: true,
202
+ existingRun: null,
203
+ });
204
+
205
+ expect(decision.enqueue).toBe(false);
206
+ expect(decision.reason).toMatch(/exactly one/);
207
+ });
208
+
101
209
  test("does not enqueue without a GitHub-App-connected repository", () => {
102
210
  const decision: AutoFixTaskGateDecision =
103
211
  FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
104
212
  project: fakeProject(),
213
+ incidentId,
105
214
  hasConnectedRepository: false,
106
215
  existingRun: null,
107
216
  });
@@ -114,6 +223,7 @@ describe("FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask", () => {
114
223
  const decision: AutoFixTaskGateDecision =
115
224
  FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
116
225
  project: fakeProject(),
226
+ incidentId,
117
227
  hasConnectedRepository: true,
118
228
  existingRun: fakeRun(),
119
229
  });
@@ -126,6 +236,7 @@ describe("FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask", () => {
126
236
  const decision: AutoFixTaskGateDecision =
127
237
  FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask({
128
238
  project: fakeProject(),
239
+ incidentId,
129
240
  hasConnectedRepository: true,
130
241
  existingRun: null,
131
242
  });
@@ -135,7 +246,7 @@ describe("FixFromIncidentTaskTrigger.shouldAutoEnqueueFixTask", () => {
135
246
  });
136
247
  });
137
248
 
138
- describe("FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation", () => {
249
+ describe("FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation", () => {
139
250
  let getBudgetStatus: jest.SpyInstance;
140
251
  let hasRepository: jest.SpyInstance;
141
252
  let findNonTerminalRun: jest.SpyInstance;
@@ -163,6 +274,12 @@ describe("FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation", ()
163
274
  enqueue = jest
164
275
  .spyOn(SubjectCodeFixRun, "enqueueSubjectCodeFixRun")
165
276
  .mockResolvedValue(fakeRun());
277
+ jest.spyOn(FixRunBudget, "assertWithinBudget").mockResolvedValue();
278
+ jest.spyOn(Semaphore, "lock").mockResolvedValue({} as never);
279
+ jest.spyOn(Semaphore, "release").mockResolvedValue();
280
+ jest
281
+ .spyOn(AIRunService, "findOneBy")
282
+ .mockResolvedValue(persistedRecommendedInvestigation());
166
283
  });
167
284
 
168
285
  afterEach(() => {
@@ -175,8 +292,10 @@ describe("FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation", ()
175
292
  "findOneById",
176
293
  );
177
294
 
178
- await FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation({
295
+ await FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation({
179
296
  projectId,
297
+ investigationRunId,
298
+ analysisMarkdown,
180
299
  });
181
300
 
182
301
  expect(findProject).not.toHaveBeenCalled();
@@ -186,13 +305,68 @@ describe("FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation", ()
186
305
  expect(enqueue).not.toHaveBeenCalled();
187
306
  });
188
307
 
308
+ test("a call carrying both subject types is an immediate no-op", async () => {
309
+ const findProject: jest.SpyInstance = jest.spyOn(
310
+ ProjectService,
311
+ "findOneById",
312
+ );
313
+
314
+ await FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation({
315
+ projectId,
316
+ investigationRunId,
317
+ analysisMarkdown,
318
+ incidentId,
319
+ alertId,
320
+ });
321
+
322
+ expect(findProject).not.toHaveBeenCalled();
323
+ expect(getBudgetStatus).not.toHaveBeenCalled();
324
+ expect(hasRepository).not.toHaveBeenCalled();
325
+ expect(findNonTerminalRun).not.toHaveBeenCalled();
326
+ expect(enqueue).not.toHaveBeenCalled();
327
+ });
328
+
329
+ test.each([
330
+ ["missing source run id", undefined, analysisMarkdown],
331
+ ["blank analysis", investigationRunId, " "],
332
+ ] as Array<[string, ObjectID | undefined, string]>)(
333
+ "%s fails closed before project or gate IO",
334
+ async (
335
+ _label: string,
336
+ sourceRunId: ObjectID | undefined,
337
+ sourceAnalysis: string,
338
+ ) => {
339
+ const findProject: jest.SpyInstance = jest.spyOn(
340
+ ProjectService,
341
+ "findOneById",
342
+ );
343
+
344
+ await FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation({
345
+ projectId,
346
+ investigationRunId: sourceRunId as ObjectID,
347
+ analysisMarkdown: sourceAnalysis,
348
+ incidentId,
349
+ });
350
+
351
+ expect(findProject).not.toHaveBeenCalled();
352
+ expect(getBudgetStatus).not.toHaveBeenCalled();
353
+ expect(hasRepository).not.toHaveBeenCalled();
354
+ expect(findNonTerminalRun).not.toHaveBeenCalled();
355
+ expect(enqueue).not.toHaveBeenCalled();
356
+ },
357
+ );
358
+
189
359
  test("a not-opted-in project (default) skips cheaply: BEFORE the budget, repo and dedupe queries", async () => {
190
360
  jest
191
361
  .spyOn(ProjectService, "findOneById")
192
- .mockResolvedValue(fakeProject({ enableAutomaticCodeFixes: false }));
362
+ .mockResolvedValue(
363
+ fakeProject({ enableAutomaticIncidentCodeFixes: false }),
364
+ );
193
365
 
194
- await FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation({
366
+ await FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation({
195
367
  projectId,
368
+ investigationRunId,
369
+ analysisMarkdown,
196
370
  incidentId,
197
371
  });
198
372
 
@@ -202,6 +376,26 @@ describe("FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation", ()
202
376
  expect(enqueue).not.toHaveBeenCalled();
203
377
  });
204
378
 
379
+ test("the alert opt-in cannot enable an automatic incident code fix", async () => {
380
+ jest.spyOn(ProjectService, "findOneById").mockResolvedValue(
381
+ fakeProject({
382
+ enableAutomaticIncidentCodeFixes: false,
383
+ enableAutomaticAlertCodeFixes: true,
384
+ }),
385
+ );
386
+
387
+ await FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation({
388
+ projectId,
389
+ investigationRunId,
390
+ analysisMarkdown,
391
+ incidentId,
392
+ });
393
+
394
+ expect(getBudgetStatus).not.toHaveBeenCalled();
395
+ expect(hasRepository).not.toHaveBeenCalled();
396
+ expect(enqueue).not.toHaveBeenCalled();
397
+ });
398
+
205
399
  test("over the daily fix-run budget: a quiet SKIP — nothing enqueued, nothing thrown into the investigation", async () => {
206
400
  jest.spyOn(ProjectService, "findOneById").mockResolvedValue(fakeProject());
207
401
  getBudgetStatus.mockResolvedValue({
@@ -212,8 +406,10 @@ describe("FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation", ()
212
406
  });
213
407
 
214
408
  await expect(
215
- FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation({
409
+ FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation({
216
410
  projectId,
411
+ investigationRunId,
412
+ analysisMarkdown,
217
413
  incidentId,
218
414
  }),
219
415
  ).resolves.toBeUndefined();
@@ -221,14 +417,59 @@ describe("FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation", ()
221
417
  // Skipped before the repo/dedupe queries, and no run was enqueued.
222
418
  expect(hasRepository).not.toHaveBeenCalled();
223
419
  expect(enqueue).not.toHaveBeenCalled();
420
+ expect(getBudgetStatus).toHaveBeenCalledWith(projectId, {
421
+ incidentId,
422
+ alertId: undefined,
423
+ });
224
424
  });
225
425
 
426
+ test.each([
427
+ ["a newer investigation", { id: ObjectID.generate() }],
428
+ [
429
+ "a still-Pending source",
430
+ { codeFixRecommendation: AIRunCodeFixRecommendation.Pending },
431
+ ],
432
+ [
433
+ "a mismatched durable snapshot",
434
+ {
435
+ taskContext: {
436
+ sourceInvestigationRunId: investigationRunId.toString(),
437
+ sourceInvestigationAnalysisMarkdown: "different analysis",
438
+ },
439
+ },
440
+ ],
441
+ ] as Array<[string, Partial<AIRun>]>)(
442
+ "%s fails closed before budget, repository, dedupe, and enqueue IO",
443
+ async (_label: string, overrides: Partial<AIRun>) => {
444
+ jest
445
+ .spyOn(ProjectService, "findOneById")
446
+ .mockResolvedValue(fakeProject());
447
+ (AIRunService.findOneBy as unknown as jest.Mock).mockResolvedValue(
448
+ persistedRecommendedInvestigation(overrides),
449
+ );
450
+
451
+ await FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation({
452
+ projectId,
453
+ investigationRunId,
454
+ analysisMarkdown,
455
+ incidentId,
456
+ });
457
+
458
+ expect(getBudgetStatus).not.toHaveBeenCalled();
459
+ expect(hasRepository).not.toHaveBeenCalled();
460
+ expect(findNonTerminalRun).not.toHaveBeenCalled();
461
+ expect(enqueue).not.toHaveBeenCalled();
462
+ },
463
+ );
464
+
226
465
  test("dedupe: a live FixFromIncident run for the same subject blocks the automatic enqueue", async () => {
227
466
  jest.spyOn(ProjectService, "findOneById").mockResolvedValue(fakeProject());
228
467
  findNonTerminalRun.mockResolvedValue(fakeRun());
229
468
 
230
- await FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation({
469
+ await FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation({
231
470
  projectId,
471
+ investigationRunId,
472
+ analysisMarkdown,
232
473
  incidentId,
233
474
  });
234
475
 
@@ -243,11 +484,28 @@ describe("FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation", ()
243
484
  });
244
485
 
245
486
  test("happy path (incident): enqueues a FixFromIncident run for the incident with NO user attribution", async () => {
246
- jest.spyOn(ProjectService, "findOneById").mockResolvedValue(fakeProject());
487
+ const findProject: jest.SpyInstance = jest
488
+ .spyOn(ProjectService, "findOneById")
489
+ .mockResolvedValue(fakeProject());
247
490
 
248
- await FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation({
491
+ await FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation({
249
492
  projectId,
493
+ investigationRunId,
494
+ analysisMarkdown,
495
+ incidentId,
496
+ });
497
+
498
+ expect(findProject).toHaveBeenCalledWith(
499
+ expect.objectContaining({
500
+ select: {
501
+ enableAi: true,
502
+ enableAutomaticIncidentCodeFixes: true,
503
+ },
504
+ }),
505
+ );
506
+ expect(getBudgetStatus).toHaveBeenCalledWith(projectId, {
250
507
  incidentId,
508
+ alertId: undefined,
251
509
  });
252
510
 
253
511
  expect(enqueue).toHaveBeenCalledTimes(1);
@@ -256,6 +514,10 @@ describe("FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation", ()
256
514
  projectId,
257
515
  taskType: CodeFixTaskType.FixFromIncident,
258
516
  incidentId,
517
+ taskContext: {
518
+ sourceInvestigationRunId: investigationRunId.toString(),
519
+ sourceInvestigationAnalysisMarkdown: analysisMarkdown,
520
+ },
259
521
  }),
260
522
  );
261
523
 
@@ -264,10 +526,27 @@ describe("FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation", ()
264
526
  });
265
527
 
266
528
  test("happy path (alert): the enqueue carries the alert subject", async () => {
267
- jest.spyOn(ProjectService, "findOneById").mockResolvedValue(fakeProject());
529
+ const findProject: jest.SpyInstance = jest
530
+ .spyOn(ProjectService, "findOneById")
531
+ .mockResolvedValue(fakeProject());
268
532
 
269
- await FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation({
533
+ await FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation({
270
534
  projectId,
535
+ investigationRunId,
536
+ analysisMarkdown,
537
+ alertId,
538
+ });
539
+
540
+ expect(findProject).toHaveBeenCalledWith(
541
+ expect.objectContaining({
542
+ select: {
543
+ enableAi: true,
544
+ enableAutomaticAlertCodeFixes: true,
545
+ },
546
+ }),
547
+ );
548
+ expect(getBudgetStatus).toHaveBeenCalledWith(projectId, {
549
+ incidentId: undefined,
271
550
  alertId,
272
551
  });
273
552
 
@@ -275,18 +554,62 @@ describe("FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation", ()
275
554
  expect.objectContaining({
276
555
  taskType: CodeFixTaskType.FixFromIncident,
277
556
  alertId,
557
+ taskContext: {
558
+ sourceInvestigationRunId: investigationRunId.toString(),
559
+ sourceInvestigationAnalysisMarkdown: analysisMarkdown,
560
+ },
278
561
  }),
279
562
  );
280
563
  expect(enqueue.mock.calls[0]![0]).not.toHaveProperty("userId");
281
564
  });
282
565
 
283
- test("never throws a failed enqueue must not fail the investigation's postAnalysis", async () => {
566
+ test("a newer Investigation appearing before the locked automatic insert is revalidated and blocks creation", async () => {
567
+ jest.spyOn(ProjectService, "findOneById").mockResolvedValue(fakeProject());
568
+ const newerRunId: ObjectID = ObjectID.generate();
569
+ (AIRunService.findOneBy as unknown as jest.Mock)
570
+ .mockReset()
571
+ .mockResolvedValueOnce(persistedRecommendedInvestigation())
572
+ .mockResolvedValueOnce(
573
+ persistedRecommendedInvestigation({
574
+ id: newerRunId,
575
+ codeFixRecommendation: AIRunCodeFixRecommendation.NotRecommended,
576
+ taskContext: {
577
+ sourceInvestigationRunId: newerRunId.toString(),
578
+ sourceInvestigationAnalysisMarkdown: "newer operational analysis",
579
+ },
580
+ }),
581
+ );
582
+ enqueue.mockImplementation(enqueueSubjectCodeFixRun);
583
+ const create: jest.SpyInstance = jest.spyOn(AIRunService, "create");
584
+
585
+ await expect(
586
+ FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation({
587
+ projectId,
588
+ investigationRunId,
589
+ analysisMarkdown,
590
+ incidentId,
591
+ }),
592
+ ).resolves.toBeUndefined();
593
+
594
+ expect(Semaphore.lock).toHaveBeenCalledWith(
595
+ expect.objectContaining({
596
+ key: getInvestigationSubjectLockKey({ projectId, incidentId }),
597
+ namespace: INVESTIGATION_SUBJECT_LOCK_NAMESPACE,
598
+ }),
599
+ );
600
+ expect(Semaphore.release).toHaveBeenCalledTimes(1);
601
+ expect(create).not.toHaveBeenCalled();
602
+ });
603
+
604
+ test("never throws — a failed enqueue must not fail the completed investigation", async () => {
284
605
  jest.spyOn(ProjectService, "findOneById").mockResolvedValue(fakeProject());
285
606
  enqueue.mockRejectedValue(new Error("database is down"));
286
607
 
287
608
  await expect(
288
- FixFromIncidentTaskTrigger.autoEnqueueFromConfidentInvestigation({
609
+ FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation({
289
610
  projectId,
611
+ investigationRunId,
612
+ analysisMarkdown,
290
613
  incidentId,
291
614
  }),
292
615
  ).resolves.toBeUndefined();