@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,77 @@
1
+ import {
2
+ PerformanceCodeLocation,
3
+ PerformanceFinding,
4
+ } from "./CodeFixTaskContext";
5
+
6
+ /*
7
+ * The JSON persisted on AIInsight.evidence.
8
+ *
9
+ * Evidence is computed DETERMINISTICALLY at detect time and stored verbatim
10
+ * because ClickHouse retention is short — the stored evidence must outlive
11
+ * the raw signals it was computed from (the FixPerformance taskContext
12
+ * precedent: by the time anyone looks, the spans/logs may already be gone).
13
+ * It is rendered in the dashboard and embedded in triage prompts, so every
14
+ * field must carry the real numbers and stand on its own.
15
+ *
16
+ * Exactly one of the per-type sections is set, matching the insight's
17
+ * AIInsightType. These shapes are a wire contract — do not rename
18
+ * fields.
19
+ */
20
+
21
+ // Evidence for NewException and ExceptionSpike insights.
22
+ export interface ExceptionInsightEvidence {
23
+ exceptionMessage?: string | undefined;
24
+ exceptionType?: string | undefined;
25
+ // Occurrences in the recent (spike) window.
26
+ recentOccurrenceCount?: number | undefined;
27
+ // Average hourly occurrences over the prior baseline window.
28
+ baselineHourlyAverage?: number | undefined;
29
+ // recent rate / baseline rate.
30
+ spikeMultiplier?: number | undefined;
31
+ // Lifetime occurrence count of the exception.
32
+ totalOccurrenceCount?: number | undefined;
33
+ // ISO-8601 — when the exception was first ever seen.
34
+ firstSeenAt?: string | undefined;
35
+ }
36
+
37
+ // Evidence for ErrorLogSpike insights.
38
+ export interface LogSpikeInsightEvidence {
39
+ recentErrorCount: number;
40
+ baselineHourlyAverage: number;
41
+ spikeMultiplier: number;
42
+ windowMinutes: number;
43
+ topServices: Array<{ serviceName: string; count: number }>;
44
+ }
45
+
46
+ // Evidence for TraceLatencyRegression insights.
47
+ export interface LatencyInsightEvidence {
48
+ recentP99Ms: number;
49
+ baselineP99Ms: number;
50
+ regressionMultiplier: number;
51
+ operationName?: string | undefined;
52
+ sampleTraceId?: string | undefined;
53
+ // Deterministic span-tree findings drilled from the sample trace.
54
+ performanceFindings?: Array<PerformanceFinding> | undefined;
55
+ // code.* attribute locations for stack-trace-style repo resolution.
56
+ codeLocations?: Array<PerformanceCodeLocation> | undefined;
57
+ }
58
+
59
+ // Evidence for MetricDrift insights (week-over-week mean comparison).
60
+ export interface MetricDriftInsightEvidence {
61
+ metricName: string;
62
+ primaryEntityId?: string | undefined;
63
+ recentWeekMean: number;
64
+ priorWeekMean: number;
65
+ relativeChangePercent: number;
66
+ recentSampleCount: number;
67
+ priorSampleCount: number;
68
+ }
69
+
70
+ export interface AIInsightEvidence {
71
+ exception?: ExceptionInsightEvidence | undefined;
72
+ logSpike?: LogSpikeInsightEvidence | undefined;
73
+ latency?: LatencyInsightEvidence | undefined;
74
+ metricDrift?: MetricDriftInsightEvidence | undefined;
75
+ }
76
+
77
+ export default AIInsightEvidence;
@@ -0,0 +1,15 @@
1
+ /*
2
+ * The one-click human verdict on a AIInsight. This IS the G11
3
+ * precision measurement: confirm/dismiss rates per insight type tell us how
4
+ * precise each deterministic detector is in the field. Stored on
5
+ * AIInsight.humanVerdict, so these strings are a wire contract — do
6
+ * not rename them.
7
+ */
8
+ enum AIInsightHumanVerdict {
9
+ // A human confirmed the insight was real and worth surfacing.
10
+ Confirmed = "Confirmed",
11
+ // A human dismissed the insight as noise/not actionable.
12
+ Dismissed = "Dismissed",
13
+ }
14
+
15
+ export default AIInsightHumanVerdict;
@@ -0,0 +1,13 @@
1
+ /*
2
+ * How urgent a AIInsight is, assigned deterministically by the
3
+ * detector that produced it (e.g. by spike/regression multiplier). Stored
4
+ * on AIInsight.severity and rendered/filtered in the dashboard, so
5
+ * these strings are a wire contract — do not rename them.
6
+ */
7
+ enum AIInsightSeverity {
8
+ High = "High",
9
+ Medium = "Medium",
10
+ Low = "Low",
11
+ }
12
+
13
+ export default AIInsightSeverity;
@@ -0,0 +1,38 @@
1
+ /*
2
+ * Lifecycle of a AIInsight. Stored on AIInsight.status and
3
+ * filtered on in the dashboard, so these strings are a wire contract — do
4
+ * not rename them.
5
+ *
6
+ * Detected is the defensive initial state — the scanner routes every newly
7
+ * created insight to ActionRequired or FixOpened in the same tick, so a row
8
+ * only stays Detected if routing crashed mid-scan. Resolved and Dismissed
9
+ * are human actions (the terminal states).
10
+ */
11
+ enum AIInsightStatus {
12
+ // Just created by a detector; routed onward in the same scanner tick.
13
+ Detected = "Detected",
14
+ // Waiting on a human: no automatic fix was opened for this insight.
15
+ ActionRequired = "ActionRequired",
16
+ // An AI fix task was queued for this insight (see fixAiRunId).
17
+ FixOpened = "FixOpened",
18
+ // A human marked the insight as handled. Terminal.
19
+ Resolved = "Resolved",
20
+ // A human dismissed the insight as noise/not actionable. Terminal.
21
+ Dismissed = "Dismissed",
22
+ }
23
+
24
+ export default AIInsightStatus;
25
+
26
+ export class AIInsightStatusHelper {
27
+ /*
28
+ * Terminal = Resolved | Dismissed — the two human end states. The scanner
29
+ * only refreshes (dedupes into) NON-terminal insights; a terminal insight
30
+ * is never reopened by a detector.
31
+ */
32
+ public static isTerminalStatus(status: AIInsightStatus): boolean {
33
+ return (
34
+ status === AIInsightStatus.Resolved ||
35
+ status === AIInsightStatus.Dismissed
36
+ );
37
+ }
38
+ }
@@ -0,0 +1,41 @@
1
+ /*
2
+ * Which deterministic AI detector produced an insight. Detectors are
3
+ * statistical sensors over the project's telemetry — no LLM is involved in
4
+ * detection. These strings are stored on AIInsight.insightType and
5
+ * rendered/filtered in the dashboard, so they are a wire contract — do not
6
+ * rename them.
7
+ */
8
+ enum AIInsightType {
9
+ /*
10
+ * A telemetry exception first seen within the last 24 hours that is
11
+ * already recurring (not resolved, not archived) — a brand-new failure
12
+ * mode in the code.
13
+ */
14
+ NewException = "NewException",
15
+ /*
16
+ * An established telemetry exception whose recent hourly occurrence rate
17
+ * spiked well above its own 24-hour baseline (including dormant
18
+ * exceptions suddenly waking up).
19
+ */
20
+ ExceptionSpike = "ExceptionSpike",
21
+ /*
22
+ * The project's Error/Fatal log volume in the last hour spiked well above
23
+ * its average hourly rate over the prior 24 hours, attributed to the top
24
+ * contributing services.
25
+ */
26
+ ErrorLogSpike = "ErrorLogSpike",
27
+ /*
28
+ * A service's recent p99 span latency regressed to a multiple of its own
29
+ * 24-hour baseline, with span-tree findings drilled from a representative
30
+ * slow trace.
31
+ */
32
+ TraceLatencyRegression = "TraceLatencyRegression",
33
+ /*
34
+ * A metric's mean over the last 7 days drifted substantially from its
35
+ * mean over the prior 7 days (week-over-week comparison per metric name
36
+ * and entity).
37
+ */
38
+ MetricDrift = "MetricDrift",
39
+ }
40
+
41
+ export default AIInsightType;
@@ -0,0 +1,18 @@
1
+ /*
2
+ * The automatic grade assigned to a completed AI investigation when its
3
+ * incident resolves with a human-recorded root cause (Phase 2 measurement
4
+ * layer): one constrained LLM call compares the investigation's posted
5
+ * analysis with Incident.rootCause and stores the verdict on the run
6
+ * (AIRun.autoGrade). See
7
+ * Common/Server/Utils/AI/SRE/InvestigationGrader.ts.
8
+ */
9
+ enum AIRunAutoGrade {
10
+ // The analysis identified the same root cause the humans recorded.
11
+ Match = "Match",
12
+ // Part of the cause, or a closely related cause.
13
+ Partial = "Partial",
14
+ // The analysis pointed somewhere else.
15
+ Mismatch = "Mismatch",
16
+ }
17
+
18
+ export default AIRunAutoGrade;
@@ -10,6 +10,11 @@ enum AIRunEventType {
10
10
  // A mutating action the user approved was executed (or denied and skipped).
11
11
  ActionExecuted = "ActionExecuted",
12
12
  ActionDenied = "ActionDenied",
13
+ /*
14
+ * A plain progress/log line reported by an external executor (e.g. the
15
+ * code-fix agent container). The message lives in resultSummary.message.
16
+ */
17
+ ProgressLog = "ProgressLog",
13
18
  RunCompleted = "RunCompleted",
14
19
  RunFailed = "RunFailed",
15
20
  }
@@ -0,0 +1,17 @@
1
+ /*
2
+ * The one-click human verdict on a completed AI investigation's posted
3
+ * analysis (Phase 2 measurement layer). Captured via
4
+ * POST /ai-investigation/verdict from the investigation panel and stored on
5
+ * the run (AIRun.humanVerdict).
6
+ *
7
+ * The roadmap's "confirmed/edited/rejected" trichotomy is deliberately a
8
+ * two-button UI: "edited" is not something a human declares up front — it is
9
+ * detected later by the grading side (comparing the analysis with the final
10
+ * recorded root cause), so the human control stays a binary confirm/reject.
11
+ */
12
+ enum AIRunHumanVerdict {
13
+ Confirmed = "Confirmed",
14
+ Rejected = "Rejected",
15
+ }
16
+
17
+ export default AIRunHumanVerdict;
@@ -1,6 +1,12 @@
1
1
  enum AIRunType {
2
2
  Chat = "Chat",
3
3
  Investigation = "Investigation",
4
+ /*
5
+ * An exception-fix run executed by an external AI agent container: it
6
+ * claims the run over HTTP, works in the project's code repository and
7
+ * opens a pull request. Replaces the legacy AIAgentTask substrate.
8
+ */
9
+ CodeFix = "CodeFix",
4
10
  }
5
11
 
6
12
  export default AIRunType;
@@ -0,0 +1,88 @@
1
+ /*
2
+ * The JSON persisted on AIRun.taskContext for CodeFix recipes whose entire
3
+ * working context is captured at trigger time rather than referenced by a
4
+ * subject id (incident/alert) or a telemetry exception.
5
+ *
6
+ * First user: the FixPerformance recipe. Its evidence is computed
7
+ * DETERMINISTICALLY from a trace's span tree when the user clicks "Fix
8
+ * performance with AI" (see Common/Server/Utils/AI/PerfEvidence/
9
+ * SpanTreeAnalyzer.ts) and stored here verbatim — ClickHouse span retention
10
+ * is short, so by the time the agent worker claims the run the spans may
11
+ * already be gone. The stored findings ARE the task's context.
12
+ *
13
+ * These shapes are a wire contract with the agent worker
14
+ * (/ai-agent-data/get-instrumentation-task-details serves them back) — do
15
+ * not rename fields.
16
+ */
17
+
18
+ export enum PerformanceFindingType {
19
+ // >=5 near-identical sibling spans under one parent (classic N+1).
20
+ NPlusOneQuery = "NPlusOneQuery",
21
+ // A single span whose self time is >=60% of the trace's total duration.
22
+ DominantSpan = "DominantSpan",
23
+ /*
24
+ * >=3 same-name siblings executing strictly one-after-another whose
25
+ * combined duration is >=50% of their parent — parallelizable work.
26
+ */
27
+ SequentialSiblings = "SequentialSiblings",
28
+ }
29
+
30
+ // One span a finding implicates — enough to name it in evidence and PRs.
31
+ export interface ImplicatedSpan {
32
+ spanId: string;
33
+ name: string;
34
+ durationMs: number;
35
+ }
36
+
37
+ /*
38
+ * One deterministic performance finding. `evidence` is the human-readable
39
+ * proof (real counts, durations, normalized names/statements) — it is
40
+ * embedded verbatim in the agent prompt and the pull request body, so it
41
+ * must stand on its own.
42
+ */
43
+ export interface PerformanceFinding {
44
+ findingType: PerformanceFindingType;
45
+ // One-line summary, e.g. 'N+1: 27× "SELECT users" under "GET /orders"'.
46
+ headline: string;
47
+ // Multi-line human-readable proof with the real numbers.
48
+ evidence: string;
49
+ spanCount: number;
50
+ combinedDurationMs: number;
51
+ traceDurationMs: number;
52
+ percentOfTrace: number;
53
+ // Only for SequentialSiblings: combined duration as a share of the parent.
54
+ percentOfParent?: number | undefined;
55
+ normalizedSpanName: string;
56
+ parentSpanName?: string | undefined;
57
+ // Normalized db.statement when the implicated spans carry one.
58
+ normalizedDbStatement?: string | undefined;
59
+ dbSystem?: string | undefined;
60
+ httpUrl?: string | undefined;
61
+ // Capped sample of the implicated spans (name + duration).
62
+ implicatedSpans: Array<ImplicatedSpan>;
63
+ }
64
+
65
+ /*
66
+ * A code location plucked from the implicated spans' code.* attributes
67
+ * (code.filepath / code.function / code.lineno and their newer semconv
68
+ * spellings). Feeds the stack-trace-style repository resolution at
69
+ * task-details time.
70
+ */
71
+ export interface PerformanceCodeLocation {
72
+ filePath: string;
73
+ functionName?: string | undefined;
74
+ lineNumber?: number | undefined;
75
+ }
76
+
77
+ export interface CodeFixTaskContext {
78
+ // FixPerformance: the analyzed trace.
79
+ traceId?: string | undefined;
80
+ // Best-effort service attribution resolved from the trace's spans.
81
+ serviceName?: string | undefined;
82
+ // The deterministic span-tree findings — the recipe's entire evidence.
83
+ performanceFindings?: Array<PerformanceFinding> | undefined;
84
+ // code.* attribute locations for stack-trace-style repo resolution.
85
+ codeLocations?: Array<PerformanceCodeLocation> | undefined;
86
+ }
87
+
88
+ export default CodeFixTaskContext;
@@ -0,0 +1,132 @@
1
+ /*
2
+ * Which task recipe a CodeFix AIRun executes. The agent worker dispatches on
3
+ * this value (returned as `taskType` by /ai-agent-task/get-pending-task), so
4
+ * these strings are a wire contract — do not rename them.
5
+ *
6
+ * A null AIRun.codeFixTaskType column means FixException: every CodeFix run
7
+ * created before the column existed was an exception fix. Server responses
8
+ * normalize null to FixException so clients never see the legacy null.
9
+ */
10
+ enum CodeFixTaskType {
11
+ // Analyze an exception's stack trace and open a PR that fixes the bug.
12
+ FixException = "FixException",
13
+ // Write a failing-then-passing regression test that reproduces the exception.
14
+ WriteRegressionTest = "WriteRegressionTest",
15
+ /*
16
+ * Add the observability an INCONCLUSIVE AI investigation was missing
17
+ * (structured logs, spans, metric counters on the implicated code paths).
18
+ * NOT user-triggerable from the exception page — it has its own automatic
19
+ * trigger: an inconclusive investigation on a project that opted in via
20
+ * Project.enableInstrumentationFixTasks (see Common/Server/Utils/AI/
21
+ * AI/InstrumentationTaskTrigger.ts). Its subject is the triggering
22
+ * incident/alert, NOT a telemetry exception.
23
+ */
24
+ ImproveInstrumentation = "ImproveInstrumentation",
25
+ /*
26
+ * Fix a deterministically-detected performance pattern in a trace (N+1
27
+ * queries, one dominant slow span, sequential-that-could-be-parallel
28
+ * siblings). Human-triggered from the trace view (POST /ai-investigation/
29
+ * create-performance-fix-task), NOT from the exception page: it has no
30
+ * subject row at all — its entire context (the SpanTreeAnalyzer findings)
31
+ * is captured at trigger time into AIRun.taskContext (see
32
+ * Common/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.ts).
33
+ */
34
+ FixPerformance = "FixPerformance",
35
+ /*
36
+ * Fix the root cause a completed AI investigation identified. Human-
37
+ * triggered from the investigation panel (POST /ai-investigation/
38
+ * create-fix-task), NOT from the exception page: its subject is the
39
+ * investigated incident/alert, and its context is the posted analysis (see
40
+ * Common/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts).
41
+ */
42
+ FixFromIncident = "FixFromIncident",
43
+ }
44
+
45
+ export default CodeFixTaskType;
46
+
47
+ /*
48
+ * What a queued run of a recipe must CARRY to be executable — the claim
49
+ * guard and the task-details endpoint both group recipes by this, so a new
50
+ * recipe declares its context kind exactly once.
51
+ */
52
+ export enum CodeFixContextKind {
53
+ // Executes against AIRun.triggeredByTelemetryExceptionId.
54
+ TelemetryException = "TelemetryException",
55
+ // Executes against AIRun.triggeredByIncidentId / triggeredByAlertId.
56
+ IncidentOrAlertSubject = "IncidentOrAlertSubject",
57
+ /*
58
+ * Executes against evidence captured at trigger time into
59
+ * AIRun.taskContext (FixPerformance: traceId + span-tree findings) — no
60
+ * subject row exists at all.
61
+ */
62
+ TaskContext = "TaskContext",
63
+ }
64
+
65
+ export class CodeFixTaskTypeHelper {
66
+ /*
67
+ * The recipes a user may start today FROM THE EXCEPTION PAGE. Recipes
68
+ * outside this list exist as enum values so the worker/UI can already
69
+ * dispatch on them, but creation via the exception-page endpoint is
70
+ * server-rejected. ImproveInstrumentation, FixFromIncident and
71
+ * FixPerformance stay off this list by design — they are not
72
+ * exception-triggered at all: ImproveInstrumentation's trigger is an
73
+ * inconclusive AI investigation on an opted-in project,
74
+ * FixFromIncident is user-triggered from the investigation panel
75
+ * (POST /ai-investigation/create-fix-task), and FixPerformance is
76
+ * user-triggered from the trace view
77
+ * (POST /ai-investigation/create-performance-fix-task).
78
+ */
79
+ public static getUserTriggerableTaskTypes(): Array<CodeFixTaskType> {
80
+ return [CodeFixTaskType.FixException, CodeFixTaskType.WriteRegressionTest];
81
+ }
82
+
83
+ public static isUserTriggerable(taskType: CodeFixTaskType): boolean {
84
+ return this.getUserTriggerableTaskTypes().includes(taskType);
85
+ }
86
+
87
+ /*
88
+ * Which context record a queued run of this recipe must carry to be
89
+ * executable. The claim guard rejects runs missing their kind's record,
90
+ * and the task-details endpoint dispatches its response shape on it.
91
+ * Unlisted (and legacy-null-normalized) recipes are exception-based —
92
+ * the safe default, since an exception-less claim of one is unexecutable.
93
+ */
94
+ public static getContextKind(taskType: CodeFixTaskType): CodeFixContextKind {
95
+ switch (taskType) {
96
+ case CodeFixTaskType.ImproveInstrumentation:
97
+ case CodeFixTaskType.FixFromIncident:
98
+ return CodeFixContextKind.IncidentOrAlertSubject;
99
+ case CodeFixTaskType.FixPerformance:
100
+ return CodeFixContextKind.TaskContext;
101
+ default:
102
+ return CodeFixContextKind.TelemetryException;
103
+ }
104
+ }
105
+
106
+ /*
107
+ * Whether the recipe executes against a telemetry exception
108
+ * (AIRun.triggeredByTelemetryExceptionId). Kept as sugar over
109
+ * getContextKind — the claim guard and the task-details endpoint now
110
+ * dispatch on the full context kind.
111
+ */
112
+ public static requiresTelemetryException(taskType: CodeFixTaskType): boolean {
113
+ return (
114
+ this.getContextKind(taskType) === CodeFixContextKind.TelemetryException
115
+ );
116
+ }
117
+
118
+ public static isValidTaskType(value: string): value is CodeFixTaskType {
119
+ return Object.values(CodeFixTaskType).includes(value as CodeFixTaskType);
120
+ }
121
+
122
+ // Null means FixException: rows created before the column existed.
123
+ public static fromDatabaseValue(
124
+ value: CodeFixTaskType | string | null | undefined,
125
+ ): CodeFixTaskType {
126
+ if (value && this.isValidTaskType(value.toString())) {
127
+ return value as CodeFixTaskType;
128
+ }
129
+
130
+ return CodeFixTaskType.FixException;
131
+ }
132
+ }
@@ -0,0 +1,132 @@
1
+ import CodeFixTaskType from "./CodeFixTaskType";
2
+
3
+ /*
4
+ * The rolled-up CI conclusion recorded on an AI fix pull request
5
+ * (AIAgentTaskPullRequest.ciStatus) — B4 Tier 1: verification via the
6
+ * customer's OWN CI on the draft PRs. We read check-run conclusions through
7
+ * the GitHub App; we never re-run or gate the customer's CI.
8
+ *
9
+ * G9 honesty rule: only Green and ExpectedFailureObserved ever count as
10
+ * "CI-verified". NoCiConfigured (and a null column — not yet polled) read as
11
+ * unverified, never verified — a repo without CI verifies nothing.
12
+ */
13
+ enum FixPullRequestCiStatus {
14
+ // Check runs exist and at least one has not completed yet.
15
+ Pending = "Pending",
16
+ // Every check run completed and none failed.
17
+ Green = "Green",
18
+ // Every check run completed and at least one failed.
19
+ Red = "Red",
20
+ /*
21
+ * A WriteRegressionTest PR whose checks concluded RED: the PR's whole
22
+ * point is a test that SHOULD FAIL until the bug is fixed, so a failing
23
+ * check is the desired signal, not a defect. Honest caveat: at check-run
24
+ * granularity we cannot tell WHICH job failed — a repo whose lint breaks
25
+ * on the PR also reads as expected-failure. Job-level discrimination
26
+ * (inspecting check names) is a tracked Tier 1 residual in the roadmap.
27
+ */
28
+ ExpectedFailureObserved = "ExpectedFailureObserved",
29
+ /*
30
+ * The PR's head branch has zero check runs — the repository runs no CI on
31
+ * this PR. Per G9 this is "unverified", never "verified".
32
+ */
33
+ NoCiConfigured = "NoCiConfigured",
34
+ }
35
+
36
+ export default FixPullRequestCiStatus;
37
+
38
+ // Counts of one PR's check runs, as read from GitHub.
39
+ export interface FixPullRequestCiCheckRunCounts {
40
+ total: number;
41
+ completed: number;
42
+ failed: number;
43
+ pending: number;
44
+ }
45
+
46
+ export class FixPullRequestCiStatusHelper {
47
+ /*
48
+ * Roll one PR's check-run counts into a single conclusion. The order is
49
+ * deliberate:
50
+ * 1. no check runs at all -> NoCiConfigured (nothing ran; G9: unverified)
51
+ * 2. any run still pending -> Pending (we report only FINAL
52
+ * conclusions — a failure observed while other checks still run is
53
+ * not yet the branch's conclusion)
54
+ * 3. any completed run failed -> Red
55
+ * 4. otherwise -> Green
56
+ */
57
+ public static rollUpConclusion(
58
+ counts: FixPullRequestCiCheckRunCounts,
59
+ ): FixPullRequestCiStatus {
60
+ if (counts.total === 0) {
61
+ return FixPullRequestCiStatus.NoCiConfigured;
62
+ }
63
+
64
+ if (counts.pending > 0) {
65
+ return FixPullRequestCiStatus.Pending;
66
+ }
67
+
68
+ if (counts.failed > 0) {
69
+ return FixPullRequestCiStatus.Red;
70
+ }
71
+
72
+ return FixPullRequestCiStatus.Green;
73
+ }
74
+
75
+ /*
76
+ * The SHOULD-FAIL rule: a WriteRegressionTest PR exists to prove a bug
77
+ * with a test that fails until the bug is fixed, so a RED conclusion on
78
+ * such a PR is the expected outcome and is recorded as
79
+ * ExpectedFailureObserved. Every other conclusion, and every other task
80
+ * type, passes through unchanged. (Caveat documented on the enum member:
81
+ * we cannot tell which job failed — a broken lint also reads as
82
+ * expected-failure until job-level discrimination ships.)
83
+ */
84
+ public static applyTaskType(data: {
85
+ conclusion: FixPullRequestCiStatus;
86
+ taskType: CodeFixTaskType;
87
+ }): FixPullRequestCiStatus {
88
+ if (
89
+ data.conclusion === FixPullRequestCiStatus.Red &&
90
+ data.taskType === CodeFixTaskType.WriteRegressionTest
91
+ ) {
92
+ return FixPullRequestCiStatus.ExpectedFailureObserved;
93
+ }
94
+
95
+ return data.conclusion;
96
+ }
97
+
98
+ /*
99
+ * The G9 verification predicate, defined ONCE: a PR counts as CI-verified
100
+ * only on Green or ExpectedFailureObserved. NoCiConfigured, Pending, Red
101
+ * and null all read as unverified.
102
+ */
103
+ public static isVerified(
104
+ status: FixPullRequestCiStatus | undefined | null,
105
+ ): boolean {
106
+ return (
107
+ status === FixPullRequestCiStatus.Green ||
108
+ status === FixPullRequestCiStatus.ExpectedFailureObserved
109
+ );
110
+ }
111
+
112
+ // Human-readable line for the run's glass-box ProgressLog trail.
113
+ public static describeForProgressLog(data: {
114
+ ciStatus: FixPullRequestCiStatus;
115
+ counts: FixPullRequestCiCheckRunCounts;
116
+ }): string {
117
+ switch (data.ciStatus) {
118
+ case FixPullRequestCiStatus.Green:
119
+ return `CI on the fix PR: Green (${data.counts.completed}/${data.counts.total} checks passed)`;
120
+ case FixPullRequestCiStatus.Red:
121
+ return `CI on the fix PR: Red (${data.counts.failed}/${data.counts.total} checks failed)`;
122
+ case FixPullRequestCiStatus.ExpectedFailureObserved:
123
+ return `Regression-test PR: expected failure observed (${data.counts.failed}/${data.counts.total} checks failed — a failing check is the desired signal for a should-fail test)`;
124
+ case FixPullRequestCiStatus.Pending:
125
+ return `CI on the fix PR: Pending (${data.counts.completed}/${data.counts.total} checks completed)`;
126
+ case FixPullRequestCiStatus.NoCiConfigured:
127
+ return "CI on the fix PR: no check runs found — the repository runs no CI on this branch, so the fix is unverified";
128
+ default:
129
+ return `CI on the fix PR: ${data.ciStatus}`;
130
+ }
131
+ }
132
+ }
@@ -92,6 +92,73 @@ export class AggregationIntervalUtil {
92
92
  return 1000 * 60;
93
93
  }
94
94
  }
95
+
96
+ /*
97
+ * Floor a timestamp DOWN to the start of its aggregation bucket, matching
98
+ * the server's `toStartOfInterval(time, INTERVAL 1 <interval>)` grid. This
99
+ * lets a chart align its query window to the bucket grid so the leading
100
+ * edge lands on a real bucket boundary instead of mid-bucket — a
101
+ * mid-bucket start renders as an empty gap before the first plotted point
102
+ * (the first bucket is partial and its timestamp falls before the axis
103
+ * origin).
104
+ *
105
+ * Only Minute/Hour/Day are aligned: for those the fixed-ms epoch grid is
106
+ * an EXACT match for ClickHouse's UTC bucketing (epoch-day == UTC
107
+ * midnight), and these are the windows where the leading gap is actually
108
+ * visible. Week/Month/Year snap to calendar boundaries (Monday / 1st /
109
+ * Jan-1) server-side, which a fixed-ms grid can't reproduce, so those (and
110
+ * `Total`) are returned UNCHANGED rather than risk shifting the gap for
111
+ * long windows — their pre-existing behavior is preserved.
112
+ */
113
+ public static floorDateToIntervalGrid(
114
+ date: Date,
115
+ interval: AggregationInterval,
116
+ ): Date {
117
+ const ms: number = OneUptimeDate.fromString(date).getTime();
118
+ const alignableIntervals: Array<AggregationInterval> = [
119
+ AggregationInterval.Minute,
120
+ AggregationInterval.Hour,
121
+ AggregationInterval.Day,
122
+ ];
123
+ if (!alignableIntervals.includes(interval)) {
124
+ return new Date(ms);
125
+ }
126
+ const bucketMs: number = this.getAggregationIntervalMs(interval);
127
+ if (!Number.isFinite(bucketMs) || bucketMs <= 0) {
128
+ return new Date(ms);
129
+ }
130
+ return new Date(Math.floor(ms / bucketMs) * bucketMs);
131
+ }
132
+
133
+ /*
134
+ * Align a query window to the aggregation-bucket grid. The bucket size is
135
+ * derived from the RAW window and returned alongside the aligned dates so
136
+ * the caller can PIN it (AggregateBy.aggregationInterval): flooring the
137
+ * start slightly widens the window, and without pinning that could bump a
138
+ * window sitting exactly on a tier threshold (e.g. a 3h window) into the
139
+ * next-coarser interval and change the whole chart's resolution. The start
140
+ * is floored DOWN so the first bucket is complete and lands on the axis
141
+ * origin (removing the leading gap); the end is left untouched so the
142
+ * latest, still-in-progress bucket and its live data continue to show.
143
+ */
144
+ public static getIntervalAlignedWindow(data: {
145
+ startDate: Date;
146
+ endDate: Date;
147
+ }): {
148
+ startDate: Date;
149
+ endDate: Date;
150
+ interval: AggregationInterval;
151
+ } {
152
+ const interval: AggregationInterval = this.getAggregationIntervalForWindow({
153
+ startDate: data.startDate,
154
+ endDate: data.endDate,
155
+ });
156
+ return {
157
+ startDate: this.floorDateToIntervalGrid(data.startDate, interval),
158
+ endDate: OneUptimeDate.fromString(data.endDate),
159
+ interval,
160
+ };
161
+ }
95
162
  }
96
163
 
97
164
  export default AggregationIntervalUtil;