@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
@@ -0,0 +1,132 @@
1
+ import LlmProviderService from "../../../Server/Services/LlmProviderService";
2
+ import LlmProvider from "../../../Models/DatabaseModels/LlmProvider";
3
+ import ObjectID from "../../../Types/ObjectID";
4
+ import Query from "../../../Server/Types/Database/Query";
5
+ import { describe, expect, test, afterEach } from "@jest/globals";
6
+
7
+ /*
8
+ * getProjectOwnedLlmProvider is the project-preference leg of the agent
9
+ * provider resolution (getLlmProviderForMeteredAgentPath). The invariant
10
+ * these tests lock in: this resolver only ever queries providers owned by
11
+ * the given project — the global-provider fallback is layered on top by
12
+ * its caller, never here.
13
+ */
14
+
15
+ const projectId: ObjectID = ObjectID.generate();
16
+
17
+ function fakeProvider(name: string): LlmProvider {
18
+ return { id: ObjectID.generate(), name } as unknown as LlmProvider;
19
+ }
20
+
21
+ describe("LlmProviderService.getProjectOwnedLlmProvider", () => {
22
+ afterEach(() => {
23
+ jest.restoreAllMocks();
24
+ });
25
+
26
+ test("returns the project default when one exists", async () => {
27
+ const defaultProvider: LlmProvider = fakeProvider("default");
28
+ const spy: jest.SpiedFunction<typeof LlmProviderService.findOneBy> = jest
29
+ .spyOn(LlmProviderService, "findOneBy")
30
+ .mockResolvedValueOnce(defaultProvider);
31
+
32
+ const result: LlmProvider | null =
33
+ await LlmProviderService.getProjectOwnedLlmProvider(projectId);
34
+
35
+ expect(result).toBe(defaultProvider);
36
+ expect(spy).toHaveBeenCalledTimes(1);
37
+ const query: Query<LlmProvider> = spy.mock.calls[0]![0]!.query;
38
+ expect(query["projectId"]).toBe(projectId);
39
+ expect(query["isDefault"]).toBe(true);
40
+ });
41
+
42
+ test("falls back to any project-owned provider, never the global one", async () => {
43
+ const nonDefault: LlmProvider = fakeProvider("byo");
44
+ const spy: jest.SpiedFunction<typeof LlmProviderService.findOneBy> = jest
45
+ .spyOn(LlmProviderService, "findOneBy")
46
+ .mockResolvedValueOnce(null)
47
+ .mockResolvedValueOnce(nonDefault);
48
+
49
+ const result: LlmProvider | null =
50
+ await LlmProviderService.getProjectOwnedLlmProvider(projectId);
51
+
52
+ expect(result).toBe(nonDefault);
53
+ expect(spy).toHaveBeenCalledTimes(2);
54
+
55
+ // Every query issued must be scoped to the project — no global fallback.
56
+ for (const call of spy.mock.calls) {
57
+ const query: Query<LlmProvider> = call[0]!.query;
58
+ expect(query["projectId"]).toBe(projectId);
59
+ expect(query["isGlobalLlm"]).toBeUndefined();
60
+ }
61
+ });
62
+
63
+ test("returns null when the project owns no provider at all", async () => {
64
+ jest.spyOn(LlmProviderService, "findOneBy").mockResolvedValue(null);
65
+
66
+ const result: LlmProvider | null =
67
+ await LlmProviderService.getProjectOwnedLlmProvider(projectId);
68
+
69
+ expect(result).toBeNull();
70
+ });
71
+ });
72
+
73
+ /*
74
+ * getLlmProviderForMeteredAgentPath backs the SERVER-MEDIATED completion
75
+ * endpoint (B4 Tier 0), whose calls run through AIService.executeWithLogging
76
+ * — metered, logged, budgeted. Because metering is universal there, the
77
+ * global provider is a legitimate fallback ON CLOUD TOO (usage is billed as
78
+ * metered AI tokens). This is the only agent provider resolution — the
79
+ * raw-key path (get-llm-config / getLlmProviderForAgentTasks) is removed.
80
+ */
81
+ describe("LlmProviderService.getLlmProviderForMeteredAgentPath", () => {
82
+ afterEach(() => {
83
+ jest.restoreAllMocks();
84
+ });
85
+
86
+ test("a project-owned provider always wins, without a global query", async () => {
87
+ const owned: LlmProvider = fakeProvider("owned");
88
+ jest
89
+ .spyOn(LlmProviderService, "getProjectOwnedLlmProvider")
90
+ .mockResolvedValue(owned);
91
+ const findSpy: jest.SpiedFunction<typeof LlmProviderService.findOneBy> =
92
+ jest.spyOn(LlmProviderService, "findOneBy");
93
+
94
+ const result: LlmProvider | null =
95
+ await LlmProviderService.getLlmProviderForMeteredAgentPath(projectId);
96
+
97
+ expect(result).toBe(owned);
98
+ expect(findSpy).not.toHaveBeenCalled();
99
+ });
100
+
101
+ test("falls back to the global provider when the project owns none — cloud included", async () => {
102
+ const globalProvider: LlmProvider = fakeProvider("global");
103
+ jest
104
+ .spyOn(LlmProviderService, "getProjectOwnedLlmProvider")
105
+ .mockResolvedValue(null);
106
+ const findSpy: jest.SpiedFunction<typeof LlmProviderService.findOneBy> =
107
+ jest
108
+ .spyOn(LlmProviderService, "findOneBy")
109
+ .mockResolvedValue(globalProvider);
110
+
111
+ const result: LlmProvider | null =
112
+ await LlmProviderService.getLlmProviderForMeteredAgentPath(projectId);
113
+
114
+ expect(result).toBe(globalProvider);
115
+ expect(findSpy).toHaveBeenCalledTimes(1);
116
+ const query: Query<LlmProvider> = findSpy.mock.calls[0]![0]!.query;
117
+ expect(query["isGlobalLlm"]).toBe(true);
118
+ // Global rows have no projectId — the query must target the null tenant.
119
+ expect(query["projectId"]).not.toBe(projectId);
120
+ });
121
+
122
+ test("returns null when neither a project-owned nor a global provider exists", async () => {
123
+ jest
124
+ .spyOn(LlmProviderService, "getProjectOwnedLlmProvider")
125
+ .mockResolvedValue(null);
126
+ jest.spyOn(LlmProviderService, "findOneBy").mockResolvedValue(null);
127
+
128
+ expect(
129
+ await LlmProviderService.getLlmProviderForMeteredAgentPath(projectId),
130
+ ).toBeNull();
131
+ });
132
+ });
@@ -0,0 +1,405 @@
1
+ import TelemetryExceptionService, {
2
+ AIFixReadiness,
3
+ AIFixReadinessCheck,
4
+ } from "../../../Server/Services/TelemetryExceptionService";
5
+ import FixRunBudget from "../../../Server/Utils/AI/CodeFix/FixRunBudget";
6
+ import LlmProviderService from "../../../Server/Services/LlmProviderService";
7
+ import ProjectService from "../../../Server/Services/ProjectService";
8
+ import ServiceService from "../../../Server/Services/ServiceService";
9
+ import CodeRepositoryService from "../../../Server/Services/CodeRepositoryService";
10
+ import AIAgentService from "../../../Server/Services/AIAgentService";
11
+ import { RepoResolution } from "../../../Server/Utils/CodeRepository/StackTraceRepoResolver";
12
+ import TelemetryException from "../../../Models/DatabaseModels/TelemetryException";
13
+ import TelemetryService from "../../../Models/DatabaseModels/Service";
14
+ import LlmProvider from "../../../Models/DatabaseModels/LlmProvider";
15
+ import Project from "../../../Models/DatabaseModels/Project";
16
+ import AIAgent, {
17
+ AIAgentConnectionStatus,
18
+ } from "../../../Models/DatabaseModels/AIAgent";
19
+ import BadDataException from "../../../Types/Exception/BadDataException";
20
+ import ObjectID from "../../../Types/ObjectID";
21
+ import OneUptimeDate from "../../../Types/Date";
22
+ import { describe, expect, test, afterEach } from "@jest/globals";
23
+
24
+ /*
25
+ * "Fix with AI Agent" readiness: every prerequisite is checked BEFORE a task
26
+ * is created. Since the runtime-resolution change there are exactly three
27
+ * checks — LLM provider (project-owned preferred, metered global fallback —
28
+ * agent completions are server-mediated), repository RESOLVED (stack-trace
29
+ * matching with fallbacks, no Service Catalog prerequisite), agent online.
30
+ * These tests mock the persistence layer and lock in each check's fail
31
+ * condition and the fail-early behaviour of task creation.
32
+ */
33
+
34
+ const projectId: ObjectID = ObjectID.generate();
35
+ const exceptionId: ObjectID = ObjectID.generate();
36
+ const serviceId: ObjectID = ObjectID.generate();
37
+
38
+ function fakeException(): TelemetryException {
39
+ return {
40
+ id: exceptionId,
41
+ projectId: projectId,
42
+ primaryEntityId: serviceId,
43
+ stackTrace: "at charge (/app/src/billing/charge.ts:12:5)",
44
+ } as unknown as TelemetryException;
45
+ }
46
+
47
+ function fakeResolution(): RepoResolution {
48
+ return {
49
+ codeRepositoryId: ObjectID.generate().toString(),
50
+ organizationName: "acme",
51
+ repositoryName: "checkout",
52
+ servicePathInRepository: null,
53
+ method: "stack-trace",
54
+ evidence: "Matched src/billing/charge.ts in acme/checkout",
55
+ };
56
+ }
57
+
58
+ function fakeAgent(data: {
59
+ connectionStatus?: AIAgentConnectionStatus;
60
+ lastAlive?: Date;
61
+ }): AIAgent {
62
+ return {
63
+ id: ObjectID.generate(),
64
+ name: "agent",
65
+ connectionStatus: data.connectionStatus,
66
+ lastAlive: data.lastAlive,
67
+ } as unknown as AIAgent;
68
+ }
69
+
70
+ interface ReadinessMocks {
71
+ provider?: LlmProvider | null;
72
+ resolution?: RepoResolution | null;
73
+ resolutionThrows?: Error;
74
+ agent?: AIAgent | null;
75
+ }
76
+
77
+ function mockReadiness(data: ReadinessMocks): void {
78
+ jest
79
+ .spyOn(TelemetryExceptionService, "findOneById")
80
+ .mockResolvedValue(fakeException());
81
+ jest
82
+ .spyOn(LlmProviderService, "getLlmProviderForMeteredAgentPath")
83
+ .mockResolvedValue(
84
+ data.provider === undefined
85
+ ? ({ id: ObjectID.generate(), name: "BYO" } as unknown as LlmProvider)
86
+ : data.provider,
87
+ );
88
+ jest.spyOn(ServiceService, "findOneById").mockResolvedValue({
89
+ id: serviceId,
90
+ name: "checkout",
91
+ } as unknown as TelemetryService);
92
+
93
+ const resolutionSpy: jest.SpiedFunction<
94
+ typeof CodeRepositoryService.resolveRepositoryForException
95
+ > = jest.spyOn(CodeRepositoryService, "resolveRepositoryForException");
96
+
97
+ if (data.resolutionThrows) {
98
+ resolutionSpy.mockRejectedValue(data.resolutionThrows);
99
+ } else {
100
+ resolutionSpy.mockResolvedValue(
101
+ data.resolution === undefined ? fakeResolution() : data.resolution,
102
+ );
103
+ }
104
+
105
+ jest
106
+ .spyOn(AIAgentService, "getAIAgentForProject")
107
+ .mockResolvedValue(
108
+ data.agent === undefined
109
+ ? fakeAgent({ connectionStatus: AIAgentConnectionStatus.Connected })
110
+ : data.agent,
111
+ );
112
+ }
113
+
114
+ function getCheck(readiness: AIFixReadiness, id: string): AIFixReadinessCheck {
115
+ const check: AIFixReadinessCheck | undefined = readiness.checks.find(
116
+ (item: AIFixReadinessCheck) => {
117
+ return item.id === id;
118
+ },
119
+ );
120
+ expect(check).toBeDefined();
121
+ return check!;
122
+ }
123
+
124
+ describe("TelemetryExceptionService.getAIFixReadiness", () => {
125
+ afterEach(() => {
126
+ jest.restoreAllMocks();
127
+ });
128
+
129
+ test("is ready with provider, resolved repository, and alive agent — exactly three checks", async () => {
130
+ mockReadiness({});
131
+
132
+ const readiness: AIFixReadiness =
133
+ await TelemetryExceptionService.getAIFixReadiness({
134
+ telemetryExceptionId: exceptionId,
135
+ props: { isRoot: true },
136
+ });
137
+
138
+ expect(readiness.ready).toBe(true);
139
+ expect(readiness.checks).toHaveLength(3);
140
+ for (const check of readiness.checks) {
141
+ expect(check.ok).toBe(true);
142
+ }
143
+ });
144
+
145
+ test("resolved repository is named in the check title as evidence", async () => {
146
+ mockReadiness({});
147
+
148
+ const readiness: AIFixReadiness =
149
+ await TelemetryExceptionService.getAIFixReadiness({
150
+ telemetryExceptionId: exceptionId,
151
+ props: { isRoot: true },
152
+ });
153
+
154
+ expect(getCheck(readiness, "repositoryResolved").title).toContain(
155
+ "acme/checkout",
156
+ );
157
+ });
158
+
159
+ test("fails llmProvider check when no provider is available", async () => {
160
+ mockReadiness({ provider: null });
161
+
162
+ const readiness: AIFixReadiness =
163
+ await TelemetryExceptionService.getAIFixReadiness({
164
+ telemetryExceptionId: exceptionId,
165
+ props: { isRoot: true },
166
+ });
167
+
168
+ expect(readiness.ready).toBe(false);
169
+ const check: AIFixReadinessCheck = getCheck(readiness, "llmProvider");
170
+ expect(check.ok).toBe(false);
171
+ expect(check.detail).toContain("LLM Providers");
172
+ });
173
+
174
+ test("fails repositoryResolved check when nothing resolves", async () => {
175
+ mockReadiness({ resolution: null });
176
+
177
+ const readiness: AIFixReadiness =
178
+ await TelemetryExceptionService.getAIFixReadiness({
179
+ telemetryExceptionId: exceptionId,
180
+ props: { isRoot: true },
181
+ });
182
+
183
+ expect(readiness.ready).toBe(false);
184
+ const check: AIFixReadinessCheck = getCheck(
185
+ readiness,
186
+ "repositoryResolved",
187
+ );
188
+ expect(check.ok).toBe(false);
189
+ expect(check.detail).toContain("GitHub App");
190
+ });
191
+
192
+ test("resolver failure fails the check with the error surfaced, not a crash", async () => {
193
+ mockReadiness({ resolutionThrows: new Error("GitHub API rate limited") });
194
+
195
+ const readiness: AIFixReadiness =
196
+ await TelemetryExceptionService.getAIFixReadiness({
197
+ telemetryExceptionId: exceptionId,
198
+ props: { isRoot: true },
199
+ });
200
+
201
+ expect(readiness.ready).toBe(false);
202
+ const check: AIFixReadinessCheck = getCheck(
203
+ readiness,
204
+ "repositoryResolved",
205
+ );
206
+ expect(check.ok).toBe(false);
207
+ expect(check.detail).toContain("GitHub API rate limited");
208
+ });
209
+
210
+ test("fails agent check when the only agent has a stale heartbeat", async () => {
211
+ mockReadiness({
212
+ agent: fakeAgent({
213
+ connectionStatus: AIAgentConnectionStatus.Disconnected,
214
+ lastAlive: OneUptimeDate.getSomeMinutesAgo(10),
215
+ }),
216
+ });
217
+
218
+ const readiness: AIFixReadiness =
219
+ await TelemetryExceptionService.getAIFixReadiness({
220
+ telemetryExceptionId: exceptionId,
221
+ props: { isRoot: true },
222
+ });
223
+
224
+ expect(readiness.ready).toBe(false);
225
+ const check: AIFixReadinessCheck = getCheck(readiness, "agentAvailable");
226
+ expect(check.ok).toBe(false);
227
+ expect(check.detail).toContain("has not reported in");
228
+ });
229
+ });
230
+
231
+ /*
232
+ * The llmProvider check must model PAYABILITY, not just existence: on cloud
233
+ * a COSTED global provider bills the project's AI balance per completion
234
+ * (AIService.executeWithLogging), so a zero balance would pass a
235
+ * presence-only readiness check and then fail the run at its first LLM
236
+ * call — the exact fail-late mode readiness exists to prevent. Project-owned
237
+ * and free-global providers consume no balance and must never require one.
238
+ */
239
+ describe("TelemetryExceptionService.getAIFixReadiness — AI balance gate", () => {
240
+ afterEach(() => {
241
+ jest.restoreAllMocks();
242
+ });
243
+
244
+ function costedGlobalProvider(): LlmProvider {
245
+ return {
246
+ id: ObjectID.generate(),
247
+ name: "OneUptime Hosted",
248
+ isGlobalLlm: true,
249
+ costPerMillionTokensInUSDCents: 300,
250
+ } as unknown as LlmProvider;
251
+ }
252
+
253
+ function mockProjectBalance(balanceInUSDCents: number): void {
254
+ jest.spyOn(ProjectService, "findOneById").mockResolvedValue({
255
+ aiCurrentBalanceInUSDCents: balanceInUSDCents,
256
+ } as unknown as Project);
257
+ }
258
+
259
+ test("cloud + costed global provider + zero balance: fails with recharge guidance", async () => {
260
+ mockReadiness({ provider: costedGlobalProvider() });
261
+ mockProjectBalance(0);
262
+
263
+ const readiness: AIFixReadiness =
264
+ await TelemetryExceptionService.getAIFixReadiness({
265
+ telemetryExceptionId: exceptionId,
266
+ props: { isRoot: true },
267
+ billingEnabled: true,
268
+ });
269
+
270
+ expect(readiness.ready).toBe(false);
271
+ const check: AIFixReadinessCheck = getCheck(readiness, "llmProvider");
272
+ expect(check.ok).toBe(false);
273
+ expect(check.detail).toContain("AI Credits");
274
+ });
275
+
276
+ test("cloud + costed global provider + positive balance: ready", async () => {
277
+ mockReadiness({ provider: costedGlobalProvider() });
278
+ mockProjectBalance(500);
279
+
280
+ const readiness: AIFixReadiness =
281
+ await TelemetryExceptionService.getAIFixReadiness({
282
+ telemetryExceptionId: exceptionId,
283
+ props: { isRoot: true },
284
+ billingEnabled: true,
285
+ });
286
+
287
+ expect(getCheck(readiness, "llmProvider").ok).toBe(true);
288
+ expect(readiness.ready).toBe(true);
289
+ });
290
+
291
+ test("a FREE global provider needs no balance — the project is never queried", async () => {
292
+ mockReadiness({
293
+ provider: {
294
+ id: ObjectID.generate(),
295
+ name: "Hosted free",
296
+ isGlobalLlm: true,
297
+ costPerMillionTokensInUSDCents: 0,
298
+ } as unknown as LlmProvider,
299
+ });
300
+ const projectSpy: jest.SpiedFunction<typeof ProjectService.findOneById> =
301
+ jest.spyOn(ProjectService, "findOneById");
302
+
303
+ const readiness: AIFixReadiness =
304
+ await TelemetryExceptionService.getAIFixReadiness({
305
+ telemetryExceptionId: exceptionId,
306
+ props: { isRoot: true },
307
+ billingEnabled: true,
308
+ });
309
+
310
+ expect(getCheck(readiness, "llmProvider").ok).toBe(true);
311
+ expect(projectSpy).not.toHaveBeenCalled();
312
+ });
313
+
314
+ test("self-host (billing disabled): a costed global provider needs no balance", async () => {
315
+ mockReadiness({ provider: costedGlobalProvider() });
316
+ const projectSpy: jest.SpiedFunction<typeof ProjectService.findOneById> =
317
+ jest.spyOn(ProjectService, "findOneById");
318
+
319
+ const readiness: AIFixReadiness =
320
+ await TelemetryExceptionService.getAIFixReadiness({
321
+ telemetryExceptionId: exceptionId,
322
+ props: { isRoot: true },
323
+ billingEnabled: false,
324
+ });
325
+
326
+ expect(getCheck(readiness, "llmProvider").ok).toBe(true);
327
+ expect(projectSpy).not.toHaveBeenCalled();
328
+ });
329
+
330
+ test("project-owned provider on cloud: no balance requirement", async () => {
331
+ // The default mockReadiness fixture is a BYO (project-owned) provider.
332
+ mockReadiness({});
333
+ const projectSpy: jest.SpiedFunction<typeof ProjectService.findOneById> =
334
+ jest.spyOn(ProjectService, "findOneById");
335
+
336
+ const readiness: AIFixReadiness =
337
+ await TelemetryExceptionService.getAIFixReadiness({
338
+ telemetryExceptionId: exceptionId,
339
+ props: { isRoot: true },
340
+ billingEnabled: true,
341
+ });
342
+
343
+ expect(getCheck(readiness, "llmProvider").ok).toBe(true);
344
+ expect(projectSpy).not.toHaveBeenCalled();
345
+ });
346
+ });
347
+
348
+ describe("TelemetryExceptionService.createCodeFixRunForException fail-early", () => {
349
+ afterEach(() => {
350
+ jest.restoreAllMocks();
351
+ });
352
+
353
+ test("rejects with every missing prerequisite named, before any run is created", async () => {
354
+ mockReadiness({ provider: null, agent: null });
355
+
356
+ // The daily fix-run budget has its own suite (FixRunBudget.test.ts).
357
+ jest.spyOn(FixRunBudget, "assertWithinBudget").mockResolvedValue();
358
+
359
+ await expect(
360
+ TelemetryExceptionService.createCodeFixRunForException({
361
+ telemetryExceptionId: exceptionId,
362
+ props: { isRoot: true },
363
+ }),
364
+ ).rejects.toThrow(BadDataException);
365
+
366
+ await expect(
367
+ TelemetryExceptionService.createCodeFixRunForException({
368
+ telemetryExceptionId: exceptionId,
369
+ props: { isRoot: true },
370
+ }),
371
+ ).rejects.toThrow(
372
+ /LLM provider.*AI agent online|AI agent online.*LLM provider/,
373
+ );
374
+ });
375
+ });
376
+
377
+ describe("AIAgentService.isAgentAlive", () => {
378
+ test("alive on Connected status regardless of lastAlive", () => {
379
+ expect(
380
+ AIAgentService.isAgentAlive(
381
+ fakeAgent({ connectionStatus: AIAgentConnectionStatus.Connected }),
382
+ ),
383
+ ).toBe(true);
384
+ });
385
+
386
+ test("alive on a heartbeat within five minutes", () => {
387
+ expect(
388
+ AIAgentService.isAgentAlive(
389
+ fakeAgent({ lastAlive: OneUptimeDate.getCurrentDate() }),
390
+ ),
391
+ ).toBe(true);
392
+ });
393
+
394
+ test("dead with a stale heartbeat and no Connected status", () => {
395
+ expect(
396
+ AIAgentService.isAgentAlive(
397
+ fakeAgent({ lastAlive: OneUptimeDate.getSomeMinutesAgo(10) }),
398
+ ),
399
+ ).toBe(false);
400
+ });
401
+
402
+ test("dead with no heartbeat at all", () => {
403
+ expect(AIAgentService.isAgentAlive(fakeAgent({}))).toBe(false);
404
+ });
405
+ });