@oneuptime/common 11.5.4 → 11.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (505) hide show
  1. package/Models/DatabaseModels/AIAgentTaskPullRequest.ts +56 -45
  2. package/Models/DatabaseModels/AIInsight.ts +748 -0
  3. package/Models/DatabaseModels/AIRun.ts +262 -0
  4. package/Models/DatabaseModels/CodeRepository.ts +42 -0
  5. package/Models/DatabaseModels/GlobalConfig.ts +105 -0
  6. package/Models/DatabaseModels/Index.ts +4 -8
  7. package/Models/DatabaseModels/InstanceHealthLog.ts +277 -0
  8. package/Models/DatabaseModels/LlmLog.ts +33 -0
  9. package/Models/DatabaseModels/Project.ts +123 -6
  10. package/Models/DatabaseModels/Runbook.ts +1 -1
  11. package/Server/API/AIAgentDataAPI.ts +802 -140
  12. package/Server/API/AIAgentTaskAPI.ts +132 -69
  13. package/Server/API/AIAgentTaskLogAPI.ts +65 -41
  14. package/Server/API/AIAgentTaskPullRequestAPI.ts +41 -0
  15. package/Server/API/AIInsightAPI.ts +220 -0
  16. package/Server/API/AIInvestigationAPI.ts +363 -1
  17. package/Server/API/CodeFixRunAPI.ts +251 -0
  18. package/Server/API/GitHubAPI.ts +246 -3
  19. package/Server/API/TelemetryExceptionAPI.ts +193 -48
  20. package/Server/EnvironmentConfig.ts +1 -1
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.ts +26 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.ts +73 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.ts +29 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.ts +31 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.ts +51 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.ts +25 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.ts +47 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.ts +53 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.ts +31 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.ts +37 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.ts +25 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.ts +75 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.ts +37 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.ts +203 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.ts +163 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +30 -0
  37. package/Server/Infrastructure/Queue.ts +82 -4
  38. package/Server/Infrastructure/Semaphore.ts +62 -1
  39. package/Server/Services/AIAgentService.ts +32 -0
  40. package/Server/Services/AIAgentTaskPullRequestService.ts +117 -0
  41. package/Server/Services/AIInsightService.ts +174 -0
  42. package/Server/Services/AIRunEventService.ts +63 -0
  43. package/Server/Services/AIRunService.ts +259 -1
  44. package/Server/Services/AIService.ts +249 -7
  45. package/Server/Services/AlertService.ts +4 -4
  46. package/Server/Services/CodeRepositoryService.ts +209 -0
  47. package/Server/Services/GlobalConfigService.ts +148 -0
  48. package/Server/Services/IncidentService.ts +183 -38
  49. package/Server/Services/IncidentStateTimelineService.ts +24 -4
  50. package/Server/Services/Index.ts +4 -4
  51. package/Server/Services/{AIAgentTaskLogService.ts → InstanceHealthLogService.ts} +1 -1
  52. package/Server/Services/LlmLogService.ts +27 -0
  53. package/Server/Services/LlmProviderService.ts +108 -0
  54. package/Server/Services/MetricBaselineService.ts +123 -0
  55. package/Server/Services/MonitorService.ts +15 -0
  56. package/Server/Services/TelemetryExceptionService.ts +323 -116
  57. package/Server/Services/TraceAggregationService.ts +176 -0
  58. package/Server/Types/Workflow/ComponentCode.ts +6 -0
  59. package/Server/Types/Workflow/Components/AI/GenerateText.ts +326 -0
  60. package/Server/Types/Workflow/Components/Index.ts +2 -0
  61. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +1 -1
  62. package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +71 -0
  63. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +243 -0
  64. package/Server/Utils/AI/CodeFix/CodeFixRunQueue.ts +131 -0
  65. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +148 -0
  66. package/Server/Utils/AI/CodeFix/OpenPullRequestCap.ts +117 -0
  67. package/Server/Utils/AI/Eval/EvalCorpus.ts +369 -0
  68. package/Server/Utils/AI/Eval/EvalScores.ts +172 -0
  69. package/Server/Utils/AI/Eval/ReplayInvestigation.ts +87 -0
  70. package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +676 -0
  71. package/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.ts → SRE/AIInvestigationEngine.ts} +58 -37
  72. package/Server/Utils/AI/{Sentinel/SentinelMemory.ts → SRE/AIMemory.ts} +3 -3
  73. package/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.ts +50 -20
  74. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +293 -0
  75. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +115 -0
  76. package/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.ts +223 -0
  77. package/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.ts +71 -21
  78. package/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.ts +8 -8
  79. package/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.ts +364 -0
  80. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +317 -0
  81. package/Server/Utils/AI/SRE/Insights/Detectors/Index.ts +27 -0
  82. package/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.ts +221 -0
  83. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +238 -0
  84. package/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.ts +521 -0
  85. package/Server/Utils/AI/SRE/Insights/FixRouting.ts +242 -0
  86. package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +290 -0
  87. package/Server/Utils/AI/SRE/Insights/InsightStore.ts +283 -0
  88. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +242 -0
  89. package/Server/Utils/AI/SRE/Insights/Triage.ts +162 -0
  90. package/Server/Utils/AI/SRE/Insights/Types.ts +49 -0
  91. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +212 -0
  92. package/Server/Utils/AI/SRE/InvestigationGrader.ts +282 -0
  93. package/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.ts +114 -19
  94. package/Server/Utils/AI/{Sentinel → SRE}/README.md +4 -4
  95. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +172 -0
  96. package/Server/Utils/AI/Toolbox/{SentinelActionTools.ts → AIActionTools.ts} +22 -1
  97. package/Server/Utils/AI/Toolbox/Index.ts +2 -2
  98. package/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.ts +526 -0
  99. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +319 -1
  100. package/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.ts +221 -0
  101. package/Server/Utils/CodeRepository/StackTraceRepoResolver.ts +571 -0
  102. package/Server/Utils/Execute.ts +2 -1
  103. package/Server/Utils/LLM/LLMService.ts +160 -30
  104. package/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.ts +152 -0
  105. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +29 -0
  106. package/Tests/Server/Infrastructure/Queue.test.ts +227 -0
  107. package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +159 -0
  108. package/Tests/Server/Services/AIAgentTaskPullRequestOutcomeStats.test.ts +154 -0
  109. package/Tests/Server/Services/AIInsightService.test.ts +324 -0
  110. package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +401 -0
  111. package/Tests/Server/Services/AIRunHumanVerdict.test.ts +161 -0
  112. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +95 -5
  113. package/Tests/Server/Services/AIServiceProjectAccess.test.ts +259 -0
  114. package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +249 -0
  115. package/Tests/Server/Services/FixPerformanceTaskTrigger.test.ts +274 -0
  116. package/Tests/Server/Services/GlobalConfigService.test.ts +80 -0
  117. package/Tests/Server/Services/IncidentInternalNoteAnnouncement.test.ts +1 -1
  118. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +313 -0
  119. package/Tests/Server/Services/LlmProviderProjectOwned.test.ts +132 -0
  120. package/Tests/Server/Services/TelemetryExceptionAIFixReadiness.test.ts +405 -0
  121. package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +322 -0
  122. package/Tests/Server/Services/TraceServiceLatencyProfile.test.ts +278 -0
  123. package/Tests/Server/Types/Workflow/Components/AIGenerateText.test.ts +722 -0
  124. package/Tests/Server/Utils/AI/{SentinelAlertGating.test.ts → AIAlertGating.test.ts} +19 -19
  125. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +362 -0
  126. package/Tests/Server/Utils/AI/{SentinelInvestigationQueue.test.ts → AIInvestigationQueue.test.ts} +19 -19
  127. package/Tests/Server/Utils/AI/CodeAgentWorkspaceGuard.test.ts +138 -0
  128. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +335 -0
  129. package/Tests/Server/Utils/AI/CodeFixRunQueue.test.ts +134 -0
  130. package/Tests/Server/Utils/AI/EvalCorpus.test.ts +209 -0
  131. package/Tests/Server/Utils/AI/EvalScores.test.ts +343 -0
  132. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +218 -0
  133. package/Tests/Server/Utils/AI/Insights/ErrorLogSpikeDetector.test.ts +437 -0
  134. package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +287 -0
  135. package/Tests/Server/Utils/AI/Insights/InsightDetectorsIndex.test.ts +34 -0
  136. package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +572 -0
  137. package/Tests/Server/Utils/AI/Insights/InsightNeverThrowsHardening.test.ts +344 -0
  138. package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +720 -0
  139. package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +467 -0
  140. package/Tests/Server/Utils/AI/Insights/InsightStoreHardening.test.ts +370 -0
  141. package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +210 -0
  142. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +221 -0
  143. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +328 -0
  144. package/Tests/Server/Utils/AI/Insights/MetricBaselineDrift.test.ts +182 -0
  145. package/Tests/Server/Utils/AI/Insights/MetricDriftDetector.test.ts +280 -0
  146. package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +259 -0
  147. package/Tests/Server/Utils/AI/Insights/TraceLatencyRegressionDetector.test.ts +770 -0
  148. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +343 -0
  149. package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +307 -0
  150. package/Tests/Server/Utils/AI/OpenPullRequestCap.test.ts +170 -0
  151. package/Tests/Server/Utils/AI/SpanTreeAnalyzer.test.ts +559 -0
  152. package/Tests/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.test.ts +158 -0
  153. package/Tests/Server/Utils/GitHubCheckRunsConclusion.test.ts +100 -0
  154. package/Tests/Server/Utils/GitHubPullRequestStateMapping.test.ts +50 -0
  155. package/Tests/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.test.ts +266 -0
  156. package/Tests/Server/Utils/ServiceRepoLinkSuggester.test.ts +167 -0
  157. package/Tests/Server/Utils/StackTraceRepoResolver.test.ts +527 -0
  158. package/Tests/Types/AI/AIChatPermissionMode.test.ts +112 -0
  159. package/Tests/Types/AI/CodeFixTaskType.test.ts +152 -0
  160. package/Tests/Types/AI/FixPullRequestCiStatus.test.ts +181 -0
  161. package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +110 -0
  162. package/Tests/Types/Monitor/SqlDatabaseType.test.ts +55 -0
  163. package/Tests/Types/Workflow/AIGenerateTextMetadata.test.ts +180 -0
  164. package/Tests/UI/Components/TableBulkCsvExport.test.tsx +168 -0
  165. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +523 -0
  166. package/Types/AI/AIChatTypes.ts +8 -0
  167. package/Types/AI/AIInsightEvidence.ts +77 -0
  168. package/Types/AI/AIInsightHumanVerdict.ts +15 -0
  169. package/Types/AI/AIInsightSeverity.ts +13 -0
  170. package/Types/AI/AIInsightStatus.ts +38 -0
  171. package/Types/AI/AIInsightType.ts +41 -0
  172. package/Types/AI/AIRunAutoGrade.ts +18 -0
  173. package/Types/AI/AIRunEventType.ts +5 -0
  174. package/Types/AI/AIRunHumanVerdict.ts +17 -0
  175. package/Types/AI/AIRunType.ts +6 -0
  176. package/Types/AI/CodeFixTaskContext.ts +88 -0
  177. package/Types/AI/CodeFixTaskType.ts +132 -0
  178. package/Types/AI/FixPullRequestCiStatus.ts +132 -0
  179. package/Types/BaseDatabase/AggregationIntervalUtil.ts +67 -0
  180. package/Types/Incident/IncidentMetricType.ts +7 -0
  181. package/Types/Monitor/CriteriaFilter.ts +8 -0
  182. package/Types/Monitor/MonitorCriteriaInstance.ts +67 -0
  183. package/Types/Monitor/MonitorStep.ts +38 -0
  184. package/Types/Monitor/MonitorStepSqlMonitor.ts +141 -0
  185. package/Types/Monitor/MonitorType.ts +17 -0
  186. package/Types/Monitor/SqlDatabaseType.ts +49 -0
  187. package/Types/Monitor/SqlMonitor/SqlMonitorResponse.ts +28 -0
  188. package/Types/Permission.ts +11 -95
  189. package/Types/Probe/ProbeMonitorResponse.ts +2 -0
  190. package/Types/Runbook/RunbookStep.ts +26 -2
  191. package/Types/Runbook/RunbookStepType.ts +1 -0
  192. package/Types/Workflow/Component.ts +13 -0
  193. package/Types/Workflow/ComponentID.ts +1 -0
  194. package/Types/Workflow/Components/AI.ts +148 -0
  195. package/Types/Workflow/Components.ts +8 -0
  196. package/UI/Components/AI/GenerateFromAIModal.tsx +1 -1
  197. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +11 -0
  198. package/UI/Components/MoreMenu/MoreMenu.tsx +1 -1
  199. package/UI/Components/Table/Table.tsx +38 -2
  200. package/UI/Utils/TableColumnsToCsv.ts +385 -0
  201. package/Utils/Monitor/MonitorMetricType.ts +1 -0
  202. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +59 -45
  203. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/AIInsight.js +795 -0
  205. package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -0
  206. package/build/dist/Models/DatabaseModels/AIRun.js +274 -0
  207. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/CodeRepository.js +43 -0
  209. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/GlobalConfig.js +110 -0
  211. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  212. package/build/dist/Models/DatabaseModels/Index.js +4 -8
  213. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  214. package/build/dist/Models/DatabaseModels/InstanceHealthLog.js +304 -0
  215. package/build/dist/Models/DatabaseModels/InstanceHealthLog.js.map +1 -0
  216. package/build/dist/Models/DatabaseModels/LlmLog.js +35 -0
  217. package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -1
  218. package/build/dist/Models/DatabaseModels/Project.js +127 -6
  219. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  220. package/build/dist/Models/DatabaseModels/Runbook.js +1 -1
  221. package/build/dist/Models/DatabaseModels/Runbook.js.map +1 -1
  222. package/build/dist/Server/API/AIAgentDataAPI.js +568 -85
  223. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  224. package/build/dist/Server/API/AIAgentTaskAPI.js +100 -44
  225. package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
  226. package/build/dist/Server/API/AIAgentTaskLogAPI.js +49 -25
  227. package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -1
  228. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js +27 -0
  229. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js.map +1 -1
  230. package/build/dist/Server/API/AIInsightAPI.js +140 -0
  231. package/build/dist/Server/API/AIInsightAPI.js.map +1 -0
  232. package/build/dist/Server/API/AIInvestigationAPI.js +257 -1
  233. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  234. package/build/dist/Server/API/CodeFixRunAPI.js +181 -0
  235. package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -0
  236. package/build/dist/Server/API/GitHubAPI.js +164 -2
  237. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  238. package/build/dist/Server/API/TelemetryExceptionAPI.js +148 -43
  239. package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
  240. package/build/dist/Server/EnvironmentConfig.js +1 -1
  241. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js +23 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js.map +1 -0
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js +32 -0
  245. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js.map +1 -0
  246. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js +16 -0
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js.map +1 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js +16 -0
  249. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js.map +1 -0
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js +24 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js.map +1 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js +16 -0
  253. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js.map +1 -0
  254. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js +24 -0
  255. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js.map +1 -0
  256. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js +24 -0
  257. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js.map +1 -0
  258. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js +24 -0
  259. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js.map +1 -0
  260. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js +18 -0
  261. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js.map +1 -0
  262. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js +18 -0
  263. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js.map +1 -0
  264. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js +32 -0
  265. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js.map +1 -0
  266. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js +18 -0
  267. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js.map +1 -0
  268. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js +125 -0
  269. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js.map +1 -0
  270. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js +62 -0
  271. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js.map +1 -0
  272. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +30 -0
  273. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  274. package/build/dist/Server/Infrastructure/Queue.js +73 -3
  275. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  276. package/build/dist/Server/Infrastructure/Semaphore.js +44 -1
  277. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  278. package/build/dist/Server/Services/AIAgentService.js +29 -0
  279. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  280. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js +78 -0
  281. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js.map +1 -1
  282. package/build/dist/Server/Services/AIInsightService.js +164 -0
  283. package/build/dist/Server/Services/AIInsightService.js.map +1 -0
  284. package/build/dist/Server/Services/AIRunEventService.js +49 -0
  285. package/build/dist/Server/Services/AIRunEventService.js.map +1 -1
  286. package/build/dist/Server/Services/AIRunService.js +221 -0
  287. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  288. package/build/dist/Server/Services/AIService.js +198 -11
  289. package/build/dist/Server/Services/AIService.js.map +1 -1
  290. package/build/dist/Server/Services/AlertService.js +4 -4
  291. package/build/dist/Server/Services/AlertService.js.map +1 -1
  292. package/build/dist/Server/Services/CodeRepositoryService.js +180 -0
  293. package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
  294. package/build/dist/Server/Services/GlobalConfigService.js +84 -0
  295. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  296. package/build/dist/Server/Services/IncidentService.js +149 -37
  297. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  298. package/build/dist/Server/Services/IncidentStateTimelineService.js +24 -4
  299. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  300. package/build/dist/Server/Services/Index.js +4 -4
  301. package/build/dist/Server/Services/Index.js.map +1 -1
  302. package/build/dist/Server/Services/{AIAgentTaskLogService.js → InstanceHealthLogService.js} +2 -2
  303. package/build/dist/Server/Services/InstanceHealthLogService.js.map +1 -0
  304. package/build/dist/Server/Services/LlmLogService.js +23 -0
  305. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  306. package/build/dist/Server/Services/LlmProviderService.js +96 -0
  307. package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
  308. package/build/dist/Server/Services/MetricBaselineService.js +65 -0
  309. package/build/dist/Server/Services/MetricBaselineService.js.map +1 -1
  310. package/build/dist/Server/Services/MonitorService.js +9 -1
  311. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  312. package/build/dist/Server/Services/TelemetryExceptionService.js +243 -82
  313. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  314. package/build/dist/Server/Services/TraceAggregationService.js +124 -0
  315. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  316. package/build/dist/Server/Types/Workflow/ComponentCode.js.map +1 -1
  317. package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js +240 -0
  318. package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js.map +1 -0
  319. package/build/dist/Server/Types/Workflow/Components/Index.js +2 -0
  320. package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
  321. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +48 -0
  322. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -0
  323. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +174 -0
  324. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -0
  325. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js +126 -0
  326. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js.map +1 -0
  327. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +131 -0
  328. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -0
  329. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js +99 -0
  330. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js.map +1 -0
  331. package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js +245 -0
  332. package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js.map +1 -0
  333. package/build/dist/Server/Utils/AI/Eval/EvalScores.js +83 -0
  334. package/build/dist/Server/Utils/AI/Eval/EvalScores.js.map +1 -0
  335. package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js +12 -0
  336. package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js.map +1 -0
  337. package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +439 -0
  338. package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -0
  339. package/build/dist/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.js → SRE/AIInvestigationEngine.js} +47 -31
  340. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -0
  341. package/build/dist/Server/Utils/AI/{Sentinel/SentinelMemory.js → SRE/AIMemory.js} +5 -5
  342. package/build/dist/Server/Utils/AI/SRE/AIMemory.js.map +1 -0
  343. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.js +42 -19
  344. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -0
  345. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +226 -0
  346. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -0
  347. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +100 -0
  348. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -0
  349. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js +174 -0
  350. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js.map +1 -0
  351. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.js +60 -22
  352. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -0
  353. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.js +9 -9
  354. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -0
  355. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js +268 -0
  356. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js.map +1 -0
  357. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +226 -0
  358. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -0
  359. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js +26 -0
  360. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js.map +1 -0
  361. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js +159 -0
  362. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js.map +1 -0
  363. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +177 -0
  364. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -0
  365. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js +384 -0
  366. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js.map +1 -0
  367. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js +180 -0
  368. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -0
  369. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +269 -0
  370. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js.map +1 -0
  371. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +231 -0
  372. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -0
  373. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +206 -0
  374. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -0
  375. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js +121 -0
  376. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js.map +1 -0
  377. package/build/dist/Server/Utils/AI/SRE/Insights/Types.js +2 -0
  378. package/build/dist/Server/Utils/AI/SRE/Insights/Types.js.map +1 -0
  379. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +148 -0
  380. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -0
  381. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +231 -0
  382. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -0
  383. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.js +102 -23
  384. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -0
  385. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +167 -0
  386. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -0
  387. package/build/dist/Server/Utils/AI/Toolbox/{SentinelActionTools.js → AIActionTools.js} +18 -2
  388. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -0
  389. package/build/dist/Server/Utils/AI/Toolbox/Index.js +2 -2
  390. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  391. package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js +301 -0
  392. package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js.map +1 -0
  393. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +240 -2
  394. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  395. package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js +127 -0
  396. package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js.map +1 -0
  397. package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js +336 -0
  398. package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js.map +1 -0
  399. package/build/dist/Server/Utils/Execute.js.map +1 -1
  400. package/build/dist/Server/Utils/LLM/LLMService.js +125 -25
  401. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  402. package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js +120 -0
  403. package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js.map +1 -0
  404. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -0
  405. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  406. package/build/dist/Types/AI/AIInsightEvidence.js +2 -0
  407. package/build/dist/Types/AI/AIInsightEvidence.js.map +1 -0
  408. package/build/dist/Types/AI/AIInsightHumanVerdict.js +16 -0
  409. package/build/dist/Types/AI/AIInsightHumanVerdict.js.map +1 -0
  410. package/build/dist/Types/AI/AIInsightSeverity.js +14 -0
  411. package/build/dist/Types/AI/AIInsightSeverity.js.map +1 -0
  412. package/build/dist/Types/AI/AIInsightStatus.js +36 -0
  413. package/build/dist/Types/AI/AIInsightStatus.js.map +1 -0
  414. package/build/dist/Types/AI/AIInsightType.js +42 -0
  415. package/build/dist/Types/AI/AIInsightType.js.map +1 -0
  416. package/build/dist/Types/AI/AIRunAutoGrade.js +19 -0
  417. package/build/dist/Types/AI/AIRunAutoGrade.js.map +1 -0
  418. package/build/dist/Types/AI/AIRunEventType.js +5 -0
  419. package/build/dist/Types/AI/AIRunEventType.js.map +1 -1
  420. package/build/dist/Types/AI/AIRunHumanVerdict.js +18 -0
  421. package/build/dist/Types/AI/AIRunHumanVerdict.js.map +1 -0
  422. package/build/dist/Types/AI/AIRunType.js +6 -0
  423. package/build/dist/Types/AI/AIRunType.js.map +1 -1
  424. package/build/dist/Types/AI/CodeFixTaskContext.js +29 -0
  425. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -0
  426. package/build/dist/Types/AI/CodeFixTaskType.js +122 -0
  427. package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -0
  428. package/build/dist/Types/AI/FixPullRequestCiStatus.js +102 -0
  429. package/build/dist/Types/AI/FixPullRequestCiStatus.js.map +1 -0
  430. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +55 -0
  431. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
  432. package/build/dist/Types/Incident/IncidentMetricType.js +7 -0
  433. package/build/dist/Types/Incident/IncidentMetricType.js.map +1 -1
  434. package/build/dist/Types/Monitor/CriteriaFilter.js +7 -0
  435. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  436. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +62 -0
  437. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  438. package/build/dist/Types/Monitor/MonitorStep.js +28 -0
  439. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  440. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +93 -0
  441. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -0
  442. package/build/dist/Types/Monitor/MonitorType.js +15 -0
  443. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  444. package/build/dist/Types/Monitor/SqlDatabaseType.js +47 -0
  445. package/build/dist/Types/Monitor/SqlDatabaseType.js.map +1 -0
  446. package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js +2 -0
  447. package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js.map +1 -0
  448. package/build/dist/Types/Permission.js +10 -84
  449. package/build/dist/Types/Permission.js.map +1 -1
  450. package/build/dist/Types/Runbook/RunbookStepType.js +1 -0
  451. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  452. package/build/dist/Types/Workflow/ComponentID.js +1 -0
  453. package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
  454. package/build/dist/Types/Workflow/Components/AI.js +135 -0
  455. package/build/dist/Types/Workflow/Components/AI.js.map +1 -0
  456. package/build/dist/Types/Workflow/Components.js +7 -0
  457. package/build/dist/Types/Workflow/Components.js.map +1 -1
  458. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -1
  459. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
  460. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +9 -0
  461. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  462. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +1 -1
  463. package/build/dist/UI/Components/Table/Table.js +28 -2
  464. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  465. package/build/dist/UI/Utils/TableColumnsToCsv.js +291 -0
  466. package/build/dist/UI/Utils/TableColumnsToCsv.js.map +1 -0
  467. package/build/dist/Utils/Monitor/MonitorMetricType.js +1 -0
  468. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  469. package/package.json +1 -1
  470. package/Models/DatabaseModels/AIAgentTask.ts +0 -660
  471. package/Models/DatabaseModels/AIAgentTaskLog.ts +0 -426
  472. package/Models/DatabaseModels/AIAgentTaskTelemetryException.ts +0 -399
  473. package/Models/DatabaseModels/ServiceCodeRepository.ts +0 -647
  474. package/Server/Services/AIAgentTaskService.ts +0 -240
  475. package/Server/Services/AIAgentTaskTelemetryExceptionService.ts +0 -39
  476. package/Server/Services/ServiceCodeRepositoryService.ts +0 -55
  477. package/Tests/Server/Services/AIAgentTaskServiceClaim.test.ts +0 -146
  478. package/Types/AI/AIAgentTaskMetadata.ts +0 -25
  479. package/Types/AI/AIAgentTaskType.ts +0 -40
  480. package/build/dist/Models/DatabaseModels/AIAgentTask.js +0 -691
  481. package/build/dist/Models/DatabaseModels/AIAgentTask.js.map +0 -1
  482. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js +0 -447
  483. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js.map +0 -1
  484. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js +0 -415
  485. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js.map +0 -1
  486. package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js +0 -665
  487. package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js.map +0 -1
  488. package/build/dist/Server/Services/AIAgentTaskLogService.js.map +0 -1
  489. package/build/dist/Server/Services/AIAgentTaskService.js +0 -217
  490. package/build/dist/Server/Services/AIAgentTaskService.js.map +0 -1
  491. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js +0 -36
  492. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js.map +0 -1
  493. package/build/dist/Server/Services/ServiceCodeRepositoryService.js +0 -54
  494. package/build/dist/Server/Services/ServiceCodeRepositoryService.js.map +0 -1
  495. package/build/dist/Server/Utils/AI/Sentinel/AlertInvestigationRunner.js.map +0 -1
  496. package/build/dist/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.js.map +0 -1
  497. package/build/dist/Server/Utils/AI/Sentinel/IncidentPostmortemRunner.js.map +0 -1
  498. package/build/dist/Server/Utils/AI/Sentinel/InvestigationQueue.js.map +0 -1
  499. package/build/dist/Server/Utils/AI/Sentinel/SentinelInvestigationEngine.js.map +0 -1
  500. package/build/dist/Server/Utils/AI/Sentinel/SentinelMemory.js.map +0 -1
  501. package/build/dist/Server/Utils/AI/Toolbox/SentinelActionTools.js.map +0 -1
  502. package/build/dist/Types/AI/AIAgentTaskMetadata.js +0 -6
  503. package/build/dist/Types/AI/AIAgentTaskMetadata.js.map +0 -1
  504. package/build/dist/Types/AI/AIAgentTaskType.js +0 -29
  505. package/build/dist/Types/AI/AIAgentTaskType.js.map +0 -1
@@ -1,10 +1,219 @@
1
1
  import DatabaseService from "./DatabaseService";
2
2
  import Model from "../../Models/DatabaseModels/CodeRepository";
3
+ import ObjectID from "../../Types/ObjectID";
4
+ import LIMIT_MAX from "../../Types/Database/LimitMax";
5
+ import CodeRepositoryType from "../../Types/CodeRepository/CodeRepositoryType";
6
+ import URL from "../../Types/API/URL";
7
+ import logger from "../Utils/Logger";
8
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
9
+ import {
10
+ RepoResolution,
11
+ ResolvableRepository,
12
+ resolveRepositoryForExceptionFix,
13
+ } from "../Utils/CodeRepository/StackTraceRepoResolver";
14
+ import GitHubUtil, {
15
+ GitHubRepository,
16
+ } from "../Utils/CodeRepository/GitHub/GitHub";
17
+
18
+ export interface ImportReposFromInstallationResult {
19
+ imported: number;
20
+ skipped: number;
21
+ }
3
22
 
4
23
  export class Service extends DatabaseService<Model> {
5
24
  public constructor() {
6
25
  super(Model);
7
26
  }
27
+
28
+ /*
29
+ * Imports all repositories accessible to a GitHub App installation into a
30
+ * project. Repositories that already exist for the project (matched on
31
+ * organizationName + repositoryName) are skipped. Never deletes anything.
32
+ */
33
+ @CaptureSpan()
34
+ public async importReposFromInstallation(data: {
35
+ projectId: ObjectID;
36
+ installationId: string;
37
+ }): Promise<ImportReposFromInstallationResult> {
38
+ const installationRepositories: Array<GitHubRepository> =
39
+ await GitHubUtil.listRepositoriesForInstallation(data.installationId);
40
+
41
+ // Fetch existing repositories once so we can skip duplicates and de-dupe display names.
42
+ const existingRepositories: Array<Model> = await this.findBy({
43
+ query: {
44
+ projectId: data.projectId,
45
+ },
46
+ select: {
47
+ _id: true,
48
+ name: true,
49
+ organizationName: true,
50
+ repositoryName: true,
51
+ },
52
+ limit: LIMIT_MAX,
53
+ skip: 0,
54
+ props: {
55
+ isRoot: true,
56
+ },
57
+ });
58
+
59
+ const existingRepositoryKeys: Set<string> = new Set<string>(
60
+ existingRepositories.map((repository: Model) => {
61
+ return `${repository.organizationName?.toLowerCase()}/${repository.repositoryName?.toLowerCase()}`;
62
+ }),
63
+ );
64
+
65
+ const existingDisplayNames: Set<string> = new Set<string>(
66
+ existingRepositories
67
+ .map((repository: Model) => {
68
+ return repository.name?.toLowerCase() || "";
69
+ })
70
+ .filter((name: string) => {
71
+ return Boolean(name);
72
+ }),
73
+ );
74
+
75
+ let imported: number = 0;
76
+ let skipped: number = 0;
77
+
78
+ for (const repository of installationRepositories) {
79
+ const repositoryKey: string = `${repository.ownerLogin.toLowerCase()}/${repository.name.toLowerCase()}`;
80
+
81
+ if (existingRepositoryKeys.has(repositoryKey)) {
82
+ skipped++;
83
+ continue;
84
+ }
85
+
86
+ /*
87
+ * Display name is unique per project. If a repository with the same
88
+ * name exists (e.g. same repo name in a different org), fall back to
89
+ * the org-qualified name, then a numeric suffix.
90
+ */
91
+ let displayName: string = repository.name;
92
+
93
+ if (existingDisplayNames.has(displayName.toLowerCase())) {
94
+ displayName = repository.fullName;
95
+ }
96
+
97
+ let suffix: number = 2;
98
+
99
+ while (existingDisplayNames.has(displayName.toLowerCase())) {
100
+ displayName = `${repository.fullName} (${suffix})`;
101
+ suffix++;
102
+ }
103
+
104
+ const codeRepository: Model = new Model();
105
+ codeRepository.projectId = data.projectId;
106
+ codeRepository.name = displayName;
107
+ codeRepository.repositoryHostedAt = CodeRepositoryType.GitHub;
108
+ codeRepository.organizationName = repository.ownerLogin;
109
+ codeRepository.repositoryName = repository.name;
110
+ codeRepository.mainBranchName = repository.defaultBranch || "main";
111
+ codeRepository.gitHubAppInstallationId = data.installationId;
112
+
113
+ if (repository.htmlUrl) {
114
+ codeRepository.repositoryUrl = URL.fromString(repository.htmlUrl);
115
+ }
116
+
117
+ if (repository.description) {
118
+ codeRepository.description = repository.description;
119
+ }
120
+
121
+ try {
122
+ await this.create({
123
+ data: codeRepository,
124
+ props: {
125
+ isRoot: true,
126
+ },
127
+ });
128
+
129
+ existingRepositoryKeys.add(repositoryKey);
130
+ existingDisplayNames.add(displayName.toLowerCase());
131
+ imported++;
132
+ } catch (error) {
133
+ // One bad repository should not abort the whole import.
134
+ logger.error(
135
+ `Failed to import repository ${repository.fullName} from GitHub App installation ${data.installationId} into project ${data.projectId.toString()}:`,
136
+ );
137
+ logger.error(error);
138
+ skipped++;
139
+ }
140
+ }
141
+
142
+ return { imported, skipped };
143
+ }
144
+
145
+ /*
146
+ * Resolve which of the project's repositories an exception's code lives
147
+ * in, AT RUNTIME — stack-trace path matching over cached git trees, with
148
+ * exact-name-match and only-repository fallbacks. This replaces the old
149
+ * manual ServiceCodeRepository mapping table.
150
+ */
151
+ @CaptureSpan()
152
+ public async resolveRepositoryForException(data: {
153
+ projectId: ObjectID;
154
+ stackTrace: string | null;
155
+ serviceName: string | null;
156
+ }): Promise<RepoResolution | null> {
157
+ const repositories: Array<Model> = await this.findBy({
158
+ query: {
159
+ projectId: data.projectId,
160
+ },
161
+ select: {
162
+ _id: true,
163
+ name: true,
164
+ organizationName: true,
165
+ repositoryName: true,
166
+ mainBranchName: true,
167
+ gitHubAppInstallationId: true,
168
+ repositoryHostedAt: true,
169
+ },
170
+ skip: 0,
171
+ limit: LIMIT_MAX,
172
+ props: {
173
+ isRoot: true,
174
+ },
175
+ });
176
+
177
+ // Only GitHub-App-connected repos can be cloned/pushed by the agent.
178
+ const resolvable: Array<ResolvableRepository> = repositories
179
+ .filter((repository: Model) => {
180
+ return (
181
+ repository.repositoryHostedAt === CodeRepositoryType.GitHub &&
182
+ Boolean(repository.gitHubAppInstallationId) &&
183
+ Boolean(repository.id)
184
+ );
185
+ })
186
+ .map((repository: Model) => {
187
+ return {
188
+ id: repository.id!.toString(),
189
+ name: repository.name || "",
190
+ organizationName: repository.organizationName || "",
191
+ repositoryName: repository.repositoryName || "",
192
+ mainBranchName: repository.mainBranchName || "main",
193
+ gitHubAppInstallationId: repository.gitHubAppInstallationId || null,
194
+ };
195
+ });
196
+
197
+ if (resolvable.length === 0) {
198
+ return null;
199
+ }
200
+
201
+ return resolveRepositoryForExceptionFix({
202
+ stackTrace: data.stackTrace,
203
+ serviceName: data.serviceName,
204
+ repositories: resolvable,
205
+ getTreePaths: (
206
+ repository: ResolvableRepository,
207
+ ): Promise<Array<string>> => {
208
+ return GitHubUtil.getRepositoryTreePaths({
209
+ installationId: repository.gitHubAppInstallationId!,
210
+ organizationName: repository.organizationName,
211
+ repositoryName: repository.repositoryName,
212
+ branchName: repository.mainBranchName,
213
+ });
214
+ },
215
+ });
216
+ }
8
217
  }
9
218
 
10
219
  export default new Service();
@@ -4,6 +4,8 @@ import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
4
4
  import ObjectID from "../../Types/ObjectID";
5
5
  import { OnUpdate } from "../Types/Database/Hooks";
6
6
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
7
+ import UpdateBy from "../Types/Database/UpdateBy";
8
+ import BadDataException from "../../Types/Exception/BadDataException";
7
9
 
8
10
  export class Service extends DatabaseService<Model> {
9
11
  /*
@@ -41,6 +43,152 @@ export class Service extends DatabaseService<Model> {
41
43
  return value;
42
44
  }
43
45
 
46
+ @CaptureSpan()
47
+ protected override async onBeforeUpdate(
48
+ updateBy: UpdateBy<Model>,
49
+ ): Promise<OnUpdate<Model>> {
50
+ const capacitySettingKeys: Array<keyof Model> = [
51
+ "clickhouseCapacityNotificationEnabled",
52
+ "clickhouseCapacityNotificationThresholdPercent",
53
+ "clickhouseDataPruningEnabled",
54
+ "clickhouseDataPruningThresholdPercent",
55
+ "clickhouseDataPruningTargetPercent",
56
+ ];
57
+
58
+ const isCapacitySettingUpdate: boolean = capacitySettingKeys.some(
59
+ (key: keyof Model): boolean => {
60
+ return updateBy.data[key] !== undefined;
61
+ },
62
+ );
63
+
64
+ if (!isCapacitySettingUpdate) {
65
+ return {
66
+ updateBy,
67
+ carryForward: null,
68
+ };
69
+ }
70
+
71
+ /*
72
+ * GlobalConfig updates are partial. Load the current singleton values so
73
+ * cross-field validation still compares the effective pruning threshold
74
+ * and target when the request changes only one of them.
75
+ */
76
+ const currentConfig: Model | null = await this.findOneBy({
77
+ query: updateBy.query,
78
+ select: {
79
+ clickhouseCapacityNotificationThresholdPercent: true,
80
+ clickhouseDataPruningThresholdPercent: true,
81
+ clickhouseDataPruningTargetPercent: true,
82
+ },
83
+ props: {
84
+ isRoot: true,
85
+ },
86
+ });
87
+
88
+ const normalizePercent: (value: unknown, fieldName: string) => number = (
89
+ value: unknown,
90
+ fieldName: string,
91
+ ): number => {
92
+ let normalizedValue: unknown = value;
93
+
94
+ if (typeof normalizedValue === "string") {
95
+ const trimmedValue: string = normalizedValue.trim();
96
+ normalizedValue =
97
+ trimmedValue === "" ? Number.NaN : Number(trimmedValue);
98
+ }
99
+
100
+ if (
101
+ typeof normalizedValue !== "number" ||
102
+ !Number.isFinite(normalizedValue) ||
103
+ !Number.isInteger(normalizedValue) ||
104
+ normalizedValue < 1 ||
105
+ normalizedValue > 100
106
+ ) {
107
+ throw new BadDataException(
108
+ `${fieldName} must be an integer between 1 and 100.`,
109
+ );
110
+ }
111
+
112
+ return normalizedValue;
113
+ };
114
+
115
+ if (
116
+ updateBy.data.clickhouseCapacityNotificationThresholdPercent !== undefined
117
+ ) {
118
+ updateBy.data.clickhouseCapacityNotificationThresholdPercent =
119
+ normalizePercent(
120
+ updateBy.data
121
+ .clickhouseCapacityNotificationThresholdPercent as unknown,
122
+ "ClickHouse capacity notification threshold",
123
+ );
124
+ }
125
+
126
+ if (updateBy.data.clickhouseDataPruningThresholdPercent !== undefined) {
127
+ updateBy.data.clickhouseDataPruningThresholdPercent = normalizePercent(
128
+ updateBy.data.clickhouseDataPruningThresholdPercent as unknown,
129
+ "ClickHouse data pruning threshold",
130
+ );
131
+ }
132
+
133
+ if (updateBy.data.clickhouseDataPruningTargetPercent !== undefined) {
134
+ updateBy.data.clickhouseDataPruningTargetPercent = normalizePercent(
135
+ updateBy.data.clickhouseDataPruningTargetPercent as unknown,
136
+ "ClickHouse data pruning target",
137
+ );
138
+ }
139
+
140
+ const getEffectivePercent: (
141
+ updatedValue: unknown,
142
+ currentValue: number | undefined,
143
+ defaultValue: number,
144
+ fieldName: string,
145
+ ) => number = (
146
+ updatedValue: unknown,
147
+ currentValue: number | undefined,
148
+ defaultValue: number,
149
+ fieldName: string,
150
+ ): number => {
151
+ const value: unknown =
152
+ updatedValue !== undefined
153
+ ? updatedValue
154
+ : currentValue ?? defaultValue;
155
+
156
+ return normalizePercent(value, fieldName);
157
+ };
158
+
159
+ getEffectivePercent(
160
+ updateBy.data.clickhouseCapacityNotificationThresholdPercent,
161
+ currentConfig?.clickhouseCapacityNotificationThresholdPercent,
162
+ 80,
163
+ "ClickHouse capacity notification threshold",
164
+ );
165
+
166
+ const pruningThresholdPercent: number = getEffectivePercent(
167
+ updateBy.data.clickhouseDataPruningThresholdPercent,
168
+ currentConfig?.clickhouseDataPruningThresholdPercent,
169
+ 90,
170
+ "ClickHouse data pruning threshold",
171
+ );
172
+
173
+ const pruningTargetPercent: number = getEffectivePercent(
174
+ updateBy.data.clickhouseDataPruningTargetPercent,
175
+ currentConfig?.clickhouseDataPruningTargetPercent,
176
+ 80,
177
+ "ClickHouse data pruning target",
178
+ );
179
+
180
+ if (pruningTargetPercent >= pruningThresholdPercent) {
181
+ throw new BadDataException(
182
+ "ClickHouse data pruning target must be lower than the pruning threshold.",
183
+ );
184
+ }
185
+
186
+ return {
187
+ updateBy,
188
+ carryForward: null,
189
+ };
190
+ }
191
+
44
192
  @CaptureSpan()
45
193
  protected override async onUpdateSuccess(
46
194
  onUpdate: OnUpdate<Model>,
@@ -6,6 +6,9 @@ import FindBy from "../Types/Database/FindBy";
6
6
  import { OnCreate, OnDelete, OnFind, OnUpdate } from "../Types/Database/Hooks";
7
7
  import QueryHelper from "../Types/Database/QueryHelper";
8
8
  import DatabaseService from "./DatabaseService";
9
+ import AIRunService from "./AIRunService";
10
+ import AIRunType from "../../Types/AI/AIRunType";
11
+ import AIRunStatus from "../../Types/AI/AIRunStatus";
9
12
  import IncidentOwnerTeamService from "./IncidentOwnerTeamService";
10
13
  import IncidentOwnerUserService from "./IncidentOwnerUserService";
11
14
  import IncidentStateService from "./IncidentStateService";
@@ -84,7 +87,7 @@ import ProjectService from "./ProjectService";
84
87
  import IncidentTemplateService from "./IncidentTemplateService";
85
88
  import IncidentTemplate from "../../Models/DatabaseModels/IncidentTemplate";
86
89
  import AIService, { AILogResponse } from "./AIService";
87
- import SentinelIncidentInvestigationRunner from "../Utils/AI/Sentinel/IncidentInvestigationRunner";
90
+ import AIIncidentInvestigationRunner from "../Utils/AI/SRE/IncidentInvestigationRunner";
88
91
  import IncidentAIContextBuilder, {
89
92
  AIGenerationContext,
90
93
  IncidentContextData,
@@ -1239,21 +1242,21 @@ export class Service extends DatabaseService<Model> {
1239
1242
  })
1240
1243
  .then(async () => {
1241
1244
  /*
1242
- * Sentinel (AI SRE): automatically investigate the new incident and post
1245
+ * AI (AI SRE): automatically investigate the new incident and post
1243
1246
  * a cited root cause analysis to the incident timeline + Slack/Teams.
1244
1247
  * Runs last so the workspace channels already exist, and is gated per
1245
1248
  * project (opt-in) + requires a configured LLM provider. Read-only.
1246
1249
  */
1247
1250
  try {
1248
1251
  if (createdItem.projectId && createdItem.id) {
1249
- await SentinelIncidentInvestigationRunner.investigateNewIncident({
1252
+ await AIIncidentInvestigationRunner.investigateNewIncident({
1250
1253
  incidentId: createdItem.id,
1251
1254
  projectId: createdItem.projectId,
1252
1255
  });
1253
1256
  }
1254
1257
  } catch (error) {
1255
1258
  logger.error(
1256
- `Sentinel incident investigation failed in IncidentService.onCreateSuccess: ${error}`,
1259
+ `AI incident investigation failed in IncidentService.onCreateSuccess: ${error}`,
1257
1260
  {
1258
1261
  projectId: createdItem.projectId?.toString(),
1259
1262
  incidentId: createdItem.id?.toString(),
@@ -2795,14 +2798,23 @@ ${incidentSeverity.name}
2795
2798
  return Service.DEFAULT_METRIC_RETENTION_DAYS;
2796
2799
  }
2797
2800
 
2801
+ /*
2802
+ * Load the incident + its owners and build the attribute set shared by
2803
+ * every incident metric (all values strings for ClickHouse
2804
+ * Map(String, String) storage; arrays joined comma-separated). Factored
2805
+ * out of refreshIncidentMetrics so one-off metric writers — e.g. the
2806
+ * AI time-to-rca metric recorded when an investigation posts its
2807
+ * analysis — record the exact same attribute shape.
2808
+ */
2798
2809
  @CaptureSpan()
2799
- public async refreshIncidentMetrics(data: {
2810
+ public async getIncidentMetricContext(data: {
2800
2811
  incidentId: ObjectID;
2801
- }): Promise<void> {
2812
+ }): Promise<{ incident: Model; baseMetricAttributes: JSONObject }> {
2802
2813
  const incident: Model | null = await this.findOneById({
2803
2814
  id: data.incidentId,
2804
2815
  select: {
2805
2816
  projectId: true,
2817
+ createdAt: true,
2806
2818
  declaredAt: true,
2807
2819
  postmortemPostedAt: true,
2808
2820
  monitors: {
@@ -2898,6 +2910,161 @@ ${incidentSeverity.name}
2898
2910
  return Boolean(name);
2899
2911
  }) as Array<string>;
2900
2912
 
2913
+ /*
2914
+ * common attributes shared by all incident metrics
2915
+ * All values must be strings for ClickHouse Map(String, String) storage.
2916
+ * Arrays are joined as comma-separated strings.
2917
+ */
2918
+ const baseMetricAttributes: JSONObject = {
2919
+ incidentId: data.incidentId.toString(),
2920
+ projectId: incident.projectId.toString(),
2921
+ monitorIds: (
2922
+ incident.monitors
2923
+ ?.map((monitor: Monitor) => {
2924
+ return monitor._id?.toString();
2925
+ })
2926
+ .filter(Boolean) || []
2927
+ ).join(", "),
2928
+ monitorNames: (
2929
+ incident.monitors
2930
+ ?.map((monitor: Monitor) => {
2931
+ return monitor.name?.toString();
2932
+ })
2933
+ .filter(Boolean) || []
2934
+ ).join(", "),
2935
+ incidentSeverityId: incident.incidentSeverity?._id?.toString(),
2936
+ incidentSeverityName: incident.incidentSeverity?.name?.toString(),
2937
+ ownerUserIds: ownerUserIds.join(", "),
2938
+ ownerUserNames: ownerUserNames.join(", "),
2939
+ ownerTeamIds: ownerTeamIds.join(", "),
2940
+ ownerTeamNames: ownerTeamNames.join(", "),
2941
+ };
2942
+
2943
+ return { incident, baseMetricAttributes };
2944
+ }
2945
+
2946
+ /*
2947
+ * AI measurement layer: record how long the incident waited for its
2948
+ * AI root-cause analysis — seconds from incident creation to now, written
2949
+ * once from IncidentInvestigationRunner.postAnalysis. Deliberately NOT
2950
+ * part of refreshIncidentMetrics: the refresh's replace-list excludes
2951
+ * this metric name, so refreshes never tombstone it.
2952
+ */
2953
+ @CaptureSpan()
2954
+ public async recordTimeToRootCausePostedMetric(data: {
2955
+ incidentId: ObjectID;
2956
+ }): Promise<void> {
2957
+ const {
2958
+ incident,
2959
+ baseMetricAttributes,
2960
+ }: { incident: Model; baseMetricAttributes: JSONObject } =
2961
+ await this.getIncidentMetricContext({ incidentId: data.incidentId });
2962
+
2963
+ const now: Date = OneUptimeDate.getCurrentDate();
2964
+ const incidentCreatedAt: Date =
2965
+ incident.createdAt || incident.declaredAt || now;
2966
+
2967
+ const metricRetentionDays: number = await this.getMetricRetentionDays();
2968
+ const retentionDate: Date = OneUptimeDate.addRemoveDays(
2969
+ OneUptimeDate.getCurrentDate(),
2970
+ metricRetentionDays,
2971
+ );
2972
+
2973
+ const timeToRcaMetric: MutableMetric = new MutableMetric();
2974
+
2975
+ timeToRcaMetric.projectId = incident.projectId!;
2976
+ timeToRcaMetric.primaryEntityId = incident.id!;
2977
+ timeToRcaMetric.primaryEntityType = ServiceType.Incident;
2978
+ timeToRcaMetric.name = IncidentMetricType.TimeToRootCausePosted;
2979
+ timeToRcaMetric.metricPointId = IncidentMetricType.TimeToRootCausePosted;
2980
+ timeToRcaMetric.value = OneUptimeDate.getDifferenceInSeconds(
2981
+ now,
2982
+ incidentCreatedAt,
2983
+ );
2984
+ timeToRcaMetric.attributes = {
2985
+ ...baseMetricAttributes,
2986
+ // Every time-to-rca point is AI-posted by construction.
2987
+ aiInvestigated: "true",
2988
+ };
2989
+ timeToRcaMetric.attributeKeys = TelemetryUtil.getAttributeKeys(
2990
+ timeToRcaMetric.attributes,
2991
+ );
2992
+ timeToRcaMetric.time = now;
2993
+ timeToRcaMetric.timeUnixNano = OneUptimeDate.toUnixNano(now);
2994
+ timeToRcaMetric.metricPointType = MetricPointType.Sum;
2995
+ timeToRcaMetric.retentionDate = retentionDate;
2996
+
2997
+ await MutableMetricService.createMutableMetrics({
2998
+ metrics: [timeToRcaMetric],
2999
+ });
3000
+
3001
+ // Register the metric type so it shows up in the type catalog.
3002
+ const metricType: MetricType = new MetricType();
3003
+ metricType.name = IncidentMetricType.TimeToRootCausePosted;
3004
+ metricType.description =
3005
+ "Time from incident creation to the AI investigation's posted root-cause analysis";
3006
+ metricType.unit = "seconds";
3007
+
3008
+ TelemetryUtil.indexMetricNameServiceNameMap({
3009
+ metricNameServiceNameMap: {
3010
+ [IncidentMetricType.TimeToRootCausePosted]: metricType,
3011
+ },
3012
+ projectId: incident.projectId!,
3013
+ }).catch((err: Error) => {
3014
+ logger.error(err, {
3015
+ projectId: incident.projectId?.toString(),
3016
+ incidentId: incident.id?.toString(),
3017
+ } as LogAttributes);
3018
+ });
3019
+ }
3020
+
3021
+ @CaptureSpan()
3022
+ public async refreshIncidentMetrics(data: {
3023
+ incidentId: ObjectID;
3024
+ }): Promise<void> {
3025
+ const {
3026
+ incident,
3027
+ baseMetricAttributes,
3028
+ }: { incident: Model; baseMetricAttributes: JSONObject } =
3029
+ await this.getIncidentMetricContext({ incidentId: data.incidentId });
3030
+
3031
+ // getIncidentMetricContext guarantees this; re-checked for TS narrowing.
3032
+ if (!incident.projectId) {
3033
+ throw new BadDataException("Incident Project ID not found");
3034
+ }
3035
+
3036
+ /*
3037
+ * aiInvestigated dimension for MTTA/MTTR (AI measurement layer):
3038
+ * did a completed AI investigation run for this incident? One
3039
+ * indexed countBy per metric refresh (triggeredByIncidentId is indexed)
3040
+ * — acceptable at refresh frequency. Failure must never break metric
3041
+ * recording, so this is best-effort false.
3042
+ */
3043
+ let aiInvestigated: boolean = false;
3044
+ try {
3045
+ const completedInvestigationCount: PositiveNumber =
3046
+ await AIRunService.countBy({
3047
+ query: {
3048
+ runType: AIRunType.Investigation,
3049
+ status: AIRunStatus.Completed,
3050
+ triggeredByIncidentId: data.incidentId,
3051
+ },
3052
+ props: {
3053
+ isRoot: true,
3054
+ },
3055
+ });
3056
+
3057
+ aiInvestigated = completedInvestigationCount.toNumber() > 0;
3058
+ } catch (err) {
3059
+ logger.error(
3060
+ err as Error,
3061
+ {
3062
+ projectId: incident.projectId?.toString(),
3063
+ incidentId: incident.id?.toString(),
3064
+ } as LogAttributes,
3065
+ );
3066
+ }
3067
+
2901
3068
  // get incident state timeline
2902
3069
 
2903
3070
  const incidentStateTimelines: Array<IncidentStateTimeline> =
@@ -2973,36 +3140,6 @@ ${incidentSeverity.name}
2973
3140
 
2974
3141
  const metricTypesMap: Dictionary<MetricType> = {};
2975
3142
 
2976
- /*
2977
- * common attributes shared by all incident metrics
2978
- * All values must be strings for ClickHouse Map(String, String) storage.
2979
- * Arrays are joined as comma-separated strings.
2980
- */
2981
- const baseMetricAttributes: JSONObject = {
2982
- incidentId: data.incidentId.toString(),
2983
- projectId: incident.projectId.toString(),
2984
- monitorIds: (
2985
- incident.monitors
2986
- ?.map((monitor: Monitor) => {
2987
- return monitor._id?.toString();
2988
- })
2989
- .filter(Boolean) || []
2990
- ).join(", "),
2991
- monitorNames: (
2992
- incident.monitors
2993
- ?.map((monitor: Monitor) => {
2994
- return monitor.name?.toString();
2995
- })
2996
- .filter(Boolean) || []
2997
- ).join(", "),
2998
- incidentSeverityId: incident.incidentSeverity?._id?.toString(),
2999
- incidentSeverityName: incident.incidentSeverity?.name?.toString(),
3000
- ownerUserIds: ownerUserIds.join(", "),
3001
- ownerUserNames: ownerUserNames.join(", "),
3002
- ownerTeamIds: ownerTeamIds.join(", "),
3003
- ownerTeamNames: ownerTeamNames.join(", "),
3004
- };
3005
-
3006
3143
  const incidentCountMetric: MutableMetric = new MutableMetric();
3007
3144
 
3008
3145
  incidentCountMetric.projectId = incident.projectId;
@@ -3068,7 +3205,11 @@ ${incidentSeverity.name}
3068
3205
  OneUptimeDate.getCurrentDate(),
3069
3206
  incidentStartsAt,
3070
3207
  );
3071
- timeToAcknowledgeMetric.attributes = { ...baseMetricAttributes };
3208
+ // aiInvestigated: the MTTA with/without-AI dimension.
3209
+ timeToAcknowledgeMetric.attributes = {
3210
+ ...baseMetricAttributes,
3211
+ aiInvestigated: aiInvestigated.toString(),
3212
+ };
3072
3213
  timeToAcknowledgeMetric.attributeKeys =
3073
3214
  TelemetryUtil.getAttributeKeys(timeToAcknowledgeMetric.attributes);
3074
3215
 
@@ -3119,7 +3260,11 @@ ${incidentSeverity.name}
3119
3260
  OneUptimeDate.getCurrentDate(),
3120
3261
  incidentStartsAt,
3121
3262
  );
3122
- timeToResolveMetric.attributes = { ...baseMetricAttributes };
3263
+ // aiInvestigated: the MTTR with/without-AI dimension.
3264
+ timeToResolveMetric.attributes = {
3265
+ ...baseMetricAttributes,
3266
+ aiInvestigated: aiInvestigated.toString(),
3267
+ };
3123
3268
  timeToResolveMetric.attributeKeys = TelemetryUtil.getAttributeKeys(
3124
3269
  timeToResolveMetric.attributes,
3125
3270
  );