@oneuptime/common 11.5.4 → 11.5.6

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 (539) hide show
  1. package/Models/DatabaseModels/AIAgentTaskPullRequest.ts +56 -45
  2. package/Models/DatabaseModels/AIInsight.ts +748 -0
  3. package/Models/DatabaseModels/AIRun.ts +262 -0
  4. package/Models/DatabaseModels/CodeRepository.ts +42 -0
  5. package/Models/DatabaseModels/GlobalConfig.ts +105 -0
  6. package/Models/DatabaseModels/Index.ts +4 -8
  7. package/Models/DatabaseModels/InstanceHealthLog.ts +277 -0
  8. package/Models/DatabaseModels/LlmLog.ts +33 -0
  9. package/Models/DatabaseModels/Project.ts +123 -6
  10. package/Models/DatabaseModels/Runbook.ts +1 -1
  11. package/Models/DatabaseModels/User.ts +47 -0
  12. package/Server/API/AIAgentDataAPI.ts +802 -140
  13. package/Server/API/AIAgentTaskAPI.ts +132 -69
  14. package/Server/API/AIAgentTaskLogAPI.ts +65 -41
  15. package/Server/API/AIAgentTaskPullRequestAPI.ts +41 -0
  16. package/Server/API/AIInsightAPI.ts +220 -0
  17. package/Server/API/AIInvestigationAPI.ts +363 -1
  18. package/Server/API/CodeFixRunAPI.ts +251 -0
  19. package/Server/API/GitHubAPI.ts +246 -3
  20. package/Server/API/TelemetryExceptionAPI.ts +193 -48
  21. package/Server/EnvironmentConfig.ts +1 -1
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.ts +26 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.ts +73 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.ts +29 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.ts +31 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.ts +51 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.ts +25 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.ts +47 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.ts +53 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.ts +31 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.ts +37 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.ts +25 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.ts +75 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.ts +37 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.ts +203 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.ts +163 -0
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/1784048917994-AddCreatedByUserToUser.ts +23 -0
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +32 -0
  39. package/Server/Infrastructure/Queue.ts +82 -4
  40. package/Server/Infrastructure/Semaphore.ts +62 -1
  41. package/Server/Middleware/MasterAdminAuthorization.ts +37 -0
  42. package/Server/Middleware/ProjectAuthorization.ts +40 -15
  43. package/Server/Services/AIAgentService.ts +32 -0
  44. package/Server/Services/AIAgentTaskPullRequestService.ts +117 -0
  45. package/Server/Services/AIInsightService.ts +174 -0
  46. package/Server/Services/AIRunEventService.ts +63 -0
  47. package/Server/Services/AIRunService.ts +259 -1
  48. package/Server/Services/AIService.ts +249 -7
  49. package/Server/Services/AlertService.ts +4 -4
  50. package/Server/Services/CodeRepositoryService.ts +209 -0
  51. package/Server/Services/GlobalConfigService.ts +148 -0
  52. package/Server/Services/IncidentService.ts +183 -38
  53. package/Server/Services/IncidentStateTimelineService.ts +24 -4
  54. package/Server/Services/Index.ts +4 -4
  55. package/Server/Services/{AIAgentTaskLogService.ts → InstanceHealthLogService.ts} +1 -1
  56. package/Server/Services/LlmLogService.ts +27 -0
  57. package/Server/Services/LlmProviderService.ts +108 -0
  58. package/Server/Services/MetricBaselineService.ts +123 -0
  59. package/Server/Services/MonitorService.ts +15 -0
  60. package/Server/Services/TeamMemberService.ts +2 -0
  61. package/Server/Services/TelemetryExceptionService.ts +323 -116
  62. package/Server/Services/TraceAggregationService.ts +176 -0
  63. package/Server/Services/UserService.ts +10 -0
  64. package/Server/Types/Workflow/ComponentCode.ts +6 -0
  65. package/Server/Types/Workflow/Components/AI/GenerateText.ts +326 -0
  66. package/Server/Types/Workflow/Components/Index.ts +2 -0
  67. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +1 -1
  68. package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +71 -0
  69. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +243 -0
  70. package/Server/Utils/AI/CodeFix/CodeFixRunQueue.ts +131 -0
  71. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +148 -0
  72. package/Server/Utils/AI/CodeFix/OpenPullRequestCap.ts +117 -0
  73. package/Server/Utils/AI/Eval/EvalCorpus.ts +369 -0
  74. package/Server/Utils/AI/Eval/EvalScores.ts +172 -0
  75. package/Server/Utils/AI/Eval/ReplayInvestigation.ts +87 -0
  76. package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +676 -0
  77. package/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.ts → SRE/AIInvestigationEngine.ts} +58 -37
  78. package/Server/Utils/AI/{Sentinel/SentinelMemory.ts → SRE/AIMemory.ts} +3 -3
  79. package/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.ts +50 -20
  80. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +293 -0
  81. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +115 -0
  82. package/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.ts +223 -0
  83. package/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.ts +71 -21
  84. package/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.ts +8 -8
  85. package/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.ts +364 -0
  86. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +317 -0
  87. package/Server/Utils/AI/SRE/Insights/Detectors/Index.ts +27 -0
  88. package/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.ts +221 -0
  89. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +238 -0
  90. package/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.ts +521 -0
  91. package/Server/Utils/AI/SRE/Insights/FixRouting.ts +242 -0
  92. package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +290 -0
  93. package/Server/Utils/AI/SRE/Insights/InsightStore.ts +283 -0
  94. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +242 -0
  95. package/Server/Utils/AI/SRE/Insights/Triage.ts +162 -0
  96. package/Server/Utils/AI/SRE/Insights/Types.ts +49 -0
  97. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +212 -0
  98. package/Server/Utils/AI/SRE/InvestigationGrader.ts +282 -0
  99. package/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.ts +114 -19
  100. package/Server/Utils/AI/{Sentinel → SRE}/README.md +4 -4
  101. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +172 -0
  102. package/Server/Utils/AI/Toolbox/{SentinelActionTools.ts → AIActionTools.ts} +22 -1
  103. package/Server/Utils/AI/Toolbox/Index.ts +2 -2
  104. package/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.ts +526 -0
  105. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +319 -1
  106. package/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.ts +221 -0
  107. package/Server/Utils/CodeRepository/StackTraceRepoResolver.ts +571 -0
  108. package/Server/Utils/Execute.ts +2 -1
  109. package/Server/Utils/LLM/LLMService.ts +160 -30
  110. package/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.ts +152 -0
  111. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +29 -0
  112. package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +16 -6
  113. package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +14 -0
  114. package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +14 -3
  115. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +130 -12
  116. package/Tests/Server/Infrastructure/Queue.test.ts +227 -0
  117. package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +159 -0
  118. package/Tests/Server/Services/AIAgentTaskPullRequestOutcomeStats.test.ts +154 -0
  119. package/Tests/Server/Services/AIInsightService.test.ts +324 -0
  120. package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +401 -0
  121. package/Tests/Server/Services/AIRunHumanVerdict.test.ts +161 -0
  122. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +95 -5
  123. package/Tests/Server/Services/AIServiceProjectAccess.test.ts +259 -0
  124. package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +249 -0
  125. package/Tests/Server/Services/FixPerformanceTaskTrigger.test.ts +274 -0
  126. package/Tests/Server/Services/GlobalConfigService.test.ts +80 -0
  127. package/Tests/Server/Services/IncidentInternalNoteAnnouncement.test.ts +1 -1
  128. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +313 -0
  129. package/Tests/Server/Services/LlmProviderProjectOwned.test.ts +132 -0
  130. package/Tests/Server/Services/TelemetryExceptionAIFixReadiness.test.ts +405 -0
  131. package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +322 -0
  132. package/Tests/Server/Services/TraceServiceLatencyProfile.test.ts +278 -0
  133. package/Tests/Server/Types/Workflow/Components/AIGenerateText.test.ts +722 -0
  134. package/Tests/Server/Utils/AI/{SentinelAlertGating.test.ts → AIAlertGating.test.ts} +19 -19
  135. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +362 -0
  136. package/Tests/Server/Utils/AI/{SentinelInvestigationQueue.test.ts → AIInvestigationQueue.test.ts} +19 -19
  137. package/Tests/Server/Utils/AI/CodeAgentWorkspaceGuard.test.ts +138 -0
  138. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +335 -0
  139. package/Tests/Server/Utils/AI/CodeFixRunQueue.test.ts +134 -0
  140. package/Tests/Server/Utils/AI/EvalCorpus.test.ts +209 -0
  141. package/Tests/Server/Utils/AI/EvalScores.test.ts +343 -0
  142. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +218 -0
  143. package/Tests/Server/Utils/AI/Insights/ErrorLogSpikeDetector.test.ts +437 -0
  144. package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +287 -0
  145. package/Tests/Server/Utils/AI/Insights/InsightDetectorsIndex.test.ts +34 -0
  146. package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +572 -0
  147. package/Tests/Server/Utils/AI/Insights/InsightNeverThrowsHardening.test.ts +344 -0
  148. package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +720 -0
  149. package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +467 -0
  150. package/Tests/Server/Utils/AI/Insights/InsightStoreHardening.test.ts +370 -0
  151. package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +210 -0
  152. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +221 -0
  153. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +328 -0
  154. package/Tests/Server/Utils/AI/Insights/MetricBaselineDrift.test.ts +182 -0
  155. package/Tests/Server/Utils/AI/Insights/MetricDriftDetector.test.ts +280 -0
  156. package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +259 -0
  157. package/Tests/Server/Utils/AI/Insights/TraceLatencyRegressionDetector.test.ts +770 -0
  158. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +343 -0
  159. package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +307 -0
  160. package/Tests/Server/Utils/AI/OpenPullRequestCap.test.ts +170 -0
  161. package/Tests/Server/Utils/AI/SpanTreeAnalyzer.test.ts +559 -0
  162. package/Tests/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.test.ts +158 -0
  163. package/Tests/Server/Utils/GitHubCheckRunsConclusion.test.ts +100 -0
  164. package/Tests/Server/Utils/GitHubPullRequestStateMapping.test.ts +50 -0
  165. package/Tests/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.test.ts +266 -0
  166. package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +553 -0
  167. package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +590 -0
  168. package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageFormatterUnits.test.ts +254 -0
  169. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +821 -0
  170. package/Tests/Server/Utils/ServiceRepoLinkSuggester.test.ts +167 -0
  171. package/Tests/Server/Utils/StackTraceRepoResolver.test.ts +527 -0
  172. package/Tests/Types/AI/AIChatPermissionMode.test.ts +112 -0
  173. package/Tests/Types/AI/CodeFixTaskType.test.ts +152 -0
  174. package/Tests/Types/AI/FixPullRequestCiStatus.test.ts +181 -0
  175. package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +110 -0
  176. package/Tests/Types/Monitor/SqlDatabaseType.test.ts +55 -0
  177. package/Tests/Types/Workflow/AIGenerateTextMetadata.test.ts +180 -0
  178. package/Tests/UI/Components/TableBulkCsvExport.test.tsx +168 -0
  179. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +523 -0
  180. package/Types/AI/AIChatTypes.ts +8 -0
  181. package/Types/AI/AIInsightEvidence.ts +77 -0
  182. package/Types/AI/AIInsightHumanVerdict.ts +15 -0
  183. package/Types/AI/AIInsightSeverity.ts +13 -0
  184. package/Types/AI/AIInsightStatus.ts +38 -0
  185. package/Types/AI/AIInsightType.ts +41 -0
  186. package/Types/AI/AIRunAutoGrade.ts +18 -0
  187. package/Types/AI/AIRunEventType.ts +5 -0
  188. package/Types/AI/AIRunHumanVerdict.ts +17 -0
  189. package/Types/AI/AIRunType.ts +6 -0
  190. package/Types/AI/CodeFixTaskContext.ts +88 -0
  191. package/Types/AI/CodeFixTaskType.ts +132 -0
  192. package/Types/AI/FixPullRequestCiStatus.ts +132 -0
  193. package/Types/BaseDatabase/AggregationIntervalUtil.ts +67 -0
  194. package/Types/Incident/IncidentMetricType.ts +7 -0
  195. package/Types/Monitor/CriteriaFilter.ts +8 -0
  196. package/Types/Monitor/MonitorCriteriaInstance.ts +67 -0
  197. package/Types/Monitor/MonitorStep.ts +38 -0
  198. package/Types/Monitor/MonitorStepSqlMonitor.ts +141 -0
  199. package/Types/Monitor/MonitorType.ts +17 -0
  200. package/Types/Monitor/SqlDatabaseType.ts +49 -0
  201. package/Types/Monitor/SqlMonitor/SqlMonitorResponse.ts +28 -0
  202. package/Types/Permission.ts +11 -95
  203. package/Types/Probe/ProbeMonitorResponse.ts +2 -0
  204. package/Types/Runbook/RunbookStep.ts +26 -2
  205. package/Types/Runbook/RunbookStepType.ts +1 -0
  206. package/Types/Workflow/Component.ts +13 -0
  207. package/Types/Workflow/ComponentID.ts +1 -0
  208. package/Types/Workflow/Components/AI.ts +148 -0
  209. package/Types/Workflow/Components.ts +8 -0
  210. package/UI/Components/AI/GenerateFromAIModal.tsx +1 -1
  211. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +11 -0
  212. package/UI/Components/MoreMenu/MoreMenu.tsx +1 -1
  213. package/UI/Components/Table/Table.tsx +38 -2
  214. package/UI/Utils/TableColumnsToCsv.ts +385 -0
  215. package/Utils/Monitor/MonitorMetricType.ts +1 -0
  216. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +59 -45
  217. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -1
  218. package/build/dist/Models/DatabaseModels/AIInsight.js +795 -0
  219. package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -0
  220. package/build/dist/Models/DatabaseModels/AIRun.js +274 -0
  221. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  222. package/build/dist/Models/DatabaseModels/CodeRepository.js +43 -0
  223. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  224. package/build/dist/Models/DatabaseModels/GlobalConfig.js +110 -0
  225. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  226. package/build/dist/Models/DatabaseModels/Index.js +4 -8
  227. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  228. package/build/dist/Models/DatabaseModels/InstanceHealthLog.js +304 -0
  229. package/build/dist/Models/DatabaseModels/InstanceHealthLog.js.map +1 -0
  230. package/build/dist/Models/DatabaseModels/LlmLog.js +35 -0
  231. package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -1
  232. package/build/dist/Models/DatabaseModels/Project.js +127 -6
  233. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  234. package/build/dist/Models/DatabaseModels/Runbook.js +1 -1
  235. package/build/dist/Models/DatabaseModels/Runbook.js.map +1 -1
  236. package/build/dist/Models/DatabaseModels/User.js +46 -0
  237. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  238. package/build/dist/Server/API/AIAgentDataAPI.js +568 -85
  239. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  240. package/build/dist/Server/API/AIAgentTaskAPI.js +100 -44
  241. package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
  242. package/build/dist/Server/API/AIAgentTaskLogAPI.js +49 -25
  243. package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -1
  244. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js +27 -0
  245. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js.map +1 -1
  246. package/build/dist/Server/API/AIInsightAPI.js +140 -0
  247. package/build/dist/Server/API/AIInsightAPI.js.map +1 -0
  248. package/build/dist/Server/API/AIInvestigationAPI.js +257 -1
  249. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  250. package/build/dist/Server/API/CodeFixRunAPI.js +181 -0
  251. package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -0
  252. package/build/dist/Server/API/GitHubAPI.js +164 -2
  253. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  254. package/build/dist/Server/API/TelemetryExceptionAPI.js +148 -43
  255. package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
  256. package/build/dist/Server/EnvironmentConfig.js +1 -1
  257. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  258. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js +23 -0
  259. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js.map +1 -0
  260. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js +32 -0
  261. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js.map +1 -0
  262. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js +16 -0
  263. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js.map +1 -0
  264. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js +16 -0
  265. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js.map +1 -0
  266. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js +24 -0
  267. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js.map +1 -0
  268. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js +16 -0
  269. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js.map +1 -0
  270. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js +24 -0
  271. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js.map +1 -0
  272. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js +24 -0
  273. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js.map +1 -0
  274. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js +24 -0
  275. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js.map +1 -0
  276. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js +18 -0
  277. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js.map +1 -0
  278. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js +18 -0
  279. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js.map +1 -0
  280. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js +32 -0
  281. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js.map +1 -0
  282. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js +18 -0
  283. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js.map +1 -0
  284. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js +125 -0
  285. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js.map +1 -0
  286. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js +62 -0
  287. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js.map +1 -0
  288. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784048917994-AddCreatedByUserToUser.js +18 -0
  289. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784048917994-AddCreatedByUserToUser.js.map +1 -0
  290. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +32 -0
  291. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  292. package/build/dist/Server/Infrastructure/Queue.js +73 -3
  293. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  294. package/build/dist/Server/Infrastructure/Semaphore.js +44 -1
  295. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  296. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +26 -0
  297. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  298. package/build/dist/Server/Middleware/ProjectAuthorization.js +40 -14
  299. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  300. package/build/dist/Server/Services/AIAgentService.js +29 -0
  301. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  302. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js +78 -0
  303. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js.map +1 -1
  304. package/build/dist/Server/Services/AIInsightService.js +164 -0
  305. package/build/dist/Server/Services/AIInsightService.js.map +1 -0
  306. package/build/dist/Server/Services/AIRunEventService.js +49 -0
  307. package/build/dist/Server/Services/AIRunEventService.js.map +1 -1
  308. package/build/dist/Server/Services/AIRunService.js +221 -0
  309. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  310. package/build/dist/Server/Services/AIService.js +198 -11
  311. package/build/dist/Server/Services/AIService.js.map +1 -1
  312. package/build/dist/Server/Services/AlertService.js +4 -4
  313. package/build/dist/Server/Services/AlertService.js.map +1 -1
  314. package/build/dist/Server/Services/CodeRepositoryService.js +180 -0
  315. package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
  316. package/build/dist/Server/Services/GlobalConfigService.js +84 -0
  317. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  318. package/build/dist/Server/Services/IncidentService.js +149 -37
  319. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  320. package/build/dist/Server/Services/IncidentStateTimelineService.js +24 -4
  321. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  322. package/build/dist/Server/Services/Index.js +4 -4
  323. package/build/dist/Server/Services/Index.js.map +1 -1
  324. package/build/dist/Server/Services/{AIAgentTaskLogService.js → InstanceHealthLogService.js} +2 -2
  325. package/build/dist/Server/Services/InstanceHealthLogService.js.map +1 -0
  326. package/build/dist/Server/Services/LlmLogService.js +23 -0
  327. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  328. package/build/dist/Server/Services/LlmProviderService.js +96 -0
  329. package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
  330. package/build/dist/Server/Services/MetricBaselineService.js +65 -0
  331. package/build/dist/Server/Services/MetricBaselineService.js.map +1 -1
  332. package/build/dist/Server/Services/MonitorService.js +9 -1
  333. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  334. package/build/dist/Server/Services/TeamMemberService.js +2 -0
  335. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  336. package/build/dist/Server/Services/TelemetryExceptionService.js +243 -82
  337. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  338. package/build/dist/Server/Services/TraceAggregationService.js +124 -0
  339. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  340. package/build/dist/Server/Services/UserService.js +8 -0
  341. package/build/dist/Server/Services/UserService.js.map +1 -1
  342. package/build/dist/Server/Types/Workflow/ComponentCode.js.map +1 -1
  343. package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js +240 -0
  344. package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js.map +1 -0
  345. package/build/dist/Server/Types/Workflow/Components/Index.js +2 -0
  346. package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
  347. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +48 -0
  348. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -0
  349. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +174 -0
  350. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -0
  351. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js +126 -0
  352. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js.map +1 -0
  353. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +131 -0
  354. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -0
  355. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js +99 -0
  356. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js.map +1 -0
  357. package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js +245 -0
  358. package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js.map +1 -0
  359. package/build/dist/Server/Utils/AI/Eval/EvalScores.js +83 -0
  360. package/build/dist/Server/Utils/AI/Eval/EvalScores.js.map +1 -0
  361. package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js +12 -0
  362. package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js.map +1 -0
  363. package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +439 -0
  364. package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -0
  365. package/build/dist/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.js → SRE/AIInvestigationEngine.js} +47 -31
  366. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -0
  367. package/build/dist/Server/Utils/AI/{Sentinel/SentinelMemory.js → SRE/AIMemory.js} +5 -5
  368. package/build/dist/Server/Utils/AI/SRE/AIMemory.js.map +1 -0
  369. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.js +42 -19
  370. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -0
  371. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +226 -0
  372. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -0
  373. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +100 -0
  374. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -0
  375. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js +174 -0
  376. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js.map +1 -0
  377. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.js +60 -22
  378. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -0
  379. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.js +9 -9
  380. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -0
  381. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js +268 -0
  382. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js.map +1 -0
  383. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +226 -0
  384. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -0
  385. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js +26 -0
  386. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js.map +1 -0
  387. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js +159 -0
  388. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js.map +1 -0
  389. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +177 -0
  390. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -0
  391. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js +384 -0
  392. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js.map +1 -0
  393. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js +180 -0
  394. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -0
  395. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +269 -0
  396. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js.map +1 -0
  397. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +231 -0
  398. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -0
  399. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +206 -0
  400. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -0
  401. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js +121 -0
  402. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js.map +1 -0
  403. package/build/dist/Server/Utils/AI/SRE/Insights/Types.js +2 -0
  404. package/build/dist/Server/Utils/AI/SRE/Insights/Types.js.map +1 -0
  405. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +148 -0
  406. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -0
  407. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +231 -0
  408. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -0
  409. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.js +102 -23
  410. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -0
  411. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +167 -0
  412. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -0
  413. package/build/dist/Server/Utils/AI/Toolbox/{SentinelActionTools.js → AIActionTools.js} +18 -2
  414. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -0
  415. package/build/dist/Server/Utils/AI/Toolbox/Index.js +2 -2
  416. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  417. package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js +301 -0
  418. package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js.map +1 -0
  419. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +240 -2
  420. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  421. package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js +127 -0
  422. package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js.map +1 -0
  423. package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js +336 -0
  424. package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js.map +1 -0
  425. package/build/dist/Server/Utils/Execute.js.map +1 -1
  426. package/build/dist/Server/Utils/LLM/LLMService.js +125 -25
  427. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  428. package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js +120 -0
  429. package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js.map +1 -0
  430. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -0
  431. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  432. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +15 -7
  433. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
  434. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +12 -1
  435. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
  436. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +8 -3
  437. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
  438. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +96 -12
  439. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  440. package/build/dist/Types/AI/AIInsightEvidence.js +2 -0
  441. package/build/dist/Types/AI/AIInsightEvidence.js.map +1 -0
  442. package/build/dist/Types/AI/AIInsightHumanVerdict.js +16 -0
  443. package/build/dist/Types/AI/AIInsightHumanVerdict.js.map +1 -0
  444. package/build/dist/Types/AI/AIInsightSeverity.js +14 -0
  445. package/build/dist/Types/AI/AIInsightSeverity.js.map +1 -0
  446. package/build/dist/Types/AI/AIInsightStatus.js +36 -0
  447. package/build/dist/Types/AI/AIInsightStatus.js.map +1 -0
  448. package/build/dist/Types/AI/AIInsightType.js +42 -0
  449. package/build/dist/Types/AI/AIInsightType.js.map +1 -0
  450. package/build/dist/Types/AI/AIRunAutoGrade.js +19 -0
  451. package/build/dist/Types/AI/AIRunAutoGrade.js.map +1 -0
  452. package/build/dist/Types/AI/AIRunEventType.js +5 -0
  453. package/build/dist/Types/AI/AIRunEventType.js.map +1 -1
  454. package/build/dist/Types/AI/AIRunHumanVerdict.js +18 -0
  455. package/build/dist/Types/AI/AIRunHumanVerdict.js.map +1 -0
  456. package/build/dist/Types/AI/AIRunType.js +6 -0
  457. package/build/dist/Types/AI/AIRunType.js.map +1 -1
  458. package/build/dist/Types/AI/CodeFixTaskContext.js +29 -0
  459. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -0
  460. package/build/dist/Types/AI/CodeFixTaskType.js +122 -0
  461. package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -0
  462. package/build/dist/Types/AI/FixPullRequestCiStatus.js +102 -0
  463. package/build/dist/Types/AI/FixPullRequestCiStatus.js.map +1 -0
  464. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +55 -0
  465. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
  466. package/build/dist/Types/Incident/IncidentMetricType.js +7 -0
  467. package/build/dist/Types/Incident/IncidentMetricType.js.map +1 -1
  468. package/build/dist/Types/Monitor/CriteriaFilter.js +7 -0
  469. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  470. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +62 -0
  471. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  472. package/build/dist/Types/Monitor/MonitorStep.js +28 -0
  473. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  474. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +93 -0
  475. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -0
  476. package/build/dist/Types/Monitor/MonitorType.js +15 -0
  477. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  478. package/build/dist/Types/Monitor/SqlDatabaseType.js +47 -0
  479. package/build/dist/Types/Monitor/SqlDatabaseType.js.map +1 -0
  480. package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js +2 -0
  481. package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js.map +1 -0
  482. package/build/dist/Types/Permission.js +10 -84
  483. package/build/dist/Types/Permission.js.map +1 -1
  484. package/build/dist/Types/Runbook/RunbookStepType.js +1 -0
  485. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  486. package/build/dist/Types/Workflow/ComponentID.js +1 -0
  487. package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
  488. package/build/dist/Types/Workflow/Components/AI.js +135 -0
  489. package/build/dist/Types/Workflow/Components/AI.js.map +1 -0
  490. package/build/dist/Types/Workflow/Components.js +7 -0
  491. package/build/dist/Types/Workflow/Components.js.map +1 -1
  492. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -1
  493. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
  494. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +9 -0
  495. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  496. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +1 -1
  497. package/build/dist/UI/Components/Table/Table.js +28 -2
  498. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  499. package/build/dist/UI/Utils/TableColumnsToCsv.js +291 -0
  500. package/build/dist/UI/Utils/TableColumnsToCsv.js.map +1 -0
  501. package/build/dist/Utils/Monitor/MonitorMetricType.js +1 -0
  502. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  503. package/package.json +1 -1
  504. package/Models/DatabaseModels/AIAgentTask.ts +0 -660
  505. package/Models/DatabaseModels/AIAgentTaskLog.ts +0 -426
  506. package/Models/DatabaseModels/AIAgentTaskTelemetryException.ts +0 -399
  507. package/Models/DatabaseModels/ServiceCodeRepository.ts +0 -647
  508. package/Server/Services/AIAgentTaskService.ts +0 -240
  509. package/Server/Services/AIAgentTaskTelemetryExceptionService.ts +0 -39
  510. package/Server/Services/ServiceCodeRepositoryService.ts +0 -55
  511. package/Tests/Server/Services/AIAgentTaskServiceClaim.test.ts +0 -146
  512. package/Types/AI/AIAgentTaskMetadata.ts +0 -25
  513. package/Types/AI/AIAgentTaskType.ts +0 -40
  514. package/build/dist/Models/DatabaseModels/AIAgentTask.js +0 -691
  515. package/build/dist/Models/DatabaseModels/AIAgentTask.js.map +0 -1
  516. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js +0 -447
  517. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js.map +0 -1
  518. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js +0 -415
  519. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js.map +0 -1
  520. package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js +0 -665
  521. package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js.map +0 -1
  522. package/build/dist/Server/Services/AIAgentTaskLogService.js.map +0 -1
  523. package/build/dist/Server/Services/AIAgentTaskService.js +0 -217
  524. package/build/dist/Server/Services/AIAgentTaskService.js.map +0 -1
  525. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js +0 -36
  526. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js.map +0 -1
  527. package/build/dist/Server/Services/ServiceCodeRepositoryService.js +0 -54
  528. package/build/dist/Server/Services/ServiceCodeRepositoryService.js.map +0 -1
  529. package/build/dist/Server/Utils/AI/Sentinel/AlertInvestigationRunner.js.map +0 -1
  530. package/build/dist/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.js.map +0 -1
  531. package/build/dist/Server/Utils/AI/Sentinel/IncidentPostmortemRunner.js.map +0 -1
  532. package/build/dist/Server/Utils/AI/Sentinel/InvestigationQueue.js.map +0 -1
  533. package/build/dist/Server/Utils/AI/Sentinel/SentinelInvestigationEngine.js.map +0 -1
  534. package/build/dist/Server/Utils/AI/Sentinel/SentinelMemory.js.map +0 -1
  535. package/build/dist/Server/Utils/AI/Toolbox/SentinelActionTools.js.map +0 -1
  536. package/build/dist/Types/AI/AIAgentTaskMetadata.js +0 -6
  537. package/build/dist/Types/AI/AIAgentTaskMetadata.js.map +0 -1
  538. package/build/dist/Types/AI/AIAgentTaskType.js +0 -29
  539. package/build/dist/Types/AI/AIAgentTaskType.js.map +0 -1
@@ -44,6 +44,20 @@ export interface BandPoint {
44
44
  expectedLow: number;
45
45
  }
46
46
 
47
+ /**
48
+ * One (metric, entity) cell's finalized mean/sample-count for one of the
49
+ * two week-over-week drift windows. The AI MetricDrift detector
50
+ * joins the "recent" and "prior" rows in JS (the join stays app-side so
51
+ * the drift decision is a pure, unit-testable function).
52
+ */
53
+ export interface MetricDriftWindowRow {
54
+ name: string;
55
+ primaryEntityId: string;
56
+ mean: number;
57
+ sampleCount: number;
58
+ window: "recent" | "prior";
59
+ }
60
+
47
61
  /**
48
62
  * Read-side service for the `MetricBaselineHourly` MV target table.
49
63
  *
@@ -96,6 +110,14 @@ export class MetricBaselineService extends AnalyticsDatabaseService<MetricBaseli
96
110
  public static readonly WINDOW_DAYS_OPTIONS: ReadonlyArray<number> = [
97
111
  14, 28, 60, 90,
98
112
  ];
113
+ /**
114
+ * Hard cap on rows returned per drift window. Params travel in the
115
+ * ClickHouse HTTP URI and the detector joins both windows in JS, so an
116
+ * unbounded GROUP BY over a high-cardinality tenant would be both a
117
+ * memory and a transfer problem. Ranked by sampleCount so the busiest
118
+ * (most statistically trustworthy) cells always make the cut.
119
+ */
120
+ public static readonly DRIFT_MAX_ROWS_PER_WINDOW: number = 500;
99
121
 
100
122
  /**
101
123
  * Fetch the rolling-window baseline for one (metric, [entity],
@@ -285,6 +307,107 @@ export class MetricBaselineService extends AnalyticsDatabaseService<MetricBaseli
285
307
  return { totalSamples, oldestDay };
286
308
  }
287
309
 
310
+ /**
311
+ * Week-over-week drift feed for the AI MetricDrift detector: the
312
+ * finalized mean + sample count per (metric name, entity) cell for two
313
+ * adjacent 7-day windows — "recent" (last 7 days including today) and
314
+ * "prior" (the 7 days before that). Two GROUP BY finalization queries
315
+ * over the MetricBaselineHourly states (same *Merge idiom as
316
+ * getBaseline); the recent/prior JOIN deliberately happens in the
317
+ * caller's pure decision function, not in SQL, so it is unit-testable.
318
+ * Each window is capped at `limitPerWindow` rows (≤
319
+ * DRIFT_MAX_ROWS_PER_WINDOW) ranked by sampleCount descending.
320
+ */
321
+ public async getWeekOverWeekDrift(data: {
322
+ projectId: ObjectID;
323
+ limitPerWindow: number;
324
+ }): Promise<Array<MetricDriftWindowRow>> {
325
+ const projectIdStr: string = this.escapeString(data.projectId.toString());
326
+ const limit: number = Math.max(
327
+ 1,
328
+ Math.min(
329
+ Math.floor(data.limitPerWindow),
330
+ MetricBaselineService.DRIFT_MAX_ROWS_PER_WINDOW,
331
+ ),
332
+ );
333
+
334
+ const windows: Array<{ window: "recent" | "prior"; dayFilter: string }> = [
335
+ {
336
+ window: "recent",
337
+ dayFilter: "day >= today() - INTERVAL 7 DAY",
338
+ },
339
+ {
340
+ window: "prior",
341
+ dayFilter:
342
+ "day BETWEEN today() - INTERVAL 14 DAY AND today() - INTERVAL 8 DAY",
343
+ },
344
+ ];
345
+
346
+ const out: Array<MetricDriftWindowRow> = [];
347
+
348
+ for (const windowSpec of windows) {
349
+ const sql: string = `
350
+ SELECT
351
+ name,
352
+ primaryEntityId,
353
+ avgMerge(meanState) AS mean,
354
+ countMerge(sampleCountState) AS sampleCount
355
+ FROM MetricBaselineHourly
356
+ WHERE projectId = '${projectIdStr}'
357
+ AND ${windowSpec.dayFilter}
358
+ GROUP BY name, primaryEntityId
359
+ ORDER BY sampleCount DESC
360
+ LIMIT ${limit}
361
+ `;
362
+
363
+ const resultSet: {
364
+ json: () => Promise<{
365
+ data: Array<{
366
+ name: string;
367
+ primaryEntityId: string;
368
+ mean: number | string;
369
+ sampleCount: number | string;
370
+ }>;
371
+ }>;
372
+ } = (await this.executeQuery(sql)) as unknown as {
373
+ json: () => Promise<{
374
+ data: Array<{
375
+ name: string;
376
+ primaryEntityId: string;
377
+ mean: number | string;
378
+ sampleCount: number | string;
379
+ }>;
380
+ }>;
381
+ };
382
+
383
+ const parsed: {
384
+ data: Array<{
385
+ name: string;
386
+ primaryEntityId: string;
387
+ mean: number | string;
388
+ sampleCount: number | string;
389
+ }>;
390
+ } = await resultSet.json();
391
+
392
+ for (const row of parsed.data) {
393
+ out.push({
394
+ name: String(row.name || ""),
395
+ primaryEntityId: String(row.primaryEntityId || ""),
396
+ mean: this.toNumber(row.mean),
397
+ sampleCount: this.toNumber(row.sampleCount),
398
+ window: windowSpec.window,
399
+ });
400
+ }
401
+ }
402
+
403
+ logger.debug("MetricBaselineService.getWeekOverWeekDrift", {
404
+ projectId: projectIdStr,
405
+ rowCount: out.length,
406
+ } as LogAttributes);
407
+
408
+ return out;
409
+ }
410
+
288
411
  /**
289
412
  * Build a series of (time, mean, expectedHigh, expectedLow) points
290
413
  * spanning [startTime, endTime] in `intervalMinutes` steps. Each
@@ -148,6 +148,21 @@ export class Service extends DatabaseService<Model> {
148
148
  monitorDestination =
149
149
  firstStep.data.externalStatusPageMonitor.statusPageUrl || "";
150
150
  }
151
+
152
+ // For SQL monitors, show host:port/database (never the credentials).
153
+ if (
154
+ monitorType === MonitorType.SQLQuery &&
155
+ firstStep?.data?.sqlMonitor
156
+ ) {
157
+ const sql: {
158
+ host: string;
159
+ port: number;
160
+ databaseName: string;
161
+ } = firstStep.data.sqlMonitor;
162
+ if (sql.host) {
163
+ monitorDestination = `${sql.host}:${sql.port}/${sql.databaseName}`;
164
+ }
165
+ }
151
166
  }
152
167
  }
153
168
 
@@ -147,6 +147,8 @@ export class TeamMemberService extends DatabaseService<TeamMember> {
147
147
  user = await UserService.createByEmail({
148
148
  email,
149
149
  name: nameValue ? new Name(nameValue) : undefined,
150
+ // Record who invited this brand-new user, so it can be surfaced later.
151
+ createdByUserId: createBy.props.userId,
150
152
  props: {
151
153
  isRoot: true,
152
154
  },
@@ -1,20 +1,32 @@
1
1
  import DatabaseService from "./DatabaseService";
2
2
  import Model from "../../Models/DatabaseModels/TelemetryException";
3
3
  import ServiceType from "../../Types/Telemetry/ServiceType";
4
- import AIAgentTask from "../../Models/DatabaseModels/AIAgentTask";
5
- import AIAgentTaskTelemetryException from "../../Models/DatabaseModels/AIAgentTaskTelemetryException";
4
+ import AIRun from "../../Models/DatabaseModels/AIRun";
6
5
  import ObjectID from "../../Types/ObjectID";
7
6
  import SortOrder from "../../Types/BaseDatabase/SortOrder";
8
7
  import BadDataException from "../../Types/Exception/BadDataException";
9
- import AIAgentTaskType from "../../Types/AI/AIAgentTaskType";
10
- import AIAgentTaskStatus from "../../Types/AI/AIAgentTaskStatus";
11
- import { FixExceptionTaskMetadata } from "../../Types/AI/AIAgentTaskMetadata";
8
+ import AIRunType from "../../Types/AI/AIRunType";
9
+ import AIRunStatus from "../../Types/AI/AIRunStatus";
10
+ import CodeFixTaskType, {
11
+ CodeFixTaskTypeHelper,
12
+ } from "../../Types/AI/CodeFixTaskType";
12
13
  import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
13
- import AIAgentTaskService from "./AIAgentTaskService";
14
- import AIAgentTaskTelemetryExceptionService from "./AIAgentTaskTelemetryExceptionService";
14
+ import AIRunService from "./AIRunService";
15
+ import FixRunBudget from "../Utils/AI/CodeFix/FixRunBudget";
16
+ import AIAgentService from "./AIAgentService";
17
+ import LlmProviderService from "./LlmProviderService";
18
+ import ProjectService from "./ProjectService";
19
+ import ServiceService from "./ServiceService";
20
+ import CodeRepositoryService from "./CodeRepositoryService";
21
+ import { RepoResolution } from "../Utils/CodeRepository/StackTraceRepoResolver";
22
+ import AIAgent from "../../Models/DatabaseModels/AIAgent";
23
+ import LlmProvider from "../../Models/DatabaseModels/LlmProvider";
24
+ import Project from "../../Models/DatabaseModels/Project";
25
+ import TelemetryService from "../../Models/DatabaseModels/Service";
15
26
  import QueryHelper from "../Types/Database/QueryHelper";
16
27
  import ModelPermission from "../Types/Database/Permissions/Index";
17
28
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
29
+ import { IsBillingEnabled } from "../EnvironmentConfig";
18
30
  import Query from "../Types/Database/Query";
19
31
  import Includes from "../../Types/BaseDatabase/Includes";
20
32
  import logger from "../Utils/Logger";
@@ -27,9 +39,29 @@ import logger from "../Utils/Logger";
27
39
  */
28
40
  export const EXCLUDED_FINGERPRINT_LIMIT: number = 5000;
29
41
 
30
- export interface CreateAIAgentTaskForExceptionParams {
42
+ export interface CreateCodeFixRunForExceptionParams {
31
43
  telemetryExceptionId: ObjectID;
32
44
  props: DatabaseCommonInteractionProps;
45
+ // Which task recipe to run. Defaults to FixException.
46
+ taskType?: CodeFixTaskType | undefined;
47
+ }
48
+
49
+ export type AIFixReadinessCheckId =
50
+ | "llmProvider"
51
+ | "repositoryResolved"
52
+ | "agentAvailable";
53
+
54
+ export interface AIFixReadinessCheck {
55
+ id: AIFixReadinessCheckId;
56
+ ok: boolean;
57
+ title: string;
58
+ // Shown to the user when ok is false — says exactly what to do next.
59
+ detail: string;
60
+ }
61
+
62
+ export interface AIFixReadiness {
63
+ ready: boolean;
64
+ checks: Array<AIFixReadinessCheck>;
33
65
  }
34
66
 
35
67
  export interface DashboardServiceSummary {
@@ -58,122 +90,323 @@ export class Service extends DatabaseService<Model> {
58
90
  super(Model);
59
91
  }
60
92
 
93
+ /*
94
+ * Everything "Fix with AI Agent" needs, checked BEFORE a task is created
95
+ * (and consumed by the dashboard to render a setup checklist instead of a
96
+ * button that fails minutes later inside the agent container).
97
+ */
61
98
  @CaptureSpan()
62
- public async createAIAgentTaskForException(
63
- params: CreateAIAgentTaskForExceptionParams,
64
- ): Promise<AIAgentTask> {
65
- const { telemetryExceptionId, props } = params;
66
-
67
- // Get the telemetry exception
99
+ public async getAIFixReadiness(params: {
100
+ telemetryExceptionId: ObjectID;
101
+ props: DatabaseCommonInteractionProps;
102
+ /*
103
+ * Overrides the IsBillingEnabled env flag for the balance check — exists
104
+ * so tests can exercise both modes without mocking the module.
105
+ */
106
+ billingEnabled?: boolean;
107
+ }): Promise<AIFixReadiness> {
68
108
  const telemetryException: Model | null = await this.findOneById({
69
- id: telemetryExceptionId,
109
+ id: params.telemetryExceptionId,
70
110
  select: {
71
111
  _id: true,
72
112
  projectId: true,
73
- message: true,
74
113
  stackTrace: true,
75
114
  primaryEntityId: true,
76
- exceptionType: true,
115
+ primaryEntityType: true,
77
116
  },
78
- props,
117
+ props: params.props,
79
118
  });
80
119
 
81
120
  if (!telemetryException || !telemetryException.projectId) {
82
121
  throw new BadDataException("Telemetry Exception not found");
83
122
  }
84
123
 
85
- // Check if an active AI agent task already exists for this exception
86
- await this.validateNoActiveTaskExists(telemetryExceptionId);
124
+ const projectId: ObjectID = telemetryException.projectId;
87
125
 
88
- // Create the AI Agent Task
89
- const createdTask: AIAgentTask = await this.createFixExceptionTask({
90
- telemetryException,
91
- telemetryExceptionId,
92
- props,
93
- });
126
+ /*
127
+ * 1. An LLM provider the agent may use. Agent completions are
128
+ * server-mediated and metered (B4 Tier 0), so the shared global
129
+ * provider is a valid fallback on cloud too — a project-owned provider
130
+ * simply wins when one exists.
131
+ */
132
+ const llmProvider: LlmProvider | null =
133
+ await LlmProviderService.getLlmProviderForMeteredAgentPath(projectId);
94
134
 
95
- // Link the task to the telemetry exception
96
- await AIAgentTaskTelemetryExceptionService.linkTaskToTelemetryException({
97
- projectId: telemetryException.projectId,
98
- aiAgentTaskId: createdTask.id!,
99
- telemetryExceptionId,
100
- props,
101
- });
135
+ let llmOk: boolean = Boolean(llmProvider);
136
+ let llmDetail: string = llmOk
137
+ ? ""
138
+ : "AI fix tasks need an LLM provider. Add one in Project Settings > AI > LLM Providers. Self-hosted instances can alternatively set the GLOBAL_LLM_PROVIDER_* environment variables to register a global provider for every project.";
139
+
140
+ /*
141
+ * A resolved provider must also be PAYABLE, or the run passes readiness
142
+ * here and dies at its first completion call instead. Mirrors the
143
+ * billing gate in AIService.executeWithLogging: only a COSTED global
144
+ * provider on cloud bills the project's AI balance per call —
145
+ * project-owned and free-global providers consume no balance and must
146
+ * not require one.
147
+ */
148
+ const billingEnabled: boolean = params.billingEnabled ?? IsBillingEnabled;
149
+
150
+ if (
151
+ llmProvider &&
152
+ billingEnabled &&
153
+ (llmProvider.isGlobalLlm || false) &&
154
+ (llmProvider.costPerMillionTokensInUSDCents || 0) > 0
155
+ ) {
156
+ const project: Project | null = await ProjectService.findOneById({
157
+ id: projectId,
158
+ select: { aiCurrentBalanceInUSDCents: true },
159
+ props: { isRoot: true },
160
+ });
161
+
162
+ if (!project || (project.aiCurrentBalanceInUSDCents || 0) <= 0) {
163
+ llmOk = false;
164
+ llmDetail =
165
+ "AI fix tasks would use the OneUptime-hosted LLM provider, which is billed against your AI balance — and the project's balance is empty. Recharge it in Project Settings > AI Credits, or add your own LLM provider in Project Settings > AI > LLM Providers.";
166
+ }
167
+ }
168
+
169
+ const llmCheck: AIFixReadinessCheck = {
170
+ id: "llmProvider",
171
+ ok: llmOk,
172
+ title: "LLM provider",
173
+ detail: llmDetail,
174
+ };
102
175
 
103
- return createdTask;
176
+ /*
177
+ * 2. A repository must RESOLVE for this exception — computed at runtime
178
+ * from the stack trace (path matching over connected repos), falling
179
+ * back to service-name matching and the only-repository rule. No manual
180
+ * mapping table, no Service Catalog prerequisite.
181
+ */
182
+ const service: TelemetryService | null = telemetryException.primaryEntityId
183
+ ? await ServiceService.findOneById({
184
+ id: telemetryException.primaryEntityId,
185
+ select: {
186
+ _id: true,
187
+ name: true,
188
+ },
189
+ props: {
190
+ isRoot: true,
191
+ },
192
+ })
193
+ : null;
194
+
195
+ let repoCheck: AIFixReadinessCheck;
196
+
197
+ try {
198
+ const resolution: RepoResolution | null =
199
+ await CodeRepositoryService.resolveRepositoryForException({
200
+ projectId,
201
+ stackTrace: telemetryException.stackTrace || null,
202
+ serviceName: service?.name || null,
203
+ });
204
+
205
+ repoCheck = {
206
+ id: "repositoryResolved",
207
+ ok: Boolean(resolution),
208
+ title: resolution
209
+ ? `Repository resolved: ${resolution.organizationName}/${resolution.repositoryName}`
210
+ : "Repository resolved",
211
+ detail: resolution
212
+ ? ""
213
+ : "No connected repository could be matched to this exception — its stack-trace files were not found in any connected repository, no repository name matches the service, and the project has more than one repository. Connect the right repository through the GitHub App (installing it imports all its repositories automatically).",
214
+ };
215
+ } catch (err) {
216
+ repoCheck = {
217
+ id: "repositoryResolved",
218
+ ok: false,
219
+ title: "Repository resolved",
220
+ detail: `Could not check the connected repositories: ${
221
+ err instanceof Error ? err.message : "unknown error"
222
+ }`,
223
+ };
224
+ }
225
+
226
+ // 4. An agent must be alive to pick the task up.
227
+ const anyAgent: AIAgent | null =
228
+ await AIAgentService.getAIAgentForProject(projectId);
229
+ const connectedAgent: AIAgent | null = anyAgent
230
+ ? AIAgentService.isAgentAlive(anyAgent)
231
+ ? anyAgent
232
+ : null
233
+ : null;
234
+
235
+ const agentCheck: AIFixReadinessCheck = {
236
+ id: "agentAvailable",
237
+ ok: Boolean(connectedAgent),
238
+ title: "AI agent online",
239
+ detail: connectedAgent
240
+ ? ""
241
+ : anyAgent
242
+ ? `The AI agent "${anyAgent.name || "agent"}" has not reported in — check that its container is running.`
243
+ : "No AI agent is available for this project. Self-hosted: create an agent under Settings > AI > AI Agents and run its container. Cloud: the shared fleet appears here automatically once enabled.",
244
+ };
245
+
246
+ const checks: Array<AIFixReadinessCheck> = [
247
+ llmCheck,
248
+ repoCheck,
249
+ agentCheck,
250
+ ];
251
+
252
+ return {
253
+ ready: checks.every((check: AIFixReadinessCheck) => {
254
+ return check.ok;
255
+ }),
256
+ checks,
257
+ };
104
258
  }
105
259
 
260
+ /*
261
+ * "Fix with AI Agent": record the durable intent as a Queued CodeFix
262
+ * AIRun (the unified run substrate — same enqueue semantics as the
263
+ * investigation queue: attemptCount defaults to 0 and no events are
264
+ * written until a worker claims the run). An external agent container
265
+ * claims it via /ai-agent-task/get-pending-task and dispatches on the
266
+ * run's task recipe (codeFixTaskType).
267
+ */
106
268
  @CaptureSpan()
107
- private async validateNoActiveTaskExists(
108
- telemetryExceptionId: ObjectID,
109
- ): Promise<void> {
110
- const existingTaskLink: AIAgentTaskTelemetryException | null =
111
- await AIAgentTaskTelemetryExceptionService.findOneBy({
112
- query: {
113
- telemetryExceptionId: telemetryExceptionId,
114
- aiAgentTask: {
115
- status: QueryHelper.notIn([
116
- AIAgentTaskStatus.Completed,
117
- AIAgentTaskStatus.Error,
118
- ]),
119
- },
120
- },
121
- select: {
122
- _id: true,
123
- aiAgentTaskId: true,
124
- },
125
- props: {
126
- isRoot: true,
127
- },
128
- });
269
+ public async createCodeFixRunForException(
270
+ params: CreateCodeFixRunForExceptionParams,
271
+ ): Promise<AIRun> {
272
+ const { telemetryExceptionId, props } = params;
273
+
274
+ const taskType: CodeFixTaskType =
275
+ params.taskType || CodeFixTaskType.FixException;
129
276
 
130
- if (existingTaskLink) {
277
+ /*
278
+ * Recipes beyond FixException / WriteRegressionTest are declared in the
279
+ * enum (so workers and the UI can already dispatch on them) but their
280
+ * recipes have not shipped — creating a run for them would queue work no
281
+ * agent can execute.
282
+ */
283
+ if (!CodeFixTaskTypeHelper.isUserTriggerable(taskType)) {
131
284
  throw new BadDataException(
132
- "An AI agent task is already in progress for this exception. Please wait for it to complete before creating a new one.",
285
+ `Task type "${taskType}" is not user-triggerable yet. Supported task types: ${CodeFixTaskTypeHelper.getUserTriggerableTaskTypes().join(
286
+ ", ",
287
+ )}.`,
133
288
  );
134
289
  }
135
- }
136
290
 
137
- @CaptureSpan()
138
- private async createFixExceptionTask(params: {
139
- telemetryException: Model;
140
- telemetryExceptionId: ObjectID;
141
- props: DatabaseCommonInteractionProps;
142
- }): Promise<AIAgentTask> {
143
- const { telemetryException, telemetryExceptionId, props } = params;
144
-
145
- const aiAgentTask: AIAgentTask = new AIAgentTask();
146
- aiAgentTask.projectId = telemetryException.projectId!;
147
- aiAgentTask.taskType = AIAgentTaskType.FixException;
148
- aiAgentTask.status = AIAgentTaskStatus.Scheduled;
149
-
150
- // Set name and description based on exception details
151
- const exceptionType: string =
152
- telemetryException.exceptionType || "Exception";
153
- const exceptionMessage: string =
154
- telemetryException.message || "No message available";
155
-
156
- aiAgentTask.name = `Fix ${exceptionType}: ${exceptionMessage}`;
157
- aiAgentTask.description = `AI Agent task to fix the exception: ${exceptionMessage}`;
158
-
159
- // Build metadata
160
- aiAgentTask.metadata = this.buildFixExceptionMetadata({
161
- telemetryException,
291
+ // Get the telemetry exception (also the caller's access check).
292
+ const telemetryException: Model | null = await this.findOneById({
293
+ id: telemetryExceptionId,
294
+ select: {
295
+ _id: true,
296
+ projectId: true,
297
+ },
298
+ props,
299
+ });
300
+
301
+ if (!telemetryException || !telemetryException.projectId) {
302
+ throw new BadDataException("Telemetry Exception not found");
303
+ }
304
+
305
+ /*
306
+ * G11 guardrail: the per-project daily fix-run budget. Checked before
307
+ * the (more expensive) readiness probes — an over-budget project gets
308
+ * the budget message, not a readiness one.
309
+ */
310
+ await FixRunBudget.assertWithinBudget(telemetryException.projectId);
311
+
312
+ /*
313
+ * Fail early with everything that's missing, instead of creating a run
314
+ * that dies minutes later inside the agent container.
315
+ */
316
+ const readiness: AIFixReadiness = await this.getAIFixReadiness({
162
317
  telemetryExceptionId,
318
+ props,
163
319
  });
164
320
 
165
- const createdTask: AIAgentTask = await AIAgentTaskService.create({
166
- data: aiAgentTask,
321
+ if (!readiness.ready) {
322
+ const missing: string = readiness.checks
323
+ .filter((check: AIFixReadinessCheck) => {
324
+ return !check.ok;
325
+ })
326
+ .map((check: AIFixReadinessCheck) => {
327
+ return check.title;
328
+ })
329
+ .join(", ");
330
+
331
+ throw new BadDataException(
332
+ `Cannot start the AI fix — missing prerequisites: ${missing}.`,
333
+ );
334
+ }
335
+
336
+ /*
337
+ * Duplicate guard is per (exception, taskType): an active FixException
338
+ * run must not block queuing a WriteRegressionTest run and vice versa.
339
+ */
340
+ await this.validateNoActiveCodeFixRunExists(telemetryExceptionId, taskType);
341
+
342
+ const run: AIRun = new AIRun();
343
+ run.projectId = telemetryException.projectId;
344
+ run.runType = AIRunType.CodeFix;
345
+ run.codeFixTaskType = taskType;
346
+ run.status = AIRunStatus.Queued;
347
+ run.triggeredByTelemetryExceptionId = telemetryExceptionId;
348
+
349
+ // Attribution: the user who clicked "Fix with AI Agent".
350
+ if (props.userId) {
351
+ run.userId = props.userId;
352
+ }
353
+
354
+ /*
355
+ * Created as root: AIRun rows are server-written only (empty create
356
+ * ACL); the user's access was already checked by the exception read.
357
+ */
358
+ const createdRun: AIRun = await AIRunService.create({
359
+ data: run,
167
360
  props: {
168
- ...props,
361
+ isRoot: true,
169
362
  },
170
363
  });
171
364
 
172
- if (!createdTask.id) {
173
- throw new BadDataException("Failed to create AI Agent Task");
365
+ if (!createdRun.id) {
366
+ throw new BadDataException("Failed to create the AI fix run");
174
367
  }
175
368
 
176
- return createdTask;
369
+ return createdRun;
370
+ }
371
+
372
+ @CaptureSpan()
373
+ private async validateNoActiveCodeFixRunExists(
374
+ telemetryExceptionId: ObjectID,
375
+ taskType: CodeFixTaskType,
376
+ ): Promise<void> {
377
+ const existingRun: AIRun | null = await AIRunService.findOneBy({
378
+ query: {
379
+ runType: AIRunType.CodeFix,
380
+ triggeredByTelemetryExceptionId: telemetryExceptionId,
381
+ /*
382
+ * A null codeFixTaskType means FixException (rows created before
383
+ * task recipes existed), so the FixException guard must also match
384
+ * legacy null rows.
385
+ */
386
+ codeFixTaskType:
387
+ taskType === CodeFixTaskType.FixException
388
+ ? QueryHelper.equalToOrNull(CodeFixTaskType.FixException)
389
+ : taskType,
390
+ status: QueryHelper.notIn([
391
+ AIRunStatus.Completed,
392
+ AIRunStatus.Error,
393
+ AIRunStatus.Cancelled,
394
+ AIRunStatus.Stale,
395
+ ]),
396
+ },
397
+ select: {
398
+ _id: true,
399
+ },
400
+ props: {
401
+ isRoot: true,
402
+ },
403
+ });
404
+
405
+ if (existingRun) {
406
+ throw new BadDataException(
407
+ `An AI agent task (${taskType}) is already in progress for this exception. Please wait for it to complete before creating a new one.`,
408
+ );
409
+ }
177
410
  }
178
411
 
179
412
  @CaptureSpan()
@@ -467,32 +700,6 @@ export class Service extends DatabaseService<Model> {
467
700
 
468
701
  return summaries;
469
702
  }
470
-
471
- private buildFixExceptionMetadata(params: {
472
- telemetryException: Model;
473
- telemetryExceptionId: ObjectID;
474
- }): FixExceptionTaskMetadata {
475
- const { telemetryException, telemetryExceptionId } = params;
476
-
477
- const metadata: FixExceptionTaskMetadata = {
478
- taskType: AIAgentTaskType.FixException,
479
- exceptionId: telemetryExceptionId.toString(),
480
- };
481
-
482
- if (telemetryException.stackTrace) {
483
- metadata.stackTrace = telemetryException.stackTrace;
484
- }
485
-
486
- if (telemetryException.message) {
487
- metadata.errorMessage = telemetryException.message;
488
- }
489
-
490
- if (telemetryException.primaryEntityId) {
491
- metadata.serviceId = telemetryException.primaryEntityId.toString();
492
- }
493
-
494
- return metadata;
495
- }
496
703
  }
497
704
 
498
705
  export default new Service();