@oneuptime/common 11.5.4 → 11.5.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 (505) 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/Server/API/AIAgentDataAPI.ts +802 -140
  12. package/Server/API/AIAgentTaskAPI.ts +132 -69
  13. package/Server/API/AIAgentTaskLogAPI.ts +65 -41
  14. package/Server/API/AIAgentTaskPullRequestAPI.ts +41 -0
  15. package/Server/API/AIInsightAPI.ts +220 -0
  16. package/Server/API/AIInvestigationAPI.ts +363 -1
  17. package/Server/API/CodeFixRunAPI.ts +251 -0
  18. package/Server/API/GitHubAPI.ts +246 -3
  19. package/Server/API/TelemetryExceptionAPI.ts +193 -48
  20. package/Server/EnvironmentConfig.ts +1 -1
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.ts +26 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.ts +73 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.ts +29 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.ts +31 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.ts +51 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.ts +25 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.ts +47 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.ts +53 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.ts +31 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.ts +37 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.ts +25 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.ts +75 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.ts +37 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.ts +203 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.ts +163 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +30 -0
  37. package/Server/Infrastructure/Queue.ts +82 -4
  38. package/Server/Infrastructure/Semaphore.ts +62 -1
  39. package/Server/Services/AIAgentService.ts +32 -0
  40. package/Server/Services/AIAgentTaskPullRequestService.ts +117 -0
  41. package/Server/Services/AIInsightService.ts +174 -0
  42. package/Server/Services/AIRunEventService.ts +63 -0
  43. package/Server/Services/AIRunService.ts +259 -1
  44. package/Server/Services/AIService.ts +249 -7
  45. package/Server/Services/AlertService.ts +4 -4
  46. package/Server/Services/CodeRepositoryService.ts +209 -0
  47. package/Server/Services/GlobalConfigService.ts +148 -0
  48. package/Server/Services/IncidentService.ts +183 -38
  49. package/Server/Services/IncidentStateTimelineService.ts +24 -4
  50. package/Server/Services/Index.ts +4 -4
  51. package/Server/Services/{AIAgentTaskLogService.ts → InstanceHealthLogService.ts} +1 -1
  52. package/Server/Services/LlmLogService.ts +27 -0
  53. package/Server/Services/LlmProviderService.ts +108 -0
  54. package/Server/Services/MetricBaselineService.ts +123 -0
  55. package/Server/Services/MonitorService.ts +15 -0
  56. package/Server/Services/TelemetryExceptionService.ts +323 -116
  57. package/Server/Services/TraceAggregationService.ts +176 -0
  58. package/Server/Types/Workflow/ComponentCode.ts +6 -0
  59. package/Server/Types/Workflow/Components/AI/GenerateText.ts +326 -0
  60. package/Server/Types/Workflow/Components/Index.ts +2 -0
  61. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +1 -1
  62. package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +71 -0
  63. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +243 -0
  64. package/Server/Utils/AI/CodeFix/CodeFixRunQueue.ts +131 -0
  65. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +148 -0
  66. package/Server/Utils/AI/CodeFix/OpenPullRequestCap.ts +117 -0
  67. package/Server/Utils/AI/Eval/EvalCorpus.ts +369 -0
  68. package/Server/Utils/AI/Eval/EvalScores.ts +172 -0
  69. package/Server/Utils/AI/Eval/ReplayInvestigation.ts +87 -0
  70. package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +676 -0
  71. package/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.ts → SRE/AIInvestigationEngine.ts} +58 -37
  72. package/Server/Utils/AI/{Sentinel/SentinelMemory.ts → SRE/AIMemory.ts} +3 -3
  73. package/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.ts +50 -20
  74. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +293 -0
  75. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +115 -0
  76. package/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.ts +223 -0
  77. package/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.ts +71 -21
  78. package/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.ts +8 -8
  79. package/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.ts +364 -0
  80. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +317 -0
  81. package/Server/Utils/AI/SRE/Insights/Detectors/Index.ts +27 -0
  82. package/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.ts +221 -0
  83. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +238 -0
  84. package/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.ts +521 -0
  85. package/Server/Utils/AI/SRE/Insights/FixRouting.ts +242 -0
  86. package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +290 -0
  87. package/Server/Utils/AI/SRE/Insights/InsightStore.ts +283 -0
  88. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +242 -0
  89. package/Server/Utils/AI/SRE/Insights/Triage.ts +162 -0
  90. package/Server/Utils/AI/SRE/Insights/Types.ts +49 -0
  91. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +212 -0
  92. package/Server/Utils/AI/SRE/InvestigationGrader.ts +282 -0
  93. package/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.ts +114 -19
  94. package/Server/Utils/AI/{Sentinel → SRE}/README.md +4 -4
  95. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +172 -0
  96. package/Server/Utils/AI/Toolbox/{SentinelActionTools.ts → AIActionTools.ts} +22 -1
  97. package/Server/Utils/AI/Toolbox/Index.ts +2 -2
  98. package/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.ts +526 -0
  99. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +319 -1
  100. package/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.ts +221 -0
  101. package/Server/Utils/CodeRepository/StackTraceRepoResolver.ts +571 -0
  102. package/Server/Utils/Execute.ts +2 -1
  103. package/Server/Utils/LLM/LLMService.ts +160 -30
  104. package/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.ts +152 -0
  105. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +29 -0
  106. package/Tests/Server/Infrastructure/Queue.test.ts +227 -0
  107. package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +159 -0
  108. package/Tests/Server/Services/AIAgentTaskPullRequestOutcomeStats.test.ts +154 -0
  109. package/Tests/Server/Services/AIInsightService.test.ts +324 -0
  110. package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +401 -0
  111. package/Tests/Server/Services/AIRunHumanVerdict.test.ts +161 -0
  112. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +95 -5
  113. package/Tests/Server/Services/AIServiceProjectAccess.test.ts +259 -0
  114. package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +249 -0
  115. package/Tests/Server/Services/FixPerformanceTaskTrigger.test.ts +274 -0
  116. package/Tests/Server/Services/GlobalConfigService.test.ts +80 -0
  117. package/Tests/Server/Services/IncidentInternalNoteAnnouncement.test.ts +1 -1
  118. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +313 -0
  119. package/Tests/Server/Services/LlmProviderProjectOwned.test.ts +132 -0
  120. package/Tests/Server/Services/TelemetryExceptionAIFixReadiness.test.ts +405 -0
  121. package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +322 -0
  122. package/Tests/Server/Services/TraceServiceLatencyProfile.test.ts +278 -0
  123. package/Tests/Server/Types/Workflow/Components/AIGenerateText.test.ts +722 -0
  124. package/Tests/Server/Utils/AI/{SentinelAlertGating.test.ts → AIAlertGating.test.ts} +19 -19
  125. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +362 -0
  126. package/Tests/Server/Utils/AI/{SentinelInvestigationQueue.test.ts → AIInvestigationQueue.test.ts} +19 -19
  127. package/Tests/Server/Utils/AI/CodeAgentWorkspaceGuard.test.ts +138 -0
  128. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +335 -0
  129. package/Tests/Server/Utils/AI/CodeFixRunQueue.test.ts +134 -0
  130. package/Tests/Server/Utils/AI/EvalCorpus.test.ts +209 -0
  131. package/Tests/Server/Utils/AI/EvalScores.test.ts +343 -0
  132. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +218 -0
  133. package/Tests/Server/Utils/AI/Insights/ErrorLogSpikeDetector.test.ts +437 -0
  134. package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +287 -0
  135. package/Tests/Server/Utils/AI/Insights/InsightDetectorsIndex.test.ts +34 -0
  136. package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +572 -0
  137. package/Tests/Server/Utils/AI/Insights/InsightNeverThrowsHardening.test.ts +344 -0
  138. package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +720 -0
  139. package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +467 -0
  140. package/Tests/Server/Utils/AI/Insights/InsightStoreHardening.test.ts +370 -0
  141. package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +210 -0
  142. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +221 -0
  143. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +328 -0
  144. package/Tests/Server/Utils/AI/Insights/MetricBaselineDrift.test.ts +182 -0
  145. package/Tests/Server/Utils/AI/Insights/MetricDriftDetector.test.ts +280 -0
  146. package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +259 -0
  147. package/Tests/Server/Utils/AI/Insights/TraceLatencyRegressionDetector.test.ts +770 -0
  148. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +343 -0
  149. package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +307 -0
  150. package/Tests/Server/Utils/AI/OpenPullRequestCap.test.ts +170 -0
  151. package/Tests/Server/Utils/AI/SpanTreeAnalyzer.test.ts +559 -0
  152. package/Tests/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.test.ts +158 -0
  153. package/Tests/Server/Utils/GitHubCheckRunsConclusion.test.ts +100 -0
  154. package/Tests/Server/Utils/GitHubPullRequestStateMapping.test.ts +50 -0
  155. package/Tests/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.test.ts +266 -0
  156. package/Tests/Server/Utils/ServiceRepoLinkSuggester.test.ts +167 -0
  157. package/Tests/Server/Utils/StackTraceRepoResolver.test.ts +527 -0
  158. package/Tests/Types/AI/AIChatPermissionMode.test.ts +112 -0
  159. package/Tests/Types/AI/CodeFixTaskType.test.ts +152 -0
  160. package/Tests/Types/AI/FixPullRequestCiStatus.test.ts +181 -0
  161. package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +110 -0
  162. package/Tests/Types/Monitor/SqlDatabaseType.test.ts +55 -0
  163. package/Tests/Types/Workflow/AIGenerateTextMetadata.test.ts +180 -0
  164. package/Tests/UI/Components/TableBulkCsvExport.test.tsx +168 -0
  165. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +523 -0
  166. package/Types/AI/AIChatTypes.ts +8 -0
  167. package/Types/AI/AIInsightEvidence.ts +77 -0
  168. package/Types/AI/AIInsightHumanVerdict.ts +15 -0
  169. package/Types/AI/AIInsightSeverity.ts +13 -0
  170. package/Types/AI/AIInsightStatus.ts +38 -0
  171. package/Types/AI/AIInsightType.ts +41 -0
  172. package/Types/AI/AIRunAutoGrade.ts +18 -0
  173. package/Types/AI/AIRunEventType.ts +5 -0
  174. package/Types/AI/AIRunHumanVerdict.ts +17 -0
  175. package/Types/AI/AIRunType.ts +6 -0
  176. package/Types/AI/CodeFixTaskContext.ts +88 -0
  177. package/Types/AI/CodeFixTaskType.ts +132 -0
  178. package/Types/AI/FixPullRequestCiStatus.ts +132 -0
  179. package/Types/BaseDatabase/AggregationIntervalUtil.ts +67 -0
  180. package/Types/Incident/IncidentMetricType.ts +7 -0
  181. package/Types/Monitor/CriteriaFilter.ts +8 -0
  182. package/Types/Monitor/MonitorCriteriaInstance.ts +67 -0
  183. package/Types/Monitor/MonitorStep.ts +38 -0
  184. package/Types/Monitor/MonitorStepSqlMonitor.ts +141 -0
  185. package/Types/Monitor/MonitorType.ts +17 -0
  186. package/Types/Monitor/SqlDatabaseType.ts +49 -0
  187. package/Types/Monitor/SqlMonitor/SqlMonitorResponse.ts +28 -0
  188. package/Types/Permission.ts +11 -95
  189. package/Types/Probe/ProbeMonitorResponse.ts +2 -0
  190. package/Types/Runbook/RunbookStep.ts +26 -2
  191. package/Types/Runbook/RunbookStepType.ts +1 -0
  192. package/Types/Workflow/Component.ts +13 -0
  193. package/Types/Workflow/ComponentID.ts +1 -0
  194. package/Types/Workflow/Components/AI.ts +148 -0
  195. package/Types/Workflow/Components.ts +8 -0
  196. package/UI/Components/AI/GenerateFromAIModal.tsx +1 -1
  197. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +11 -0
  198. package/UI/Components/MoreMenu/MoreMenu.tsx +1 -1
  199. package/UI/Components/Table/Table.tsx +38 -2
  200. package/UI/Utils/TableColumnsToCsv.ts +385 -0
  201. package/Utils/Monitor/MonitorMetricType.ts +1 -0
  202. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +59 -45
  203. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/AIInsight.js +795 -0
  205. package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -0
  206. package/build/dist/Models/DatabaseModels/AIRun.js +274 -0
  207. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/CodeRepository.js +43 -0
  209. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/GlobalConfig.js +110 -0
  211. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  212. package/build/dist/Models/DatabaseModels/Index.js +4 -8
  213. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  214. package/build/dist/Models/DatabaseModels/InstanceHealthLog.js +304 -0
  215. package/build/dist/Models/DatabaseModels/InstanceHealthLog.js.map +1 -0
  216. package/build/dist/Models/DatabaseModels/LlmLog.js +35 -0
  217. package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -1
  218. package/build/dist/Models/DatabaseModels/Project.js +127 -6
  219. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  220. package/build/dist/Models/DatabaseModels/Runbook.js +1 -1
  221. package/build/dist/Models/DatabaseModels/Runbook.js.map +1 -1
  222. package/build/dist/Server/API/AIAgentDataAPI.js +568 -85
  223. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  224. package/build/dist/Server/API/AIAgentTaskAPI.js +100 -44
  225. package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
  226. package/build/dist/Server/API/AIAgentTaskLogAPI.js +49 -25
  227. package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -1
  228. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js +27 -0
  229. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js.map +1 -1
  230. package/build/dist/Server/API/AIInsightAPI.js +140 -0
  231. package/build/dist/Server/API/AIInsightAPI.js.map +1 -0
  232. package/build/dist/Server/API/AIInvestigationAPI.js +257 -1
  233. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  234. package/build/dist/Server/API/CodeFixRunAPI.js +181 -0
  235. package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -0
  236. package/build/dist/Server/API/GitHubAPI.js +164 -2
  237. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  238. package/build/dist/Server/API/TelemetryExceptionAPI.js +148 -43
  239. package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
  240. package/build/dist/Server/EnvironmentConfig.js +1 -1
  241. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js +23 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js.map +1 -0
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js +32 -0
  245. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js.map +1 -0
  246. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js +16 -0
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js.map +1 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js +16 -0
  249. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js.map +1 -0
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js +24 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js.map +1 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js +16 -0
  253. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js.map +1 -0
  254. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js +24 -0
  255. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js.map +1 -0
  256. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js +24 -0
  257. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js.map +1 -0
  258. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js +24 -0
  259. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js.map +1 -0
  260. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js +18 -0
  261. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js.map +1 -0
  262. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js +18 -0
  263. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js.map +1 -0
  264. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js +32 -0
  265. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js.map +1 -0
  266. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js +18 -0
  267. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js.map +1 -0
  268. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js +125 -0
  269. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js.map +1 -0
  270. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js +62 -0
  271. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js.map +1 -0
  272. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +30 -0
  273. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  274. package/build/dist/Server/Infrastructure/Queue.js +73 -3
  275. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  276. package/build/dist/Server/Infrastructure/Semaphore.js +44 -1
  277. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  278. package/build/dist/Server/Services/AIAgentService.js +29 -0
  279. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  280. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js +78 -0
  281. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js.map +1 -1
  282. package/build/dist/Server/Services/AIInsightService.js +164 -0
  283. package/build/dist/Server/Services/AIInsightService.js.map +1 -0
  284. package/build/dist/Server/Services/AIRunEventService.js +49 -0
  285. package/build/dist/Server/Services/AIRunEventService.js.map +1 -1
  286. package/build/dist/Server/Services/AIRunService.js +221 -0
  287. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  288. package/build/dist/Server/Services/AIService.js +198 -11
  289. package/build/dist/Server/Services/AIService.js.map +1 -1
  290. package/build/dist/Server/Services/AlertService.js +4 -4
  291. package/build/dist/Server/Services/AlertService.js.map +1 -1
  292. package/build/dist/Server/Services/CodeRepositoryService.js +180 -0
  293. package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
  294. package/build/dist/Server/Services/GlobalConfigService.js +84 -0
  295. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  296. package/build/dist/Server/Services/IncidentService.js +149 -37
  297. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  298. package/build/dist/Server/Services/IncidentStateTimelineService.js +24 -4
  299. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  300. package/build/dist/Server/Services/Index.js +4 -4
  301. package/build/dist/Server/Services/Index.js.map +1 -1
  302. package/build/dist/Server/Services/{AIAgentTaskLogService.js → InstanceHealthLogService.js} +2 -2
  303. package/build/dist/Server/Services/InstanceHealthLogService.js.map +1 -0
  304. package/build/dist/Server/Services/LlmLogService.js +23 -0
  305. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  306. package/build/dist/Server/Services/LlmProviderService.js +96 -0
  307. package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
  308. package/build/dist/Server/Services/MetricBaselineService.js +65 -0
  309. package/build/dist/Server/Services/MetricBaselineService.js.map +1 -1
  310. package/build/dist/Server/Services/MonitorService.js +9 -1
  311. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  312. package/build/dist/Server/Services/TelemetryExceptionService.js +243 -82
  313. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  314. package/build/dist/Server/Services/TraceAggregationService.js +124 -0
  315. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  316. package/build/dist/Server/Types/Workflow/ComponentCode.js.map +1 -1
  317. package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js +240 -0
  318. package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js.map +1 -0
  319. package/build/dist/Server/Types/Workflow/Components/Index.js +2 -0
  320. package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
  321. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +48 -0
  322. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -0
  323. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +174 -0
  324. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -0
  325. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js +126 -0
  326. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js.map +1 -0
  327. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +131 -0
  328. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -0
  329. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js +99 -0
  330. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js.map +1 -0
  331. package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js +245 -0
  332. package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js.map +1 -0
  333. package/build/dist/Server/Utils/AI/Eval/EvalScores.js +83 -0
  334. package/build/dist/Server/Utils/AI/Eval/EvalScores.js.map +1 -0
  335. package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js +12 -0
  336. package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js.map +1 -0
  337. package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +439 -0
  338. package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -0
  339. package/build/dist/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.js → SRE/AIInvestigationEngine.js} +47 -31
  340. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -0
  341. package/build/dist/Server/Utils/AI/{Sentinel/SentinelMemory.js → SRE/AIMemory.js} +5 -5
  342. package/build/dist/Server/Utils/AI/SRE/AIMemory.js.map +1 -0
  343. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.js +42 -19
  344. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -0
  345. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +226 -0
  346. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -0
  347. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +100 -0
  348. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -0
  349. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js +174 -0
  350. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js.map +1 -0
  351. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.js +60 -22
  352. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -0
  353. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.js +9 -9
  354. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -0
  355. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js +268 -0
  356. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js.map +1 -0
  357. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +226 -0
  358. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -0
  359. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js +26 -0
  360. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js.map +1 -0
  361. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js +159 -0
  362. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js.map +1 -0
  363. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +177 -0
  364. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -0
  365. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js +384 -0
  366. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js.map +1 -0
  367. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js +180 -0
  368. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -0
  369. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +269 -0
  370. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js.map +1 -0
  371. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +231 -0
  372. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -0
  373. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +206 -0
  374. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -0
  375. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js +121 -0
  376. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js.map +1 -0
  377. package/build/dist/Server/Utils/AI/SRE/Insights/Types.js +2 -0
  378. package/build/dist/Server/Utils/AI/SRE/Insights/Types.js.map +1 -0
  379. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +148 -0
  380. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -0
  381. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +231 -0
  382. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -0
  383. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.js +102 -23
  384. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -0
  385. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +167 -0
  386. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -0
  387. package/build/dist/Server/Utils/AI/Toolbox/{SentinelActionTools.js → AIActionTools.js} +18 -2
  388. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -0
  389. package/build/dist/Server/Utils/AI/Toolbox/Index.js +2 -2
  390. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  391. package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js +301 -0
  392. package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js.map +1 -0
  393. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +240 -2
  394. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  395. package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js +127 -0
  396. package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js.map +1 -0
  397. package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js +336 -0
  398. package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js.map +1 -0
  399. package/build/dist/Server/Utils/Execute.js.map +1 -1
  400. package/build/dist/Server/Utils/LLM/LLMService.js +125 -25
  401. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  402. package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js +120 -0
  403. package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js.map +1 -0
  404. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -0
  405. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  406. package/build/dist/Types/AI/AIInsightEvidence.js +2 -0
  407. package/build/dist/Types/AI/AIInsightEvidence.js.map +1 -0
  408. package/build/dist/Types/AI/AIInsightHumanVerdict.js +16 -0
  409. package/build/dist/Types/AI/AIInsightHumanVerdict.js.map +1 -0
  410. package/build/dist/Types/AI/AIInsightSeverity.js +14 -0
  411. package/build/dist/Types/AI/AIInsightSeverity.js.map +1 -0
  412. package/build/dist/Types/AI/AIInsightStatus.js +36 -0
  413. package/build/dist/Types/AI/AIInsightStatus.js.map +1 -0
  414. package/build/dist/Types/AI/AIInsightType.js +42 -0
  415. package/build/dist/Types/AI/AIInsightType.js.map +1 -0
  416. package/build/dist/Types/AI/AIRunAutoGrade.js +19 -0
  417. package/build/dist/Types/AI/AIRunAutoGrade.js.map +1 -0
  418. package/build/dist/Types/AI/AIRunEventType.js +5 -0
  419. package/build/dist/Types/AI/AIRunEventType.js.map +1 -1
  420. package/build/dist/Types/AI/AIRunHumanVerdict.js +18 -0
  421. package/build/dist/Types/AI/AIRunHumanVerdict.js.map +1 -0
  422. package/build/dist/Types/AI/AIRunType.js +6 -0
  423. package/build/dist/Types/AI/AIRunType.js.map +1 -1
  424. package/build/dist/Types/AI/CodeFixTaskContext.js +29 -0
  425. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -0
  426. package/build/dist/Types/AI/CodeFixTaskType.js +122 -0
  427. package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -0
  428. package/build/dist/Types/AI/FixPullRequestCiStatus.js +102 -0
  429. package/build/dist/Types/AI/FixPullRequestCiStatus.js.map +1 -0
  430. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +55 -0
  431. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
  432. package/build/dist/Types/Incident/IncidentMetricType.js +7 -0
  433. package/build/dist/Types/Incident/IncidentMetricType.js.map +1 -1
  434. package/build/dist/Types/Monitor/CriteriaFilter.js +7 -0
  435. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  436. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +62 -0
  437. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  438. package/build/dist/Types/Monitor/MonitorStep.js +28 -0
  439. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  440. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +93 -0
  441. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -0
  442. package/build/dist/Types/Monitor/MonitorType.js +15 -0
  443. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  444. package/build/dist/Types/Monitor/SqlDatabaseType.js +47 -0
  445. package/build/dist/Types/Monitor/SqlDatabaseType.js.map +1 -0
  446. package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js +2 -0
  447. package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js.map +1 -0
  448. package/build/dist/Types/Permission.js +10 -84
  449. package/build/dist/Types/Permission.js.map +1 -1
  450. package/build/dist/Types/Runbook/RunbookStepType.js +1 -0
  451. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  452. package/build/dist/Types/Workflow/ComponentID.js +1 -0
  453. package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
  454. package/build/dist/Types/Workflow/Components/AI.js +135 -0
  455. package/build/dist/Types/Workflow/Components/AI.js.map +1 -0
  456. package/build/dist/Types/Workflow/Components.js +7 -0
  457. package/build/dist/Types/Workflow/Components.js.map +1 -1
  458. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -1
  459. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
  460. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +9 -0
  461. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  462. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +1 -1
  463. package/build/dist/UI/Components/Table/Table.js +28 -2
  464. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  465. package/build/dist/UI/Utils/TableColumnsToCsv.js +291 -0
  466. package/build/dist/UI/Utils/TableColumnsToCsv.js.map +1 -0
  467. package/build/dist/Utils/Monitor/MonitorMetricType.js +1 -0
  468. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  469. package/package.json +1 -1
  470. package/Models/DatabaseModels/AIAgentTask.ts +0 -660
  471. package/Models/DatabaseModels/AIAgentTaskLog.ts +0 -426
  472. package/Models/DatabaseModels/AIAgentTaskTelemetryException.ts +0 -399
  473. package/Models/DatabaseModels/ServiceCodeRepository.ts +0 -647
  474. package/Server/Services/AIAgentTaskService.ts +0 -240
  475. package/Server/Services/AIAgentTaskTelemetryExceptionService.ts +0 -39
  476. package/Server/Services/ServiceCodeRepositoryService.ts +0 -55
  477. package/Tests/Server/Services/AIAgentTaskServiceClaim.test.ts +0 -146
  478. package/Types/AI/AIAgentTaskMetadata.ts +0 -25
  479. package/Types/AI/AIAgentTaskType.ts +0 -40
  480. package/build/dist/Models/DatabaseModels/AIAgentTask.js +0 -691
  481. package/build/dist/Models/DatabaseModels/AIAgentTask.js.map +0 -1
  482. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js +0 -447
  483. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js.map +0 -1
  484. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js +0 -415
  485. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js.map +0 -1
  486. package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js +0 -665
  487. package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js.map +0 -1
  488. package/build/dist/Server/Services/AIAgentTaskLogService.js.map +0 -1
  489. package/build/dist/Server/Services/AIAgentTaskService.js +0 -217
  490. package/build/dist/Server/Services/AIAgentTaskService.js.map +0 -1
  491. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js +0 -36
  492. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js.map +0 -1
  493. package/build/dist/Server/Services/ServiceCodeRepositoryService.js +0 -54
  494. package/build/dist/Server/Services/ServiceCodeRepositoryService.js.map +0 -1
  495. package/build/dist/Server/Utils/AI/Sentinel/AlertInvestigationRunner.js.map +0 -1
  496. package/build/dist/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.js.map +0 -1
  497. package/build/dist/Server/Utils/AI/Sentinel/IncidentPostmortemRunner.js.map +0 -1
  498. package/build/dist/Server/Utils/AI/Sentinel/InvestigationQueue.js.map +0 -1
  499. package/build/dist/Server/Utils/AI/Sentinel/SentinelInvestigationEngine.js.map +0 -1
  500. package/build/dist/Server/Utils/AI/Sentinel/SentinelMemory.js.map +0 -1
  501. package/build/dist/Server/Utils/AI/Toolbox/SentinelActionTools.js.map +0 -1
  502. package/build/dist/Types/AI/AIAgentTaskMetadata.js +0 -6
  503. package/build/dist/Types/AI/AIAgentTaskMetadata.js.map +0 -1
  504. package/build/dist/Types/AI/AIAgentTaskType.js +0 -29
  505. package/build/dist/Types/AI/AIAgentTaskType.js.map +0 -1
@@ -1,19 +1,30 @@
1
1
  import AIAgentService from "../Services/AIAgentService";
2
- import LlmProviderService from "../Services/LlmProviderService";
3
2
  import TelemetryExceptionService from "../Services/TelemetryExceptionService";
4
3
  import ServiceService from "../Services/ServiceService";
5
- import ServiceCodeRepositoryService from "../Services/ServiceCodeRepositoryService";
6
4
  import CodeRepositoryService from "../Services/CodeRepositoryService";
7
5
  import AIAgentTaskPullRequestService from "../Services/AIAgentTaskPullRequestService";
8
- import AIAgentTaskService from "../Services/AIAgentTaskService";
6
+ import AIRunService from "../Services/AIRunService";
7
+ import AIRunEventService from "../Services/AIRunEventService";
8
+ import IncidentService from "../Services/IncidentService";
9
+ import AlertService from "../Services/AlertService";
10
+ import IncidentFeedService from "../Services/IncidentFeedService";
11
+ import AlertFeedService from "../Services/AlertFeedService";
9
12
  import Express from "../Utils/Express";
10
13
  import Response from "../Utils/Response";
11
14
  import AIAgentTaskPullRequest from "../../Models/DatabaseModels/AIAgentTaskPullRequest";
15
+ import { IncidentFeedEventType, } from "../../Models/DatabaseModels/IncidentFeed";
16
+ import { AlertFeedEventType, } from "../../Models/DatabaseModels/AlertFeed";
17
+ import AIRunEventType from "../../Types/AI/AIRunEventType";
18
+ import AIRunType from "../../Types/AI/AIRunType";
19
+ import { CodeFixContextKind, CodeFixTaskTypeHelper, } from "../../Types/AI/CodeFixTaskType";
20
+ import SpanTreeAnalyzer from "../Utils/AI/PerfEvidence/SpanTreeAnalyzer";
21
+ import OpenPullRequestCap from "../Utils/AI/CodeFix/OpenPullRequestCap";
22
+ import CodeFixAgentCompletion from "../Utils/AI/CodeFix/CodeFixAgentCompletion";
23
+ import SortOrder from "../../Types/BaseDatabase/SortOrder";
12
24
  import BadDataException from "../../Types/Exception/BadDataException";
13
25
  import ObjectID from "../../Types/ObjectID";
14
26
  import GitHubUtil from "../Utils/CodeRepository/GitHub/GitHub";
15
27
  import CodeRepositoryType from "../../Types/CodeRepository/CodeRepositoryType";
16
- import LIMIT_MAX from "../../Types/Database/LimitMax";
17
28
  import URL from "../../Types/API/URL";
18
29
  import PullRequestState from "../../Types/CodeRepository/PullRequestState";
19
30
  import logger, { getLogAttributesFromRequest } from "../Utils/Logger";
@@ -26,41 +37,53 @@ export default class AIAgentDataAPI {
26
37
  return this.router;
27
38
  }
28
39
  initRoutes() {
29
- // Get LLM configuration for a project
30
- this.router.post("/ai-agent-data/get-llm-config", async (req, res, next) => {
40
+ /*
41
+ * Server-mediated LLM completion for the in-house code-fix agent (B4
42
+ * Tier 0, Internal/Roadmap/CodeFixSandboxDesign.md). One call = one
43
+ * completion of the worker's tool loop, executed through
44
+ * AIService.executeWithLogging: metered, LlmLog-linked to the run,
45
+ * inside the G4 daily budget, and under per-run loop budgets (max
46
+ * completion calls / output tokens) enforced server-side. The worker
47
+ * never receives a provider secret on this path.
48
+ *
49
+ * Request: { aiAgentId, aiAgentKey, taskId, messages, tools?, maxTokens? }
50
+ * Response: { message: { role: "assistant", content, toolCalls },
51
+ * stopReason: "stop" | "tool_use",
52
+ * budget: { completionCallsUsed, maxCompletionCalls,
53
+ * outputTokensUsed, maxOutputTokens } }
54
+ */
55
+ this.router.post("/ai-agent-data/llm-completion", async (req, res, next) => {
31
56
  try {
32
57
  const data = req.body;
33
58
  // Validate AI Agent credentials
34
59
  const aiAgent = await this.validateAIAgent(data);
35
- if (!aiAgent) {
60
+ if (!aiAgent || !aiAgent.id) {
36
61
  return Response.sendErrorResponse(req, res, new BadDataException("Invalid AI Agent ID or AI Agent Key"));
37
62
  }
38
- // Get project ID
39
- if (!data["projectId"]) {
40
- return Response.sendErrorResponse(req, res, new BadDataException("projectId is required"));
41
- }
42
- const projectId = new ObjectID(data["projectId"]);
43
- // Check if this is a Project AI Agent (has a projectId)
44
- const isProjectAIAgent = aiAgent.projectId !== null && aiAgent.projectId !== undefined;
45
- // Get LLM provider for the project
46
- const llmProvider = await LlmProviderService.getLLMProviderForProject(projectId);
47
- if (!llmProvider) {
48
- return Response.sendErrorResponse(req, res, new BadDataException("No LLM provider configured for this project"));
49
- }
50
- /*
51
- * Security check: Project AI Agents cannot access Global LLM Providers
52
- * Only Global AI Agents (projectId is null) can access Global LLM Providers
53
- */
54
- const isGlobalLLMProvider = llmProvider.isGlobalLlm === true;
55
- if (isProjectAIAgent && isGlobalLLMProvider) {
56
- return Response.sendErrorResponse(req, res, new BadDataException("Project AI Agents cannot access Global LLM Providers. Please configure a project-specific LLM Provider."));
63
+ if (!data["taskId"]) {
64
+ return Response.sendErrorResponse(req, res, new BadDataException("taskId is required"));
57
65
  }
58
- logger.debug(`LLM config fetched for project ${projectId.toString()}: ${llmProvider.llmType}`, getLogAttributesFromRequest(req));
66
+ const taskId = new ObjectID(data["taskId"]);
67
+ const messages = this.parseCompletionMessages(data["messages"]);
68
+ const tools = this.parseCompletionTools(data["tools"]);
69
+ const maxTokens = typeof data["maxTokens"] === "number" && data["maxTokens"] > 0
70
+ ? data["maxTokens"]
71
+ : undefined;
72
+ const result = await CodeFixAgentCompletion.execute({
73
+ aiAgentId: aiAgent.id,
74
+ aiRunId: taskId,
75
+ messages,
76
+ tools,
77
+ maxTokens,
78
+ });
59
79
  return Response.sendJsonObjectResponse(req, res, {
60
- llmType: llmProvider.llmType,
61
- apiKey: llmProvider.apiKey,
62
- baseUrl: llmProvider.baseUrl,
63
- modelName: llmProvider.modelName,
80
+ message: {
81
+ role: "assistant",
82
+ content: result.content,
83
+ toolCalls: result.toolCalls,
84
+ },
85
+ stopReason: result.stopReason,
86
+ budget: result.budget,
64
87
  });
65
88
  }
66
89
  catch (err) {
@@ -142,9 +165,14 @@ export default class AIAgentDataAPI {
142
165
  next(err);
143
166
  }
144
167
  });
145
- // Get code repositories linked to a service
168
+ /*
169
+ * Resolve the repository the exception's code lives in — AT RUNTIME
170
+ * (stack-trace path matching over the project's connected repos, with
171
+ * name-match and only-repository fallbacks). Replaces the old
172
+ * ServiceCodeRepository mapping-table lookup; the response keeps the
173
+ * `repositories` array shape the agent already consumes.
174
+ */
146
175
  this.router.post("/ai-agent-data/get-code-repositories", async (req, res, next) => {
147
- var _a;
148
176
  try {
149
177
  const data = req.body;
150
178
  // Validate AI Agent credentials
@@ -152,63 +180,405 @@ export default class AIAgentDataAPI {
152
180
  if (!aiAgent) {
153
181
  return Response.sendErrorResponse(req, res, new BadDataException("Invalid AI Agent ID or AI Agent Key"));
154
182
  }
155
- // Get service ID (supports primaryEntityId plus legacy serviceId / telemetryServiceId from older agents)
156
- const serviceIdParam = data["primaryEntityId"] ||
157
- data["serviceId"] ||
158
- data["telemetryServiceId"];
159
- if (!serviceIdParam) {
160
- return Response.sendErrorResponse(req, res, new BadDataException("primaryEntityId is required"));
161
- }
162
- const primaryEntityId = new ObjectID(serviceIdParam);
163
- // Find CodeRepositories linked to this Service
164
- const repositories = [];
165
- const serviceCodeRepositories = await ServiceCodeRepositoryService.findBy({
166
- query: {
167
- serviceId: primaryEntityId,
168
- },
183
+ if (!data["exceptionId"]) {
184
+ return Response.sendErrorResponse(req, res, new BadDataException("exceptionId is required (agents older than the runtime-resolution change must be upgraded)"));
185
+ }
186
+ const exceptionId = new ObjectID(data["exceptionId"]);
187
+ const exception = await TelemetryExceptionService.findOneById({
188
+ id: exceptionId,
169
189
  select: {
170
- codeRepositoryId: true,
171
- servicePathInRepository: true,
172
- codeRepository: {
173
- _id: true,
190
+ _id: true,
191
+ projectId: true,
192
+ stackTrace: true,
193
+ primaryEntityId: true,
194
+ },
195
+ props: {
196
+ isRoot: true,
197
+ },
198
+ });
199
+ if (!exception || !exception.projectId) {
200
+ return Response.sendErrorResponse(req, res, new BadDataException("Exception not found"));
201
+ }
202
+ // Service name feeds the name-match fallback when there is one.
203
+ const service = exception.primaryEntityId
204
+ ? await ServiceService.findOneById({
205
+ id: exception.primaryEntityId,
206
+ select: {
174
207
  name: true,
175
- repositoryHostedAt: true,
176
- organizationName: true,
177
- repositoryName: true,
178
- mainBranchName: true,
179
- gitHubAppInstallationId: true,
180
208
  },
209
+ props: {
210
+ isRoot: true,
211
+ },
212
+ })
213
+ : null;
214
+ const resolution = await CodeRepositoryService.resolveRepositoryForException({
215
+ projectId: exception.projectId,
216
+ stackTrace: exception.stackTrace || null,
217
+ serviceName: (service === null || service === void 0 ? void 0 : service.name) || null,
218
+ });
219
+ if (!resolution) {
220
+ logger.debug(`No repository resolved for exception ${exceptionId.toString()}`, getLogAttributesFromRequest(req));
221
+ return Response.sendJsonObjectResponse(req, res, {
222
+ repositories: [],
223
+ resolutionError: "Could not resolve a repository for this exception: no connected repository contains the files in its stack trace, no repository name matches the service, and the project has more than one repository. Connect the right repository via the GitHub App.",
224
+ });
225
+ }
226
+ const repository = await CodeRepositoryService.findOneById({
227
+ id: new ObjectID(resolution.codeRepositoryId),
228
+ select: {
229
+ _id: true,
230
+ name: true,
231
+ repositoryHostedAt: true,
232
+ organizationName: true,
233
+ repositoryName: true,
234
+ mainBranchName: true,
235
+ gitHubAppInstallationId: true,
236
+ },
237
+ props: {
238
+ isRoot: true,
239
+ },
240
+ });
241
+ if (!repository) {
242
+ return Response.sendErrorResponse(req, res, new BadDataException("Resolved repository no longer exists"));
243
+ }
244
+ logger.debug(`Resolved repository ${resolution.organizationName}/${resolution.repositoryName} for exception ${exceptionId.toString()} via ${resolution.method}: ${resolution.evidence}`, getLogAttributesFromRequest(req));
245
+ return Response.sendJsonObjectResponse(req, res, {
246
+ repositories: [
247
+ {
248
+ id: repository.id.toString(),
249
+ name: repository.name || "",
250
+ repositoryHostedAt: repository.repositoryHostedAt || "",
251
+ organizationName: repository.organizationName || "",
252
+ repositoryName: repository.repositoryName || "",
253
+ mainBranchName: repository.mainBranchName || "main",
254
+ servicePathInRepository: resolution.servicePathInRepository,
255
+ gitHubAppInstallationId: repository.gitHubAppInstallationId || null,
256
+ resolutionMethod: resolution.method,
257
+ resolutionEvidence: resolution.evidence,
258
+ },
259
+ ],
260
+ });
261
+ }
262
+ catch (err) {
263
+ next(err);
264
+ }
265
+ });
266
+ /*
267
+ * Context for every non-exception recipe, keyed by the run id `taskId`
268
+ * (the id get-pending-task returned) — these runs have NO telemetry
269
+ * exception, so the exception-shaped endpoints above cannot serve them.
270
+ * The route name predates the newer recipes and is kept for agent
271
+ * compatibility. Two context kinds are served:
272
+ *
273
+ * - Incident/alert-subject recipes (ImproveInstrumentation,
274
+ * FixFromIncident): the investigation's posted analysis + subject
275
+ * metadata + the repository resolved without a stack trace. The
276
+ * analysis text comes from the subject's latest RootCause feed item:
277
+ * the AI's postAnalysis is the only writer of RootCause feed
278
+ * events, it writes them for BOTH subjects and BOTH confidence
279
+ * outcomes (quiet mode only mutes the workspace ping), so the feed
280
+ * item IS the investigation run's persisted output.
281
+ *
282
+ * - Trace-evidence recipes (FixPerformance): the deterministic
283
+ * span-tree findings stored on AIRun.taskContext at trigger time
284
+ * (subjectType "trace"; the rendered evidence rides in
285
+ * analysisMarkdown so the worker pipeline stays shared). Repository
286
+ * resolution here TRIES the stack-trace path matcher first, fed by a
287
+ * synthetic trace built from the implicated spans' code.*
288
+ * attributes, before the name-match / only-repository fallbacks.
289
+ */
290
+ this.router.post("/ai-agent-data/get-instrumentation-task-details", async (req, res, next) => {
291
+ var _a;
292
+ try {
293
+ const data = req.body;
294
+ // Validate AI Agent credentials
295
+ const aiAgent = await this.validateAIAgent(data);
296
+ if (!aiAgent) {
297
+ return Response.sendErrorResponse(req, res, new BadDataException("Invalid AI Agent ID or AI Agent Key"));
298
+ }
299
+ if (!data["taskId"]) {
300
+ return Response.sendErrorResponse(req, res, new BadDataException("taskId is required"));
301
+ }
302
+ const taskId = new ObjectID(data["taskId"]);
303
+ const run = await AIRunService.findOneById({
304
+ id: taskId,
305
+ select: {
306
+ _id: true,
307
+ projectId: true,
308
+ runType: true,
309
+ codeFixTaskType: true,
310
+ triggeredByIncidentId: true,
311
+ triggeredByAlertId: true,
312
+ taskContext: true,
181
313
  },
182
- skip: 0,
183
- limit: LIMIT_MAX,
184
314
  props: {
185
315
  isRoot: true,
186
316
  },
187
317
  });
188
- for (const scr of serviceCodeRepositories) {
189
- if (scr.codeRepository) {
190
- // Check if we already have this repository
191
- const existingRepo = repositories.some((r) => {
192
- var _a, _b;
193
- return r.id === ((_b = (_a = scr.codeRepository) === null || _a === void 0 ? void 0 : _a._id) === null || _b === void 0 ? void 0 : _b.toString());
194
- });
195
- if (!existingRepo) {
196
- repositories.push({
197
- id: ((_a = scr.codeRepository._id) === null || _a === void 0 ? void 0 : _a.toString()) || "",
198
- name: scr.codeRepository.name || "",
199
- repositoryHostedAt: scr.codeRepository.repositoryHostedAt || "",
200
- organizationName: scr.codeRepository.organizationName || "",
201
- repositoryName: scr.codeRepository.repositoryName || "",
202
- mainBranchName: scr.codeRepository.mainBranchName || "main",
203
- servicePathInRepository: scr.servicePathInRepository || null,
204
- gitHubAppInstallationId: scr.codeRepository.gitHubAppInstallationId || null,
205
- });
318
+ if (!run || !run.projectId) {
319
+ return Response.sendErrorResponse(req, res, new BadDataException("Task not found"));
320
+ }
321
+ /*
322
+ * Any non-exception recipe is served here — the same context-kind
323
+ * grouping the claim guard uses.
324
+ */
325
+ const taskType = CodeFixTaskTypeHelper.fromDatabaseValue(run.codeFixTaskType);
326
+ const contextKind = CodeFixTaskTypeHelper.getContextKind(taskType);
327
+ if (run.runType !== AIRunType.CodeFix ||
328
+ contextKind === CodeFixContextKind.TelemetryException) {
329
+ return Response.sendErrorResponse(req, res, new BadDataException("Task is not an incident/alert-subject or trace-evidence code-fix run (ImproveInstrumentation, FixFromIncident or FixPerformance)"));
330
+ }
331
+ /*
332
+ * Trace-evidence recipes (FixPerformance): everything the worker
333
+ * needs was captured into taskContext at trigger time — the spans
334
+ * themselves may already be past ClickHouse retention.
335
+ */
336
+ if (contextKind === CodeFixContextKind.TaskContext) {
337
+ const taskContext = run.taskContext;
338
+ const findings = (taskContext === null || taskContext === void 0 ? void 0 : taskContext.performanceFindings) || [];
339
+ if (!(taskContext === null || taskContext === void 0 ? void 0 : taskContext.traceId) || findings.length === 0) {
340
+ return Response.sendErrorResponse(req, res, new BadDataException("This performance-fix task has no stored trace evidence — the task has nothing to work from."));
341
+ }
342
+ // Deduped name+duration summary of every implicated span.
343
+ const spanSummaries = [];
344
+ const seenSpanIds = new Set();
345
+ for (const finding of findings) {
346
+ for (const implicated of finding.implicatedSpans) {
347
+ if (!seenSpanIds.has(implicated.spanId)) {
348
+ seenSpanIds.add(implicated.spanId);
349
+ spanSummaries.push(implicated);
350
+ }
206
351
  }
207
352
  }
353
+ /*
354
+ * Repository resolution: the implicated spans' code.*
355
+ * attributes (when the instrumentation stamps them) become a
356
+ * synthetic stack trace for the path matcher — each line is
357
+ * shaped so extractCandidatePathsFromStackTrace parses it.
358
+ * Without code attributes this degrades to the name-match /
359
+ * only-repository fallbacks, exactly like the subject recipes.
360
+ */
361
+ const codeLocations = taskContext.codeLocations || [];
362
+ const syntheticStackTrace = codeLocations.length > 0
363
+ ? codeLocations
364
+ .map((location) => {
365
+ var _a;
366
+ return ` at ${location.functionName ? `${location.functionName} ` : ""}(${location.filePath}:${(_a = location.lineNumber) !== null && _a !== void 0 ? _a : 1})`;
367
+ })
368
+ .join("\n")
369
+ : null;
370
+ const serviceName = taskContext.serviceName || null;
371
+ const resolution = await CodeRepositoryService.resolveRepositoryForException({
372
+ projectId: run.projectId,
373
+ stackTrace: syntheticStackTrace,
374
+ serviceName,
375
+ });
376
+ const repository = resolution
377
+ ? await CodeRepositoryService.findOneById({
378
+ id: new ObjectID(resolution.codeRepositoryId),
379
+ select: {
380
+ _id: true,
381
+ name: true,
382
+ repositoryHostedAt: true,
383
+ organizationName: true,
384
+ repositoryName: true,
385
+ mainBranchName: true,
386
+ gitHubAppInstallationId: true,
387
+ },
388
+ props: {
389
+ isRoot: true,
390
+ },
391
+ })
392
+ : null;
393
+ /*
394
+ * The rendered evidence rides in analysisMarkdown and the top
395
+ * finding's headline in subjectTitle, so the shared
396
+ * SubjectPullRequestTaskHandler pipeline needs no special
397
+ * casing — the structured findings travel alongside.
398
+ */
399
+ const basePayload = {
400
+ subjectType: "trace",
401
+ subjectTitle: findings[0].headline,
402
+ analysisMarkdown: SpanTreeAnalyzer.renderFindingsMarkdown(findings),
403
+ serviceName,
404
+ projectId: run.projectId.toString(),
405
+ traceId: taskContext.traceId,
406
+ findings: findings,
407
+ spanSummaries: spanSummaries,
408
+ };
409
+ if (!resolution || !repository) {
410
+ logger.debug(`No repository resolved for ${taskType} task ${taskId.toString()}`, getLogAttributesFromRequest(req));
411
+ return Response.sendJsonObjectResponse(req, res, Object.assign(Object.assign({}, basePayload), { repositories: [], resolutionError: "Could not resolve a repository for this performance-fix task: the trace's spans carried no matching code file paths, no connected repository name matches the affected service, and the project has more than one repository. Connect the right repository via the GitHub App, or rename one to match the service." }));
412
+ }
413
+ logger.debug(`Resolved repository ${resolution.organizationName}/${resolution.repositoryName} for ${taskType} task ${taskId.toString()} via ${resolution.method}: ${resolution.evidence}`, getLogAttributesFromRequest(req));
414
+ return Response.sendJsonObjectResponse(req, res, Object.assign(Object.assign({}, basePayload), { repositories: [
415
+ {
416
+ id: repository.id.toString(),
417
+ name: repository.name || "",
418
+ repositoryHostedAt: repository.repositoryHostedAt || "",
419
+ organizationName: repository.organizationName || "",
420
+ repositoryName: repository.repositoryName || "",
421
+ mainBranchName: repository.mainBranchName || "main",
422
+ servicePathInRepository: resolution.servicePathInRepository,
423
+ gitHubAppInstallationId: repository.gitHubAppInstallationId || null,
424
+ resolutionMethod: resolution.method,
425
+ resolutionEvidence: resolution.evidence,
426
+ },
427
+ ] }));
428
+ }
429
+ if (!run.triggeredByIncidentId && !run.triggeredByAlertId) {
430
+ return Response.sendErrorResponse(req, res, new BadDataException("This task has no incident or alert subject"));
431
+ }
432
+ const subjectType = run.triggeredByIncidentId
433
+ ? "incident"
434
+ : "alert";
435
+ let subjectTitle = "";
436
+ /*
437
+ * Best-effort service attribution from the subject's monitors —
438
+ * it only feeds the repository name-match fallback, so null is
439
+ * fine when the subject has no monitor.
440
+ */
441
+ let serviceName = null;
442
+ let analysisMarkdown = null;
443
+ if (run.triggeredByIncidentId) {
444
+ const incident = await IncidentService.findOneById({
445
+ id: run.triggeredByIncidentId,
446
+ select: {
447
+ title: true,
448
+ monitors: {
449
+ name: true,
450
+ },
451
+ },
452
+ props: {
453
+ isRoot: true,
454
+ },
455
+ });
456
+ if (!incident) {
457
+ return Response.sendErrorResponse(req, res, new BadDataException("The incident this task was created for no longer exists"));
458
+ }
459
+ subjectTitle = incident.title || "Untitled incident";
460
+ serviceName =
461
+ (incident.monitors || [])
462
+ .map((monitor) => {
463
+ return monitor.name || "";
464
+ })
465
+ .filter(Boolean)[0] || null;
466
+ const feedItem = await IncidentFeedService.findOneBy({
467
+ query: {
468
+ incidentId: run.triggeredByIncidentId,
469
+ incidentFeedEventType: IncidentFeedEventType.RootCause,
470
+ },
471
+ select: {
472
+ feedInfoInMarkdown: true,
473
+ },
474
+ sort: {
475
+ createdAt: SortOrder.Descending,
476
+ },
477
+ props: {
478
+ isRoot: true,
479
+ },
480
+ });
481
+ analysisMarkdown = (feedItem === null || feedItem === void 0 ? void 0 : feedItem.feedInfoInMarkdown) || null;
482
+ }
483
+ else {
484
+ const alert = await AlertService.findOneById({
485
+ id: run.triggeredByAlertId,
486
+ select: {
487
+ title: true,
488
+ monitor: {
489
+ name: true,
490
+ },
491
+ },
492
+ props: {
493
+ isRoot: true,
494
+ },
495
+ });
496
+ if (!alert) {
497
+ return Response.sendErrorResponse(req, res, new BadDataException("The alert this task was created for no longer exists"));
498
+ }
499
+ subjectTitle = alert.title || "Untitled alert";
500
+ serviceName = ((_a = alert.monitor) === null || _a === void 0 ? void 0 : _a.name) || null;
501
+ const feedItem = await AlertFeedService.findOneBy({
502
+ query: {
503
+ alertId: run.triggeredByAlertId,
504
+ alertFeedEventType: AlertFeedEventType.RootCause,
505
+ },
506
+ select: {
507
+ feedInfoInMarkdown: true,
508
+ },
509
+ sort: {
510
+ createdAt: SortOrder.Descending,
511
+ },
512
+ props: {
513
+ isRoot: true,
514
+ },
515
+ });
516
+ analysisMarkdown = (feedItem === null || feedItem === void 0 ? void 0 : feedItem.feedInfoInMarkdown) || null;
517
+ }
518
+ if (!analysisMarkdown) {
519
+ return Response.sendErrorResponse(req, res, new BadDataException(`No posted investigation analysis found for this ${subjectType} — the task has nothing to work from (the analysis feed item may have been deleted).`));
208
520
  }
209
- logger.debug(`Found ${repositories.length} code repositories for service ${primaryEntityId.toString()}`, getLogAttributesFromRequest(req));
521
+ /*
522
+ * Resolve the repository WITHOUT a stack trace — these tasks have
523
+ * no exception, so only the name-match (against the subject's
524
+ * monitor/service name) and only-repository fallbacks apply. When
525
+ * nothing resolves the worker fails the run with this guidance.
526
+ */
527
+ const resolution = await CodeRepositoryService.resolveRepositoryForException({
528
+ projectId: run.projectId,
529
+ stackTrace: null,
530
+ serviceName,
531
+ });
532
+ const repository = resolution
533
+ ? await CodeRepositoryService.findOneById({
534
+ id: new ObjectID(resolution.codeRepositoryId),
535
+ select: {
536
+ _id: true,
537
+ name: true,
538
+ repositoryHostedAt: true,
539
+ organizationName: true,
540
+ repositoryName: true,
541
+ mainBranchName: true,
542
+ gitHubAppInstallationId: true,
543
+ },
544
+ props: {
545
+ isRoot: true,
546
+ },
547
+ })
548
+ : null;
549
+ if (!resolution || !repository) {
550
+ logger.debug(`No repository resolved for ${taskType} task ${taskId.toString()}`, getLogAttributesFromRequest(req));
551
+ return Response.sendJsonObjectResponse(req, res, {
552
+ subjectType,
553
+ subjectTitle,
554
+ analysisMarkdown,
555
+ serviceName,
556
+ projectId: run.projectId.toString(),
557
+ repositories: [],
558
+ resolutionError: "Could not resolve a repository for this task: no connected repository name matches the affected monitor/service and the project has more than one repository. Connect the right repository via the GitHub App, or rename one to match the service.",
559
+ });
560
+ }
561
+ logger.debug(`Resolved repository ${resolution.organizationName}/${resolution.repositoryName} for ${taskType} task ${taskId.toString()} via ${resolution.method}: ${resolution.evidence}`, getLogAttributesFromRequest(req));
210
562
  return Response.sendJsonObjectResponse(req, res, {
211
- repositories: repositories,
563
+ subjectType,
564
+ subjectTitle,
565
+ analysisMarkdown,
566
+ serviceName,
567
+ projectId: run.projectId.toString(),
568
+ repositories: [
569
+ {
570
+ id: repository.id.toString(),
571
+ name: repository.name || "",
572
+ repositoryHostedAt: repository.repositoryHostedAt || "",
573
+ organizationName: repository.organizationName || "",
574
+ repositoryName: repository.repositoryName || "",
575
+ mainBranchName: repository.mainBranchName || "main",
576
+ servicePathInRepository: resolution.servicePathInRepository,
577
+ gitHubAppInstallationId: repository.gitHubAppInstallationId || null,
578
+ resolutionMethod: resolution.method,
579
+ resolutionEvidence: resolution.evidence,
580
+ },
581
+ ],
212
582
  });
213
583
  }
214
584
  catch (err) {
@@ -217,6 +587,7 @@ export default class AIAgentDataAPI {
217
587
  });
218
588
  // Get access token for a code repository
219
589
  this.router.post("/ai-agent-data/get-repository-token", async (req, res, next) => {
590
+ var _a;
220
591
  try {
221
592
  const data = req.body;
222
593
  // Validate AI Agent credentials
@@ -238,6 +609,7 @@ export default class AIAgentDataAPI {
238
609
  organizationName: true,
239
610
  repositoryName: true,
240
611
  gitHubAppInstallationId: true,
612
+ maxOpenFixPullRequests: true,
241
613
  },
242
614
  props: {
243
615
  isRoot: true,
@@ -254,6 +626,22 @@ export default class AIAgentDataAPI {
254
626
  if (!codeRepository.gitHubAppInstallationId) {
255
627
  return Response.sendErrorResponse(req, res, new BadDataException("No GitHub App installation ID found for this repository"));
256
628
  }
629
+ /*
630
+ * G11 guardrail: per-repo open-PR cap, enforced HERE because the
631
+ * token is the agent's only way to clone and push — a repo at its
632
+ * cap physically cannot receive another AI branch or PR. The
633
+ * worker records this message as the run's failure guidance.
634
+ */
635
+ const openPrCap = await OpenPullRequestCap.checkForRepository({
636
+ codeRepositoryId,
637
+ configuredLimit: (_a = codeRepository.maxOpenFixPullRequests) !== null && _a !== void 0 ? _a : null,
638
+ });
639
+ if (!openPrCap.allowed) {
640
+ return Response.sendErrorResponse(req, res, new BadDataException(OpenPullRequestCap.describeRejection({
641
+ decision: openPrCap,
642
+ repositoryName: `${codeRepository.organizationName}/${codeRepository.repositoryName}`,
643
+ })));
644
+ }
257
645
  /*
258
646
  * Generate GitHub installation access token with write permissions
259
647
  * Required for AI Agent to push branches and create pull requests
@@ -311,8 +699,11 @@ export default class AIAgentDataAPI {
311
699
  const description = data["description"];
312
700
  const headRefName = data["headRefName"];
313
701
  const baseRefName = data["baseRefName"];
314
- // Get the task to get the project ID
315
- const task = await AIAgentTaskService.findOneById({
702
+ /*
703
+ * `taskId` carries the AIRun id of the code-fix run — get the run
704
+ * for the project ID and so the PR can be recorded on its trail.
705
+ */
706
+ const run = await AIRunService.findOneById({
316
707
  id: taskId,
317
708
  select: {
318
709
  _id: true,
@@ -322,7 +713,7 @@ export default class AIAgentDataAPI {
322
713
  isRoot: true,
323
714
  },
324
715
  });
325
- if (!task) {
716
+ if (!run) {
326
717
  return Response.sendErrorResponse(req, res, new BadDataException("Task not found"));
327
718
  }
328
719
  // Get code repository for organization and repo name
@@ -339,10 +730,10 @@ export default class AIAgentDataAPI {
339
730
  });
340
731
  // Create the pull request record
341
732
  const pullRequest = new AIAgentTaskPullRequest();
342
- if (task.projectId) {
343
- pullRequest.projectId = task.projectId;
733
+ if (run.projectId) {
734
+ pullRequest.projectId = run.projectId;
344
735
  }
345
- pullRequest.aiAgentTaskId = taskId;
736
+ pullRequest.aiRunId = taskId;
346
737
  pullRequest.aiAgentId = aiAgent.id;
347
738
  pullRequest.codeRepositoryId = codeRepositoryId;
348
739
  pullRequest.pullRequestUrl = URL.fromString(pullRequestUrl);
@@ -375,7 +766,22 @@ export default class AIAgentDataAPI {
375
766
  isRoot: true,
376
767
  },
377
768
  });
378
- logger.debug(`Recorded pull request ${pullRequestUrl} for task ${taskId.toString()}`, getLogAttributesFromRequest(req));
769
+ /*
770
+ * The pull request is the run's headline action — record it on
771
+ * the run's glass-box trail so the activity feed shows it.
772
+ */
773
+ if (run.projectId) {
774
+ await AIRunEventService.appendEventToRun({
775
+ projectId: run.projectId,
776
+ aiRunId: taskId,
777
+ eventType: AIRunEventType.ActionExecuted,
778
+ toolName: "open_pull_request",
779
+ resultSummary: {
780
+ message: `Opened pull request: ${title} — ${pullRequestUrl}`,
781
+ },
782
+ });
783
+ }
784
+ logger.debug(`Recorded pull request ${pullRequestUrl} for run ${taskId.toString()}`, getLogAttributesFromRequest(req));
379
785
  return Response.sendJsonObjectResponse(req, res, {
380
786
  success: true,
381
787
  pullRequestId: (_a = createdPullRequest._id) === null || _a === void 0 ? void 0 : _a.toString(),
@@ -386,6 +792,83 @@ export default class AIAgentDataAPI {
386
792
  }
387
793
  });
388
794
  }
795
+ /*
796
+ * Parse the completion request's messages into the LLMMessage shape —
797
+ * strict on structure (role whitelist, string content) so malformed
798
+ * worker payloads fail with a clear 4xx instead of a provider error.
799
+ */
800
+ parseCompletionMessages(raw) {
801
+ if (!Array.isArray(raw) || raw.length === 0) {
802
+ throw new BadDataException("messages must be a non-empty array");
803
+ }
804
+ const validRoles = ["system", "user", "assistant", "tool"];
805
+ return raw.map((entry, index) => {
806
+ if (!entry || typeof entry !== "object") {
807
+ throw new BadDataException(`messages[${index}] must be an object`);
808
+ }
809
+ const messageObject = entry;
810
+ const role = messageObject["role"];
811
+ if (!validRoles.includes(role)) {
812
+ throw new BadDataException(`messages[${index}].role must be one of: ${validRoles.join(", ")}`);
813
+ }
814
+ const message = {
815
+ role: role,
816
+ content: typeof messageObject["content"] === "string"
817
+ ? messageObject["content"]
818
+ : "",
819
+ };
820
+ if (Array.isArray(messageObject["toolCalls"])) {
821
+ message.toolCalls = messageObject["toolCalls"].map((toolCall, toolCallIndex) => {
822
+ if (typeof toolCall["id"] !== "string" ||
823
+ typeof toolCall["name"] !== "string") {
824
+ throw new BadDataException(`messages[${index}].toolCalls[${toolCallIndex}] must carry string id and name`);
825
+ }
826
+ return {
827
+ id: toolCall["id"],
828
+ name: toolCall["name"],
829
+ arguments: toolCall["arguments"] &&
830
+ typeof toolCall["arguments"] === "object" &&
831
+ !Array.isArray(toolCall["arguments"])
832
+ ? toolCall["arguments"]
833
+ : {},
834
+ };
835
+ });
836
+ }
837
+ if (typeof messageObject["toolCallId"] === "string") {
838
+ message.toolCallId = messageObject["toolCallId"];
839
+ }
840
+ return message;
841
+ });
842
+ }
843
+ // Parse the completion request's tool definitions (optional).
844
+ parseCompletionTools(raw) {
845
+ if (raw === undefined || raw === null) {
846
+ return undefined;
847
+ }
848
+ if (!Array.isArray(raw)) {
849
+ throw new BadDataException("tools must be an array when provided");
850
+ }
851
+ if (raw.length === 0) {
852
+ return undefined;
853
+ }
854
+ return raw.map((entry, index) => {
855
+ if (!entry || typeof entry !== "object") {
856
+ throw new BadDataException(`tools[${index}] must be an object`);
857
+ }
858
+ const toolObject = entry;
859
+ if (typeof toolObject["name"] !== "string" ||
860
+ typeof toolObject["description"] !== "string" ||
861
+ !toolObject["inputSchema"] ||
862
+ typeof toolObject["inputSchema"] !== "object") {
863
+ throw new BadDataException(`tools[${index}] must carry string name, string description and an inputSchema object`);
864
+ }
865
+ return {
866
+ name: toolObject["name"],
867
+ description: toolObject["description"],
868
+ inputSchema: toolObject["inputSchema"],
869
+ };
870
+ });
871
+ }
389
872
  // Validate AI Agent credentials from request body
390
873
  async validateAIAgent(data) {
391
874
  if (!data["aiAgentId"] || !data["aiAgentKey"]) {