@oneuptime/common 11.5.3 → 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 (513) 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/Dashboard.ts +3 -3
  6. package/Models/DatabaseModels/GlobalConfig.ts +105 -0
  7. package/Models/DatabaseModels/Index.ts +4 -8
  8. package/Models/DatabaseModels/InstanceHealthLog.ts +277 -0
  9. package/Models/DatabaseModels/LlmLog.ts +33 -0
  10. package/Models/DatabaseModels/Project.ts +123 -6
  11. package/Models/DatabaseModels/Runbook.ts +1 -1
  12. package/Server/API/AIAgentDataAPI.ts +802 -140
  13. package/Server/API/AIAgentTaskAPI.ts +132 -69
  14. package/Server/API/AIAgentTaskLogAPI.ts +65 -41
  15. package/Server/API/AIAgentTaskPullRequestAPI.ts +41 -0
  16. package/Server/API/AIInsightAPI.ts +220 -0
  17. package/Server/API/AIInvestigationAPI.ts +363 -1
  18. package/Server/API/CodeFixRunAPI.ts +251 -0
  19. package/Server/API/GitHubAPI.ts +246 -3
  20. package/Server/API/TelemetryExceptionAPI.ts +193 -48
  21. package/Server/EnvironmentConfig.ts +1 -1
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.ts +26 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.ts +73 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.ts +29 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.ts +31 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.ts +51 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.ts +25 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.ts +47 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.ts +53 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.ts +31 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.ts +37 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.ts +25 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.ts +75 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.ts +37 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.ts +203 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.ts +163 -0
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +30 -0
  38. package/Server/Infrastructure/Queue.ts +82 -4
  39. package/Server/Infrastructure/Semaphore.ts +62 -1
  40. package/Server/Services/AIAgentService.ts +32 -0
  41. package/Server/Services/AIAgentTaskPullRequestService.ts +117 -0
  42. package/Server/Services/AIInsightService.ts +174 -0
  43. package/Server/Services/AIRunEventService.ts +63 -0
  44. package/Server/Services/AIRunService.ts +259 -1
  45. package/Server/Services/AIService.ts +249 -7
  46. package/Server/Services/AlertService.ts +4 -4
  47. package/Server/Services/CodeRepositoryService.ts +209 -0
  48. package/Server/Services/DashboardService.ts +11 -2
  49. package/Server/Services/GlobalConfigService.ts +148 -0
  50. package/Server/Services/IncidentService.ts +183 -38
  51. package/Server/Services/IncidentStateTimelineService.ts +24 -4
  52. package/Server/Services/Index.ts +4 -4
  53. package/Server/Services/{AIAgentTaskLogService.ts → InstanceHealthLogService.ts} +1 -1
  54. package/Server/Services/LlmLogService.ts +27 -0
  55. package/Server/Services/LlmProviderService.ts +108 -0
  56. package/Server/Services/MetricBaselineService.ts +123 -0
  57. package/Server/Services/MonitorService.ts +15 -0
  58. package/Server/Services/TelemetryExceptionService.ts +323 -116
  59. package/Server/Services/TraceAggregationService.ts +176 -0
  60. package/Server/Types/Workflow/ComponentCode.ts +6 -0
  61. package/Server/Types/Workflow/Components/AI/GenerateText.ts +326 -0
  62. package/Server/Types/Workflow/Components/Index.ts +2 -0
  63. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +1 -1
  64. package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +71 -0
  65. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +243 -0
  66. package/Server/Utils/AI/CodeFix/CodeFixRunQueue.ts +131 -0
  67. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +148 -0
  68. package/Server/Utils/AI/CodeFix/OpenPullRequestCap.ts +117 -0
  69. package/Server/Utils/AI/Eval/EvalCorpus.ts +369 -0
  70. package/Server/Utils/AI/Eval/EvalScores.ts +172 -0
  71. package/Server/Utils/AI/Eval/ReplayInvestigation.ts +87 -0
  72. package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +676 -0
  73. package/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.ts → SRE/AIInvestigationEngine.ts} +58 -37
  74. package/Server/Utils/AI/{Sentinel/SentinelMemory.ts → SRE/AIMemory.ts} +3 -3
  75. package/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.ts +50 -20
  76. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +293 -0
  77. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +115 -0
  78. package/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.ts +223 -0
  79. package/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.ts +71 -21
  80. package/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.ts +8 -8
  81. package/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.ts +364 -0
  82. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +317 -0
  83. package/Server/Utils/AI/SRE/Insights/Detectors/Index.ts +27 -0
  84. package/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.ts +221 -0
  85. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +238 -0
  86. package/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.ts +521 -0
  87. package/Server/Utils/AI/SRE/Insights/FixRouting.ts +242 -0
  88. package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +290 -0
  89. package/Server/Utils/AI/SRE/Insights/InsightStore.ts +283 -0
  90. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +242 -0
  91. package/Server/Utils/AI/SRE/Insights/Triage.ts +162 -0
  92. package/Server/Utils/AI/SRE/Insights/Types.ts +49 -0
  93. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +212 -0
  94. package/Server/Utils/AI/SRE/InvestigationGrader.ts +282 -0
  95. package/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.ts +114 -19
  96. package/Server/Utils/AI/{Sentinel → SRE}/README.md +4 -4
  97. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +172 -0
  98. package/Server/Utils/AI/Toolbox/{SentinelActionTools.ts → AIActionTools.ts} +22 -1
  99. package/Server/Utils/AI/Toolbox/Index.ts +2 -2
  100. package/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.ts +526 -0
  101. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +319 -1
  102. package/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.ts +221 -0
  103. package/Server/Utils/CodeRepository/StackTraceRepoResolver.ts +571 -0
  104. package/Server/Utils/Execute.ts +34 -13
  105. package/Server/Utils/LLM/LLMService.ts +160 -30
  106. package/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.ts +152 -0
  107. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +29 -0
  108. package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +225 -0
  109. package/Tests/Server/Infrastructure/Queue.test.ts +227 -0
  110. package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +159 -0
  111. package/Tests/Server/Services/AIAgentTaskPullRequestOutcomeStats.test.ts +154 -0
  112. package/Tests/Server/Services/AIInsightService.test.ts +324 -0
  113. package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +401 -0
  114. package/Tests/Server/Services/AIRunHumanVerdict.test.ts +161 -0
  115. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +95 -5
  116. package/Tests/Server/Services/AIServiceProjectAccess.test.ts +259 -0
  117. package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +249 -0
  118. package/Tests/Server/Services/FixPerformanceTaskTrigger.test.ts +274 -0
  119. package/Tests/Server/Services/GlobalConfigService.test.ts +80 -0
  120. package/Tests/Server/Services/IncidentInternalNoteAnnouncement.test.ts +1 -1
  121. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +313 -0
  122. package/Tests/Server/Services/LlmProviderProjectOwned.test.ts +132 -0
  123. package/Tests/Server/Services/TelemetryExceptionAIFixReadiness.test.ts +405 -0
  124. package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +322 -0
  125. package/Tests/Server/Services/TraceServiceLatencyProfile.test.ts +278 -0
  126. package/Tests/Server/Types/Workflow/Components/AIGenerateText.test.ts +722 -0
  127. package/Tests/Server/Utils/AI/{SentinelAlertGating.test.ts → AIAlertGating.test.ts} +19 -19
  128. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +362 -0
  129. package/Tests/Server/Utils/AI/{SentinelInvestigationQueue.test.ts → AIInvestigationQueue.test.ts} +19 -19
  130. package/Tests/Server/Utils/AI/CodeAgentWorkspaceGuard.test.ts +138 -0
  131. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +335 -0
  132. package/Tests/Server/Utils/AI/CodeFixRunQueue.test.ts +134 -0
  133. package/Tests/Server/Utils/AI/EvalCorpus.test.ts +209 -0
  134. package/Tests/Server/Utils/AI/EvalScores.test.ts +343 -0
  135. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +218 -0
  136. package/Tests/Server/Utils/AI/Insights/ErrorLogSpikeDetector.test.ts +437 -0
  137. package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +287 -0
  138. package/Tests/Server/Utils/AI/Insights/InsightDetectorsIndex.test.ts +34 -0
  139. package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +572 -0
  140. package/Tests/Server/Utils/AI/Insights/InsightNeverThrowsHardening.test.ts +344 -0
  141. package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +720 -0
  142. package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +467 -0
  143. package/Tests/Server/Utils/AI/Insights/InsightStoreHardening.test.ts +370 -0
  144. package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +210 -0
  145. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +221 -0
  146. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +328 -0
  147. package/Tests/Server/Utils/AI/Insights/MetricBaselineDrift.test.ts +182 -0
  148. package/Tests/Server/Utils/AI/Insights/MetricDriftDetector.test.ts +280 -0
  149. package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +259 -0
  150. package/Tests/Server/Utils/AI/Insights/TraceLatencyRegressionDetector.test.ts +770 -0
  151. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +343 -0
  152. package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +307 -0
  153. package/Tests/Server/Utils/AI/OpenPullRequestCap.test.ts +170 -0
  154. package/Tests/Server/Utils/AI/SpanTreeAnalyzer.test.ts +559 -0
  155. package/Tests/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.test.ts +158 -0
  156. package/Tests/Server/Utils/GitHubCheckRunsConclusion.test.ts +100 -0
  157. package/Tests/Server/Utils/GitHubPullRequestStateMapping.test.ts +50 -0
  158. package/Tests/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.test.ts +266 -0
  159. package/Tests/Server/Utils/ServiceRepoLinkSuggester.test.ts +167 -0
  160. package/Tests/Server/Utils/StackTraceRepoResolver.test.ts +527 -0
  161. package/Tests/Types/AI/AIChatPermissionMode.test.ts +112 -0
  162. package/Tests/Types/AI/CodeFixTaskType.test.ts +152 -0
  163. package/Tests/Types/AI/FixPullRequestCiStatus.test.ts +181 -0
  164. package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +110 -0
  165. package/Tests/Types/Monitor/SqlDatabaseType.test.ts +55 -0
  166. package/Tests/Types/Workflow/AIGenerateTextMetadata.test.ts +180 -0
  167. package/Tests/UI/Components/TableBulkCsvExport.test.tsx +168 -0
  168. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +523 -0
  169. package/Types/AI/AIChatTypes.ts +8 -0
  170. package/Types/AI/AIInsightEvidence.ts +77 -0
  171. package/Types/AI/AIInsightHumanVerdict.ts +15 -0
  172. package/Types/AI/AIInsightSeverity.ts +13 -0
  173. package/Types/AI/AIInsightStatus.ts +38 -0
  174. package/Types/AI/AIInsightType.ts +41 -0
  175. package/Types/AI/AIRunAutoGrade.ts +18 -0
  176. package/Types/AI/AIRunEventType.ts +5 -0
  177. package/Types/AI/AIRunHumanVerdict.ts +17 -0
  178. package/Types/AI/AIRunType.ts +6 -0
  179. package/Types/AI/CodeFixTaskContext.ts +88 -0
  180. package/Types/AI/CodeFixTaskType.ts +132 -0
  181. package/Types/AI/FixPullRequestCiStatus.ts +132 -0
  182. package/Types/BaseDatabase/AggregationIntervalUtil.ts +67 -0
  183. package/Types/Incident/IncidentMetricType.ts +7 -0
  184. package/Types/Monitor/CriteriaFilter.ts +8 -0
  185. package/Types/Monitor/MonitorCriteriaInstance.ts +67 -0
  186. package/Types/Monitor/MonitorStep.ts +38 -0
  187. package/Types/Monitor/MonitorStepSqlMonitor.ts +141 -0
  188. package/Types/Monitor/MonitorType.ts +17 -0
  189. package/Types/Monitor/SqlDatabaseType.ts +49 -0
  190. package/Types/Monitor/SqlMonitor/SqlMonitorResponse.ts +28 -0
  191. package/Types/Permission.ts +11 -95
  192. package/Types/Probe/ProbeMonitorResponse.ts +2 -0
  193. package/Types/Runbook/RunbookStep.ts +26 -2
  194. package/Types/Runbook/RunbookStepType.ts +1 -0
  195. package/Types/Workflow/Component.ts +13 -0
  196. package/Types/Workflow/ComponentID.ts +1 -0
  197. package/Types/Workflow/Components/AI.ts +148 -0
  198. package/Types/Workflow/Components.ts +8 -0
  199. package/UI/Components/AI/GenerateFromAIModal.tsx +1 -1
  200. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +11 -0
  201. package/UI/Components/MoreMenu/MoreMenu.tsx +1 -1
  202. package/UI/Components/Table/Table.tsx +38 -2
  203. package/UI/Utils/TableColumnsToCsv.ts +385 -0
  204. package/Utils/Monitor/MonitorMetricType.ts +1 -0
  205. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +59 -45
  206. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -1
  207. package/build/dist/Models/DatabaseModels/AIInsight.js +795 -0
  208. package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -0
  209. package/build/dist/Models/DatabaseModels/AIRun.js +274 -0
  210. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  211. package/build/dist/Models/DatabaseModels/CodeRepository.js +43 -0
  212. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  213. package/build/dist/Models/DatabaseModels/Dashboard.js +3 -3
  214. package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
  215. package/build/dist/Models/DatabaseModels/GlobalConfig.js +110 -0
  216. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  217. package/build/dist/Models/DatabaseModels/Index.js +4 -8
  218. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  219. package/build/dist/Models/DatabaseModels/InstanceHealthLog.js +304 -0
  220. package/build/dist/Models/DatabaseModels/InstanceHealthLog.js.map +1 -0
  221. package/build/dist/Models/DatabaseModels/LlmLog.js +35 -0
  222. package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -1
  223. package/build/dist/Models/DatabaseModels/Project.js +127 -6
  224. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  225. package/build/dist/Models/DatabaseModels/Runbook.js +1 -1
  226. package/build/dist/Models/DatabaseModels/Runbook.js.map +1 -1
  227. package/build/dist/Server/API/AIAgentDataAPI.js +568 -85
  228. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  229. package/build/dist/Server/API/AIAgentTaskAPI.js +100 -44
  230. package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
  231. package/build/dist/Server/API/AIAgentTaskLogAPI.js +49 -25
  232. package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -1
  233. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js +27 -0
  234. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js.map +1 -1
  235. package/build/dist/Server/API/AIInsightAPI.js +140 -0
  236. package/build/dist/Server/API/AIInsightAPI.js.map +1 -0
  237. package/build/dist/Server/API/AIInvestigationAPI.js +257 -1
  238. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  239. package/build/dist/Server/API/CodeFixRunAPI.js +181 -0
  240. package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -0
  241. package/build/dist/Server/API/GitHubAPI.js +164 -2
  242. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  243. package/build/dist/Server/API/TelemetryExceptionAPI.js +148 -43
  244. package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
  245. package/build/dist/Server/EnvironmentConfig.js +1 -1
  246. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js +23 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js.map +1 -0
  249. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js +32 -0
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js.map +1 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js +16 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js.map +1 -0
  253. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js +16 -0
  254. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js.map +1 -0
  255. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js +24 -0
  256. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js.map +1 -0
  257. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js +16 -0
  258. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js.map +1 -0
  259. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js +24 -0
  260. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js.map +1 -0
  261. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js +24 -0
  262. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js.map +1 -0
  263. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js +24 -0
  264. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js.map +1 -0
  265. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js +18 -0
  266. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js.map +1 -0
  267. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js +18 -0
  268. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js.map +1 -0
  269. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js +32 -0
  270. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js.map +1 -0
  271. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js +18 -0
  272. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js.map +1 -0
  273. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js +125 -0
  274. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js.map +1 -0
  275. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js +62 -0
  276. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js.map +1 -0
  277. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +30 -0
  278. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  279. package/build/dist/Server/Infrastructure/Queue.js +73 -3
  280. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  281. package/build/dist/Server/Infrastructure/Semaphore.js +44 -1
  282. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  283. package/build/dist/Server/Services/AIAgentService.js +29 -0
  284. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  285. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js +78 -0
  286. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js.map +1 -1
  287. package/build/dist/Server/Services/AIInsightService.js +164 -0
  288. package/build/dist/Server/Services/AIInsightService.js.map +1 -0
  289. package/build/dist/Server/Services/AIRunEventService.js +49 -0
  290. package/build/dist/Server/Services/AIRunEventService.js.map +1 -1
  291. package/build/dist/Server/Services/AIRunService.js +221 -0
  292. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  293. package/build/dist/Server/Services/AIService.js +198 -11
  294. package/build/dist/Server/Services/AIService.js.map +1 -1
  295. package/build/dist/Server/Services/AlertService.js +4 -4
  296. package/build/dist/Server/Services/AlertService.js.map +1 -1
  297. package/build/dist/Server/Services/CodeRepositoryService.js +180 -0
  298. package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
  299. package/build/dist/Server/Services/DashboardService.js +8 -2
  300. package/build/dist/Server/Services/DashboardService.js.map +1 -1
  301. package/build/dist/Server/Services/GlobalConfigService.js +84 -0
  302. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  303. package/build/dist/Server/Services/IncidentService.js +149 -37
  304. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  305. package/build/dist/Server/Services/IncidentStateTimelineService.js +24 -4
  306. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  307. package/build/dist/Server/Services/Index.js +4 -4
  308. package/build/dist/Server/Services/Index.js.map +1 -1
  309. package/build/dist/Server/Services/{AIAgentTaskLogService.js → InstanceHealthLogService.js} +2 -2
  310. package/build/dist/Server/Services/InstanceHealthLogService.js.map +1 -0
  311. package/build/dist/Server/Services/LlmLogService.js +23 -0
  312. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  313. package/build/dist/Server/Services/LlmProviderService.js +96 -0
  314. package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
  315. package/build/dist/Server/Services/MetricBaselineService.js +65 -0
  316. package/build/dist/Server/Services/MetricBaselineService.js.map +1 -1
  317. package/build/dist/Server/Services/MonitorService.js +9 -1
  318. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  319. package/build/dist/Server/Services/TelemetryExceptionService.js +243 -82
  320. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  321. package/build/dist/Server/Services/TraceAggregationService.js +124 -0
  322. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  323. package/build/dist/Server/Types/Workflow/ComponentCode.js.map +1 -1
  324. package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js +240 -0
  325. package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js.map +1 -0
  326. package/build/dist/Server/Types/Workflow/Components/Index.js +2 -0
  327. package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
  328. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +48 -0
  329. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -0
  330. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +174 -0
  331. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -0
  332. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js +126 -0
  333. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js.map +1 -0
  334. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +131 -0
  335. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -0
  336. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js +99 -0
  337. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js.map +1 -0
  338. package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js +245 -0
  339. package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js.map +1 -0
  340. package/build/dist/Server/Utils/AI/Eval/EvalScores.js +83 -0
  341. package/build/dist/Server/Utils/AI/Eval/EvalScores.js.map +1 -0
  342. package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js +12 -0
  343. package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js.map +1 -0
  344. package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +439 -0
  345. package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -0
  346. package/build/dist/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.js → SRE/AIInvestigationEngine.js} +47 -31
  347. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -0
  348. package/build/dist/Server/Utils/AI/{Sentinel/SentinelMemory.js → SRE/AIMemory.js} +5 -5
  349. package/build/dist/Server/Utils/AI/SRE/AIMemory.js.map +1 -0
  350. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.js +42 -19
  351. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -0
  352. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +226 -0
  353. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -0
  354. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +100 -0
  355. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -0
  356. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js +174 -0
  357. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js.map +1 -0
  358. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.js +60 -22
  359. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -0
  360. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.js +9 -9
  361. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -0
  362. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js +268 -0
  363. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js.map +1 -0
  364. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +226 -0
  365. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -0
  366. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js +26 -0
  367. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js.map +1 -0
  368. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js +159 -0
  369. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js.map +1 -0
  370. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +177 -0
  371. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -0
  372. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js +384 -0
  373. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js.map +1 -0
  374. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js +180 -0
  375. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -0
  376. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +269 -0
  377. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js.map +1 -0
  378. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +231 -0
  379. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -0
  380. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +206 -0
  381. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -0
  382. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js +121 -0
  383. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js.map +1 -0
  384. package/build/dist/Server/Utils/AI/SRE/Insights/Types.js +2 -0
  385. package/build/dist/Server/Utils/AI/SRE/Insights/Types.js.map +1 -0
  386. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +148 -0
  387. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -0
  388. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +231 -0
  389. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -0
  390. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.js +102 -23
  391. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -0
  392. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +167 -0
  393. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -0
  394. package/build/dist/Server/Utils/AI/Toolbox/{SentinelActionTools.js → AIActionTools.js} +18 -2
  395. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -0
  396. package/build/dist/Server/Utils/AI/Toolbox/Index.js +2 -2
  397. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  398. package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js +301 -0
  399. package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js.map +1 -0
  400. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +240 -2
  401. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  402. package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js +127 -0
  403. package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js.map +1 -0
  404. package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js +336 -0
  405. package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js.map +1 -0
  406. package/build/dist/Server/Utils/Execute.js +21 -11
  407. package/build/dist/Server/Utils/Execute.js.map +1 -1
  408. package/build/dist/Server/Utils/LLM/LLMService.js +125 -25
  409. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  410. package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js +120 -0
  411. package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js.map +1 -0
  412. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -0
  413. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  414. package/build/dist/Types/AI/AIInsightEvidence.js +2 -0
  415. package/build/dist/Types/AI/AIInsightEvidence.js.map +1 -0
  416. package/build/dist/Types/AI/AIInsightHumanVerdict.js +16 -0
  417. package/build/dist/Types/AI/AIInsightHumanVerdict.js.map +1 -0
  418. package/build/dist/Types/AI/AIInsightSeverity.js +14 -0
  419. package/build/dist/Types/AI/AIInsightSeverity.js.map +1 -0
  420. package/build/dist/Types/AI/AIInsightStatus.js +36 -0
  421. package/build/dist/Types/AI/AIInsightStatus.js.map +1 -0
  422. package/build/dist/Types/AI/AIInsightType.js +42 -0
  423. package/build/dist/Types/AI/AIInsightType.js.map +1 -0
  424. package/build/dist/Types/AI/AIRunAutoGrade.js +19 -0
  425. package/build/dist/Types/AI/AIRunAutoGrade.js.map +1 -0
  426. package/build/dist/Types/AI/AIRunEventType.js +5 -0
  427. package/build/dist/Types/AI/AIRunEventType.js.map +1 -1
  428. package/build/dist/Types/AI/AIRunHumanVerdict.js +18 -0
  429. package/build/dist/Types/AI/AIRunHumanVerdict.js.map +1 -0
  430. package/build/dist/Types/AI/AIRunType.js +6 -0
  431. package/build/dist/Types/AI/AIRunType.js.map +1 -1
  432. package/build/dist/Types/AI/CodeFixTaskContext.js +29 -0
  433. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -0
  434. package/build/dist/Types/AI/CodeFixTaskType.js +122 -0
  435. package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -0
  436. package/build/dist/Types/AI/FixPullRequestCiStatus.js +102 -0
  437. package/build/dist/Types/AI/FixPullRequestCiStatus.js.map +1 -0
  438. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +55 -0
  439. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
  440. package/build/dist/Types/Incident/IncidentMetricType.js +7 -0
  441. package/build/dist/Types/Incident/IncidentMetricType.js.map +1 -1
  442. package/build/dist/Types/Monitor/CriteriaFilter.js +7 -0
  443. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  444. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +62 -0
  445. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  446. package/build/dist/Types/Monitor/MonitorStep.js +28 -0
  447. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  448. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +93 -0
  449. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -0
  450. package/build/dist/Types/Monitor/MonitorType.js +15 -0
  451. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  452. package/build/dist/Types/Monitor/SqlDatabaseType.js +47 -0
  453. package/build/dist/Types/Monitor/SqlDatabaseType.js.map +1 -0
  454. package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js +2 -0
  455. package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js.map +1 -0
  456. package/build/dist/Types/Permission.js +10 -84
  457. package/build/dist/Types/Permission.js.map +1 -1
  458. package/build/dist/Types/Runbook/RunbookStepType.js +1 -0
  459. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  460. package/build/dist/Types/Workflow/ComponentID.js +1 -0
  461. package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
  462. package/build/dist/Types/Workflow/Components/AI.js +135 -0
  463. package/build/dist/Types/Workflow/Components/AI.js.map +1 -0
  464. package/build/dist/Types/Workflow/Components.js +7 -0
  465. package/build/dist/Types/Workflow/Components.js.map +1 -1
  466. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -1
  467. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
  468. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +9 -0
  469. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  470. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +1 -1
  471. package/build/dist/UI/Components/Table/Table.js +28 -2
  472. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  473. package/build/dist/UI/Utils/TableColumnsToCsv.js +291 -0
  474. package/build/dist/UI/Utils/TableColumnsToCsv.js.map +1 -0
  475. package/build/dist/Utils/Monitor/MonitorMetricType.js +1 -0
  476. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  477. package/package.json +1 -1
  478. package/Models/DatabaseModels/AIAgentTask.ts +0 -660
  479. package/Models/DatabaseModels/AIAgentTaskLog.ts +0 -426
  480. package/Models/DatabaseModels/AIAgentTaskTelemetryException.ts +0 -399
  481. package/Models/DatabaseModels/ServiceCodeRepository.ts +0 -647
  482. package/Server/Services/AIAgentTaskService.ts +0 -240
  483. package/Server/Services/AIAgentTaskTelemetryExceptionService.ts +0 -39
  484. package/Server/Services/ServiceCodeRepositoryService.ts +0 -55
  485. package/Tests/Server/Services/AIAgentTaskServiceClaim.test.ts +0 -146
  486. package/Types/AI/AIAgentTaskMetadata.ts +0 -25
  487. package/Types/AI/AIAgentTaskType.ts +0 -40
  488. package/build/dist/Models/DatabaseModels/AIAgentTask.js +0 -691
  489. package/build/dist/Models/DatabaseModels/AIAgentTask.js.map +0 -1
  490. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js +0 -447
  491. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js.map +0 -1
  492. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js +0 -415
  493. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js.map +0 -1
  494. package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js +0 -665
  495. package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js.map +0 -1
  496. package/build/dist/Server/Services/AIAgentTaskLogService.js.map +0 -1
  497. package/build/dist/Server/Services/AIAgentTaskService.js +0 -217
  498. package/build/dist/Server/Services/AIAgentTaskService.js.map +0 -1
  499. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js +0 -36
  500. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js.map +0 -1
  501. package/build/dist/Server/Services/ServiceCodeRepositoryService.js +0 -54
  502. package/build/dist/Server/Services/ServiceCodeRepositoryService.js.map +0 -1
  503. package/build/dist/Server/Utils/AI/Sentinel/AlertInvestigationRunner.js.map +0 -1
  504. package/build/dist/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.js.map +0 -1
  505. package/build/dist/Server/Utils/AI/Sentinel/IncidentPostmortemRunner.js.map +0 -1
  506. package/build/dist/Server/Utils/AI/Sentinel/InvestigationQueue.js.map +0 -1
  507. package/build/dist/Server/Utils/AI/Sentinel/SentinelInvestigationEngine.js.map +0 -1
  508. package/build/dist/Server/Utils/AI/Sentinel/SentinelMemory.js.map +0 -1
  509. package/build/dist/Server/Utils/AI/Toolbox/SentinelActionTools.js.map +0 -1
  510. package/build/dist/Types/AI/AIAgentTaskMetadata.js +0 -6
  511. package/build/dist/Types/AI/AIAgentTaskMetadata.js.map +0 -1
  512. package/build/dist/Types/AI/AIAgentTaskType.js +0 -29
  513. package/build/dist/Types/AI/AIAgentTaskType.js.map +0 -1
@@ -5,28 +5,32 @@ import { IncidentFeedEventType } from "../../../../Models/DatabaseModels/Inciden
5
5
  import IncidentInternalNote from "../../../../Models/DatabaseModels/IncidentInternalNote";
6
6
  import IncidentFeedService from "../../../Services/IncidentFeedService";
7
7
  import IncidentInternalNoteService from "../../../Services/IncidentInternalNoteService";
8
+ import IncidentService from "../../../Services/IncidentService";
8
9
  import IncidentAIContextBuilder, {
9
10
  IncidentContextData,
10
11
  } from "../IncidentAIContextBuilder";
11
- import SentinelInvestigationEngine from "./SentinelInvestigationEngine";
12
- import SentinelInvestigationQueue from "./InvestigationQueue";
13
- import SentinelMemory from "./SentinelMemory";
12
+ import { AI_INCIDENT_INVESTIGATION_FEATURE } from "../../../Services/AIService";
13
+ import AIInvestigationEngine from "./AIInvestigationEngine";
14
+ import AIInvestigationQueue from "./InvestigationQueue";
15
+ import AIConfidenceSignal, { ConfidenceSignal } from "./ConfidenceSignal";
16
+ import AIMemory from "./AIMemory";
17
+ import InstrumentationTaskTrigger from "./InstrumentationTaskTrigger";
14
18
  import { ObservabilityAssistantResult } from "../Chat/ObservabilityAssistant";
15
19
  import logger from "../../Logger";
16
20
  import CaptureSpan from "../../Telemetry/CaptureSpan";
17
21
 
18
22
  /*
19
- * Sentinel — incident investigation.
23
+ * AI SRE — incident investigation.
20
24
  *
21
- * When a new incident is declared, wakes Sentinel to investigate it (read-only)
25
+ * When a new incident is declared, wakes AI to investigate it (read-only)
22
26
  * and post a cited root-cause analysis into the incident timeline + Slack/Teams
23
27
  * — before the on-call engineer has finished reading the page. The trigger only
24
- * records durable intent (a Queued AIRun via SentinelInvestigationQueue), so a
28
+ * records durable intent (a Queued AIRun via AIInvestigationQueue), so a
25
29
  * pod restart can no longer orphan an investigation; the heavy lifting (run
26
30
  * lifecycle, the agent loop, confidence gating) lives in the shared
27
- * SentinelInvestigationEngine. See Internal/Roadmap/AISentinelExecution.md.
31
+ * AIInvestigationEngine. See Internal/Roadmap/AISentinelExecution.md.
28
32
  */
29
- export default class SentinelIncidentInvestigationRunner {
33
+ export default class AIIncidentInvestigationRunner {
30
34
  /*
31
35
  * Entry point called (fire-and-forget) from IncidentService.onCreateSuccess.
32
36
  * Cheap: gates + a Queued AIRun row; execution happens via the queue.
@@ -41,7 +45,7 @@ export default class SentinelIncidentInvestigationRunner {
41
45
 
42
46
  try {
43
47
  if (
44
- !(await SentinelInvestigationEngine.isEnabledForProject(
48
+ !(await AIInvestigationEngine.isEnabledForProject(
45
49
  projectId,
46
50
  "Incident",
47
51
  ))
@@ -49,20 +53,20 @@ export default class SentinelIncidentInvestigationRunner {
49
53
  return;
50
54
  }
51
55
 
52
- await SentinelInvestigationQueue.enqueue({
56
+ await AIInvestigationQueue.enqueue({
53
57
  projectId,
54
58
  subjectIncidentId: incidentId,
55
59
  });
56
60
  } catch (error) {
57
61
  logger.error(
58
- `Sentinel: unexpected error enqueueing investigation for incident ${incidentId.toString()}: ${error}`,
62
+ `AI: unexpected error enqueueing investigation for incident ${incidentId.toString()}: ${error}`,
59
63
  );
60
64
  }
61
65
  }
62
66
 
63
67
  /*
64
68
  * Execute a claimed run: assemble incident context and hand it to the
65
- * engine. Called by SentinelInvestigationQueue after a successful claim.
69
+ * engine. Called by AIInvestigationQueue after a successful claim.
66
70
  * Never throws — failures are handed to the queue's retry policy so a
67
71
  * claimed run is always finalized or requeued.
68
72
  */
@@ -85,11 +89,11 @@ export default class SentinelIncidentInvestigationRunner {
85
89
 
86
90
  /*
87
91
  * Recurrence memory: pull in past resolved incidents that share this
88
- * incident's monitors/labels so Sentinel can recognise "I've seen this
92
+ * incident's monitors/labels so AI can recognise "I've seen this
89
93
  * before" and reference the prior fix.
90
94
  */
91
95
  const priorCasesContext: string =
92
- await SentinelMemory.getPriorSimilarIncidentsContext({
96
+ await AIMemory.getPriorSimilarIncidentsContext({
93
97
  projectId,
94
98
  currentIncidentId: incidentId,
95
99
  monitorNames: (contextData.incident.monitors || [])
@@ -111,7 +115,7 @@ export default class SentinelIncidentInvestigationRunner {
111
115
  * Context assembly failed — the run is claimed, so hand it to the
112
116
  * retry policy rather than leaving it Running until the sweeper.
113
117
  */
114
- await SentinelInvestigationQueue.failOrRequeue({
118
+ await AIInvestigationQueue.failOrRequeue({
115
119
  aiRunId,
116
120
  attemptCount,
117
121
  errorMessage: `Failed to build incident context: ${
@@ -122,16 +126,17 @@ export default class SentinelIncidentInvestigationRunner {
122
126
  return;
123
127
  }
124
128
 
125
- await SentinelInvestigationEngine.executeRun({
129
+ await AIInvestigationEngine.executeRun({
126
130
  aiRunId,
127
131
  projectId,
128
132
  attemptCount,
129
133
  request: {
130
- feature: "Sentinel Incident Investigation",
134
+ // Persisted LlmLog label — owned by AIService (G4 budget list).
135
+ feature: AI_INCIDENT_INVESTIGATION_FEATURE,
131
136
  contextSummary,
132
137
  postAnalysis: async (postData: {
133
138
  analysisMarkdown: string;
134
- isConfident: boolean;
139
+ confidence: ConfidenceSignal;
135
140
  result: ObservabilityAssistantResult;
136
141
  }): Promise<void> => {
137
142
  await IncidentFeedService.createIncidentFeedItem({
@@ -142,10 +147,15 @@ export default class SentinelIncidentInvestigationRunner {
142
147
  feedInfoInMarkdown: postData.analysisMarkdown,
143
148
  /*
144
149
  * Quiet mode: an inconclusive investigation posts to the timeline
145
- * but does NOT loudly ping the workspace / on-call.
150
+ * but does NOT loudly ping the workspace / on-call. Fail
151
+ * direction (G6): when the confidence classification itself
152
+ * failed, the ping SENDS — quiet mode fails louder, not silent.
146
153
  */
147
154
  workspaceNotification: {
148
- sendWorkspaceNotification: postData.isConfident,
155
+ sendWorkspaceNotification:
156
+ AIConfidenceSignal.shouldSendWorkspaceNotification(
157
+ postData.confidence,
158
+ ),
149
159
  },
150
160
  });
151
161
 
@@ -173,7 +183,47 @@ export default class SentinelIncidentInvestigationRunner {
173
183
  });
174
184
  } catch (error) {
175
185
  logger.error(
176
- `Sentinel: failed to post RCA internal note for incident ${incidentId.toString()}: ${error}`,
186
+ `AI: failed to post RCA internal note for incident ${incidentId.toString()}: ${error}`,
187
+ );
188
+ }
189
+
190
+ /*
191
+ * Measurement layer: record the time-to-rca metric (seconds from
192
+ * incident creation to this analysis post, with the same base
193
+ * attribute shape as every other incident metric). Best-effort —
194
+ * metrics must never break the RCA post.
195
+ */
196
+ try {
197
+ await IncidentService.recordTimeToRootCausePostedMetric({
198
+ incidentId,
199
+ });
200
+ } catch (error) {
201
+ logger.error(
202
+ `AI: failed to record time-to-rca metric for incident ${incidentId.toString()}: ${error}`,
203
+ );
204
+ }
205
+
206
+ /*
207
+ * Inconclusive means the telemetry was insufficient — for
208
+ * opted-in projects (Project.enableInstrumentationFixTasks,
209
+ * default false), queue an ImproveInstrumentation fix task that
210
+ * opens a PR adding the missing observability. Runs strictly
211
+ * AFTER the analysis is posted, and the trigger never throws, so
212
+ * the investigation can neither be blocked nor failed by it.
213
+ * Fail direction (G6): only a POSITIVE inconclusive verdict
214
+ * (deterministic floor or classification) enqueues — a failed
215
+ * classification does NOT create a PR.
216
+ */
217
+ if (
218
+ AIConfidenceSignal.shouldEnqueueInstrumentationTask(
219
+ postData.confidence,
220
+ )
221
+ ) {
222
+ await InstrumentationTaskTrigger.enqueueForInconclusiveInvestigation(
223
+ {
224
+ projectId,
225
+ incidentId,
226
+ },
177
227
  );
178
228
  }
179
229
  },
@@ -4,14 +4,14 @@ import Incident from "../../../../Models/DatabaseModels/Incident";
4
4
  import { IncidentFeedEventType } from "../../../../Models/DatabaseModels/IncidentFeed";
5
5
  import IncidentService from "../../../Services/IncidentService";
6
6
  import IncidentFeedService from "../../../Services/IncidentFeedService";
7
- import SentinelInvestigationEngine from "./SentinelInvestigationEngine";
7
+ import AIInvestigationEngine from "./AIInvestigationEngine";
8
8
  import logger from "../../Logger";
9
9
  import CaptureSpan from "../../Telemetry/CaptureSpan";
10
10
 
11
11
  /*
12
- * Sentinel — auto-draft postmortem on resolve (Phase 3, "close the loop").
12
+ * AI SRE — auto-draft postmortem on resolve (Phase 3, "close the loop").
13
13
  *
14
- * When an incident moves to a resolved state, Sentinel drafts a postmortem from
14
+ * When an incident moves to a resolved state, AI drafts a postmortem from
15
15
  * the incident timeline + telemetry (reusing the existing
16
16
  * IncidentService.generatePostmortemFromAI) and saves it to the incident for a
17
17
  * human to review and edit — turning a ~90-minute manual writeup into a review.
@@ -22,7 +22,7 @@ import CaptureSpan from "../../Telemetry/CaptureSpan";
22
22
  */
23
23
  const MAX_FEED_PREVIEW_CHARS: number = 6000;
24
24
 
25
- export default class SentinelIncidentPostmortemRunner {
25
+ export default class AIIncidentPostmortemRunner {
26
26
  @CaptureSpan()
27
27
  public static async draftPostmortemOnResolve(data: {
28
28
  incidentId: ObjectID;
@@ -32,7 +32,7 @@ export default class SentinelIncidentPostmortemRunner {
32
32
 
33
33
  try {
34
34
  if (
35
- !(await SentinelInvestigationEngine.isEnabledForProject(
35
+ !(await AIInvestigationEngine.isEnabledForProject(
36
36
  projectId,
37
37
  "Incident",
38
38
  ))
@@ -83,7 +83,7 @@ export default class SentinelIncidentPostmortemRunner {
83
83
  projectId,
84
84
  incidentFeedEventType: IncidentFeedEventType.PostmortemNote,
85
85
  displayColor: Blue500,
86
- feedInfoInMarkdown: `## 🧠 Sentinel — Draft Postmortem\n\nSentinel drafted a postmortem for incident #${incident.incidentNumber} from the incident timeline and telemetry. It has been saved on the incident for you to review and edit.`,
86
+ feedInfoInMarkdown: `## 🧠 AI — Draft Postmortem\n\nOneUptime AI drafted a postmortem for incident #${incident.incidentNumber} from the incident timeline and telemetry. It has been saved on the incident for you to review and edit.`,
87
87
  moreInformationInMarkdown:
88
88
  draft.length > MAX_FEED_PREVIEW_CHARS
89
89
  ? `${draft.substring(0, MAX_FEED_PREVIEW_CHARS)}\n\n…(truncated — the full draft is saved on the incident.)`
@@ -94,11 +94,11 @@ export default class SentinelIncidentPostmortemRunner {
94
94
  });
95
95
 
96
96
  logger.debug(
97
- `Sentinel: drafted postmortem for incident ${incidentId.toString()}.`,
97
+ `AI: drafted postmortem for incident ${incidentId.toString()}.`,
98
98
  );
99
99
  } catch (error) {
100
100
  logger.error(
101
- `Sentinel: failed to draft postmortem for incident ${incidentId.toString()}: ${error}`,
101
+ `AI: failed to draft postmortem for incident ${incidentId.toString()}: ${error}`,
102
102
  );
103
103
  }
104
104
  }
@@ -0,0 +1,364 @@
1
+ import ObjectID from "../../../../../../Types/ObjectID";
2
+ import OneUptimeDate from "../../../../../../Types/Date";
3
+ import AIInsightType from "../../../../../../Types/AI/AIInsightType";
4
+ import AIInsightSeverity from "../../../../../../Types/AI/AIInsightSeverity";
5
+ import Service from "../../../../../../Models/DatabaseModels/Service";
6
+ import LogAggregationService, {
7
+ AnalyticsTopItem,
8
+ HistogramBucket,
9
+ } from "../../../../../Services/LogAggregationService";
10
+ import ServiceService from "../../../../../Services/ServiceService";
11
+ import {
12
+ InsightCandidate,
13
+ InsightDetector,
14
+ InsightScanContext,
15
+ } from "../Types";
16
+
17
+ /*
18
+ * ErrorLogSpike — the project's Error/Fatal log volume in the last hour
19
+ * spiked well above its own average hourly rate over the prior 24 hours.
20
+ *
21
+ * Two-stage on purpose (cost): stage 1 is ONE project-wide severity
22
+ * histogram, which ClickHouse serves from the proj_severity_histogram
23
+ * projection because severityText and the minute bucket are the
24
+ * projection's own keys. Only when stage 1 finds a spike does stage 2 run
25
+ * the service-attribution query — a top-list grouped by primaryEntityId,
26
+ * which falls back to a base-table scan but is bounded to the single spike
27
+ * hour. Deterministic — no LLM anywhere in this detector.
28
+ */
29
+
30
+ // The spike window, compared against the prior baseline window.
31
+ export const ERROR_LOG_SPIKE_RECENT_WINDOW_MINUTES: number = 60;
32
+
33
+ /*
34
+ * Baseline: the 24 hours before the spike window, averaged per hour.
35
+ * Self-baselining means chronically chatty projects don't alert on their
36
+ * normal error volume.
37
+ */
38
+ export const ERROR_LOG_SPIKE_BASELINE_WINDOW_HOURS: number = 24;
39
+
40
+ /*
41
+ * Absolute floor: below 100 errors/hour a "3x spike" can be 20→100 raw
42
+ * lines — routine flakiness, not an event worth a human's attention.
43
+ */
44
+ export const ERROR_LOG_SPIKE_MIN_RECENT_COUNT: number = 100;
45
+
46
+ /*
47
+ * Volume multiplier that counts as a spike. The baseline hourly average is
48
+ * floored at 1 (see evaluateSpike) so a silent project's first errors
49
+ * still register without producing infinite multipliers.
50
+ */
51
+ export const ERROR_LOG_SPIKE_MIN_MULTIPLIER: number = 3;
52
+
53
+ // A >= 10x spike is a step change, not a fluctuation — escalate to High.
54
+ export const ERROR_LOG_SPIKE_HIGH_SEVERITY_MULTIPLIER: number = 10;
55
+
56
+ /*
57
+ * Histogram bucket size. The projection is minute-grained, so any bucket
58
+ * size is projection-served; 5 minutes keeps the recent/prior split error
59
+ * bounded to one bucket (< 5 min of data) while returning only ~300 rows
60
+ * for the whole 25h window.
61
+ */
62
+ export const ERROR_LOG_SPIKE_HISTOGRAM_BUCKET_MINUTES: number = 5;
63
+
64
+ /*
65
+ * At most this many per-service insights per spike. More than 3 services
66
+ * spiking together is one platform event, not N service events — the
67
+ * project-wide evidence block carries the full attribution list anyway.
68
+ */
69
+ export const ERROR_LOG_SPIKE_MAX_ATTRIBUTED_SERVICES: number = 3;
70
+
71
+ // Severity levels that count as "errors" for this detector (OTel names).
72
+ export const ERROR_LOG_SEVERITIES: Array<string> = ["Error", "Fatal"];
73
+
74
+ /*
75
+ * A ClickHouse DateTime rendered with no zone designator: "YYYY-MM-DD
76
+ * hh:mm:ss" (the shape LogAggregationService.getHistogram reads out of the
77
+ * `bucket` column), optionally "T"-separated and/or fractional. Anchored on
78
+ * purpose — any string carrying a zone (…Z, …+05:30) must NOT match, because
79
+ * parseBucketTime appends a Z to whatever matches and a double-designator
80
+ * string parses to an Invalid Date (which splitHistogram would then skip,
81
+ * zeroing the bucket).
82
+ */
83
+ const ZONE_LESS_DATETIME_REGEX: RegExp =
84
+ /^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(\.\d+)?$/;
85
+
86
+ export interface ErrorLogSpikeDecision {
87
+ isSpike: boolean;
88
+ // recent count / max(baseline hourly average, 1).
89
+ multiplier: number;
90
+ severity: AIInsightSeverity;
91
+ recentCount: number;
92
+ // prior-window count / ERROR_LOG_SPIKE_BASELINE_WINDOW_HOURS (unfloored).
93
+ baselineHourlyAverage: number;
94
+ }
95
+
96
+ export default class ErrorLogSpikeDetector implements InsightDetector {
97
+ public insightType: AIInsightType = AIInsightType.ErrorLogSpike;
98
+
99
+ /*
100
+ * ClickHouse serves DateTime columns as a zone-less wall clock in the
101
+ * column's own zone — UTC in every OneUptime deployment. `new Date()` reads
102
+ * that shape as the PROCESS's LOCAL time, so on a worker whose TZ is not UTC
103
+ * every bucket silently slides by the UTC offset and the recent/prior
104
+ * boundary below lands in the wrong place: positive offsets push the spike's
105
+ * buckets into the baseline (suppressing every spike while inflating the
106
+ * average it is compared against), negative offsets drag hours of baseline
107
+ * into the "last 60 minutes" (fabricating spikes whose counts cannot even
108
+ * reconcile with stage 2, which binds real Date params and queries the true
109
+ * hour). Normalizing to an explicit UTC instant makes the split depend only
110
+ * on the data, never on the worker's clock configuration.
111
+ *
112
+ * Zone-carrying strings are parsed verbatim — see ZONE_LESS_DATETIME_REGEX.
113
+ * Anything else stays an Invalid Date so splitHistogram's isNaN guard still
114
+ * skips it. Same idiom as the dashboard's EdgeDetailPanel.parseBucketStart.
115
+ */
116
+ public static parseBucketTime(time: string): Date {
117
+ const trimmedTime: string = time.trim();
118
+
119
+ if (ZONE_LESS_DATETIME_REGEX.test(trimmedTime)) {
120
+ return new Date(`${trimmedTime.replace(" ", "T")}Z`);
121
+ }
122
+
123
+ return new Date(trimmedTime);
124
+ }
125
+
126
+ /*
127
+ * Pure split of one histogram into the recent window and the prior
128
+ * baseline window. A bucket belongs to "recent" when it STARTS at or
129
+ * after the boundary; the boundary-straddling bucket therefore counts as
130
+ * prior — a deliberate conservative bias (understates the spike by at
131
+ * most one bucket of data rather than inflating it).
132
+ */
133
+ public static splitHistogram(
134
+ buckets: Array<HistogramBucket>,
135
+ recentWindowStart: Date,
136
+ ): { recentCount: number; priorCount: number } {
137
+ let recentCount: number = 0;
138
+ let priorCount: number = 0;
139
+
140
+ for (const bucket of buckets) {
141
+ const bucketTime: Date = ErrorLogSpikeDetector.parseBucketTime(
142
+ bucket.time,
143
+ );
144
+ if (isNaN(bucketTime.getTime())) {
145
+ continue;
146
+ }
147
+ if (bucketTime.getTime() >= recentWindowStart.getTime()) {
148
+ recentCount += bucket.count;
149
+ } else {
150
+ priorCount += bucket.count;
151
+ }
152
+ }
153
+
154
+ return { recentCount, priorCount };
155
+ }
156
+
157
+ /*
158
+ * Pure decision: recent-hour error count vs the prior 24h window count.
159
+ * Spike ⇔ recent >= ERROR_LOG_SPIKE_MIN_RECENT_COUNT AND
160
+ * recent >= ERROR_LOG_SPIKE_MIN_MULTIPLIER * max(prior/24, 1).
161
+ */
162
+ public static evaluateSpike(
163
+ recentCount: number,
164
+ priorWindowCount: number,
165
+ ): ErrorLogSpikeDecision {
166
+ const baselineHourlyAverage: number =
167
+ priorWindowCount / ERROR_LOG_SPIKE_BASELINE_WINDOW_HOURS;
168
+ const effectiveBaseline: number = Math.max(baselineHourlyAverage, 1);
169
+ const multiplier: number = recentCount / effectiveBaseline;
170
+
171
+ const isSpike: boolean =
172
+ recentCount >= ERROR_LOG_SPIKE_MIN_RECENT_COUNT &&
173
+ multiplier >= ERROR_LOG_SPIKE_MIN_MULTIPLIER;
174
+
175
+ return {
176
+ isSpike,
177
+ multiplier,
178
+ severity:
179
+ multiplier >= ERROR_LOG_SPIKE_HIGH_SEVERITY_MULTIPLIER
180
+ ? AIInsightSeverity.High
181
+ : AIInsightSeverity.Medium,
182
+ recentCount,
183
+ baselineHourlyAverage,
184
+ };
185
+ }
186
+
187
+ /*
188
+ * Stable dedupe key: per attributed service, or "project" for the
189
+ * unattributed project-wide spike.
190
+ */
191
+ public static buildFingerprint(serviceId: string | undefined): string {
192
+ return `error-log-spike:${serviceId || "project"}`;
193
+ }
194
+
195
+ public async detect(
196
+ context: InsightScanContext,
197
+ ): Promise<Array<InsightCandidate>> {
198
+ const recentWindowStart: Date = OneUptimeDate.addRemoveMinutes(
199
+ context.now,
200
+ -1 * ERROR_LOG_SPIKE_RECENT_WINDOW_MINUTES,
201
+ );
202
+ const baselineWindowStart: Date = OneUptimeDate.addRemoveHours(
203
+ recentWindowStart,
204
+ -1 * ERROR_LOG_SPIKE_BASELINE_WINDOW_HOURS,
205
+ );
206
+
207
+ /*
208
+ * Stage 1 — projection-fast project-wide severity histogram over the
209
+ * whole 25h (baseline + spike) range. severityTexts stays on the
210
+ * projection; adding any service/entity filter here would silently
211
+ * force a base-table scan (LogAggregationService.appendCommonFilters).
212
+ */
213
+ const buckets: Array<HistogramBucket> =
214
+ await LogAggregationService.getHistogram({
215
+ projectId: context.projectId,
216
+ startTime: baselineWindowStart,
217
+ endTime: context.now,
218
+ bucketSizeInMinutes: ERROR_LOG_SPIKE_HISTOGRAM_BUCKET_MINUTES,
219
+ severityTexts: ERROR_LOG_SEVERITIES,
220
+ });
221
+
222
+ const { recentCount, priorCount } = ErrorLogSpikeDetector.splitHistogram(
223
+ buckets,
224
+ recentWindowStart,
225
+ );
226
+
227
+ const decision: ErrorLogSpikeDecision = ErrorLogSpikeDetector.evaluateSpike(
228
+ recentCount,
229
+ priorCount,
230
+ );
231
+
232
+ if (!decision.isSpike) {
233
+ return [];
234
+ }
235
+
236
+ /*
237
+ * Stage 2 — service attribution, only now that a spike exists. This
238
+ * top-list groups by primaryEntityId, which rejects the projection and
239
+ * scans the base table — acceptable because the scan is bounded to the
240
+ * single spike hour.
241
+ */
242
+ const topItems: Array<AnalyticsTopItem> =
243
+ await LogAggregationService.getAnalyticsTopList({
244
+ projectId: context.projectId,
245
+ startTime: recentWindowStart,
246
+ endTime: context.now,
247
+ bucketSizeInMinutes: ERROR_LOG_SPIKE_RECENT_WINDOW_MINUTES,
248
+ chartType: "toplist",
249
+ groupBy: ["primaryEntityId"],
250
+ aggregation: "count",
251
+ severityTexts: ERROR_LOG_SEVERITIES,
252
+ limit: ERROR_LOG_SPIKE_MAX_ATTRIBUTED_SERVICES,
253
+ });
254
+
255
+ /*
256
+ * Resolve entity ids to Service names. Non-Service entities (hosts,
257
+ * clusters) resolve to null and keep their raw id as the label — the
258
+ * evidence must stand alone even when attribution is imperfect.
259
+ */
260
+ const topServices: Array<{
261
+ serviceId: string;
262
+ serviceName: string;
263
+ isService: boolean;
264
+ count: number;
265
+ }> = [];
266
+
267
+ for (const item of topItems) {
268
+ const service: Service | null = await ServiceService.findOneById({
269
+ id: new ObjectID(item.value),
270
+ select: { name: true },
271
+ props: { isRoot: true },
272
+ });
273
+ topServices.push({
274
+ serviceId: item.value,
275
+ serviceName: service?.name || item.value,
276
+ isService: Boolean(service?.name),
277
+ count: item.count,
278
+ });
279
+ }
280
+
281
+ const detailLines: Array<string> = [
282
+ "**Error-log spike detected**",
283
+ "",
284
+ `- Error/Fatal logs in the last ${ERROR_LOG_SPIKE_RECENT_WINDOW_MINUTES} minutes: ${decision.recentCount}`,
285
+ `- Baseline: ${decision.baselineHourlyAverage.toFixed(2)}/hour over the prior ${ERROR_LOG_SPIKE_BASELINE_WINDOW_HOURS}h (${priorCount} total)`,
286
+ `- Spike multiplier: ${decision.multiplier.toFixed(1)}x`,
287
+ ];
288
+ if (topServices.length > 0) {
289
+ detailLines.push("", "Top contributing services in the spike window:");
290
+ for (const top of topServices) {
291
+ detailLines.push(`- ${top.serviceName}: ${top.count} error logs`);
292
+ }
293
+ }
294
+ const detailMarkdown: string = detailLines.join("\n");
295
+
296
+ const evidenceTopServices: Array<{ serviceName: string; count: number }> =
297
+ topServices.map(
298
+ (top: {
299
+ serviceId: string;
300
+ serviceName: string;
301
+ isService: boolean;
302
+ count: number;
303
+ }): { serviceName: string; count: number } => {
304
+ return { serviceName: top.serviceName, count: top.count };
305
+ },
306
+ );
307
+
308
+ /*
309
+ * One insight per top contributing service so each can be routed and
310
+ * triaged in its own context; when attribution found nothing, a single
311
+ * project-wide insight still surfaces the event.
312
+ */
313
+ if (topServices.length === 0) {
314
+ return [
315
+ {
316
+ insightType: AIInsightType.ErrorLogSpike,
317
+ fingerprint: ErrorLogSpikeDetector.buildFingerprint(undefined),
318
+ title: `Error-log spike: ${decision.multiplier.toFixed(1)}x normal volume across the project`,
319
+ detailMarkdown,
320
+ severity: decision.severity,
321
+ evidence: {
322
+ logSpike: {
323
+ recentErrorCount: decision.recentCount,
324
+ baselineHourlyAverage: decision.baselineHourlyAverage,
325
+ spikeMultiplier: decision.multiplier,
326
+ windowMinutes: ERROR_LOG_SPIKE_RECENT_WINDOW_MINUTES,
327
+ topServices: evidenceTopServices,
328
+ },
329
+ },
330
+ },
331
+ ];
332
+ }
333
+
334
+ return topServices.map(
335
+ (top: {
336
+ serviceId: string;
337
+ serviceName: string;
338
+ isService: boolean;
339
+ count: number;
340
+ }): InsightCandidate => {
341
+ return {
342
+ insightType: AIInsightType.ErrorLogSpike,
343
+ fingerprint: ErrorLogSpikeDetector.buildFingerprint(top.serviceId),
344
+ title: `Error-log spike: ${decision.multiplier.toFixed(1)}x normal volume in ${top.serviceName}`,
345
+ detailMarkdown,
346
+ severity: decision.severity,
347
+ serviceName: top.serviceName,
348
+ telemetryServiceId: top.isService
349
+ ? new ObjectID(top.serviceId)
350
+ : undefined,
351
+ evidence: {
352
+ logSpike: {
353
+ recentErrorCount: decision.recentCount,
354
+ baselineHourlyAverage: decision.baselineHourlyAverage,
355
+ spikeMultiplier: decision.multiplier,
356
+ windowMinutes: ERROR_LOG_SPIKE_RECENT_WINDOW_MINUTES,
357
+ topServices: evidenceTopServices,
358
+ },
359
+ },
360
+ };
361
+ },
362
+ );
363
+ }
364
+ }