@oneuptime/common 11.5.4 → 11.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (505) hide show
  1. package/Models/DatabaseModels/AIAgentTaskPullRequest.ts +56 -45
  2. package/Models/DatabaseModels/AIInsight.ts +748 -0
  3. package/Models/DatabaseModels/AIRun.ts +262 -0
  4. package/Models/DatabaseModels/CodeRepository.ts +42 -0
  5. package/Models/DatabaseModels/GlobalConfig.ts +105 -0
  6. package/Models/DatabaseModels/Index.ts +4 -8
  7. package/Models/DatabaseModels/InstanceHealthLog.ts +277 -0
  8. package/Models/DatabaseModels/LlmLog.ts +33 -0
  9. package/Models/DatabaseModels/Project.ts +123 -6
  10. package/Models/DatabaseModels/Runbook.ts +1 -1
  11. package/Server/API/AIAgentDataAPI.ts +802 -140
  12. package/Server/API/AIAgentTaskAPI.ts +132 -69
  13. package/Server/API/AIAgentTaskLogAPI.ts +65 -41
  14. package/Server/API/AIAgentTaskPullRequestAPI.ts +41 -0
  15. package/Server/API/AIInsightAPI.ts +220 -0
  16. package/Server/API/AIInvestigationAPI.ts +363 -1
  17. package/Server/API/CodeFixRunAPI.ts +251 -0
  18. package/Server/API/GitHubAPI.ts +246 -3
  19. package/Server/API/TelemetryExceptionAPI.ts +193 -48
  20. package/Server/EnvironmentConfig.ts +1 -1
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.ts +26 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.ts +73 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.ts +29 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.ts +31 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.ts +51 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.ts +25 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.ts +47 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.ts +53 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.ts +31 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.ts +37 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.ts +25 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.ts +75 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.ts +37 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.ts +203 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.ts +163 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +30 -0
  37. package/Server/Infrastructure/Queue.ts +82 -4
  38. package/Server/Infrastructure/Semaphore.ts +62 -1
  39. package/Server/Services/AIAgentService.ts +32 -0
  40. package/Server/Services/AIAgentTaskPullRequestService.ts +117 -0
  41. package/Server/Services/AIInsightService.ts +174 -0
  42. package/Server/Services/AIRunEventService.ts +63 -0
  43. package/Server/Services/AIRunService.ts +259 -1
  44. package/Server/Services/AIService.ts +249 -7
  45. package/Server/Services/AlertService.ts +4 -4
  46. package/Server/Services/CodeRepositoryService.ts +209 -0
  47. package/Server/Services/GlobalConfigService.ts +148 -0
  48. package/Server/Services/IncidentService.ts +183 -38
  49. package/Server/Services/IncidentStateTimelineService.ts +24 -4
  50. package/Server/Services/Index.ts +4 -4
  51. package/Server/Services/{AIAgentTaskLogService.ts → InstanceHealthLogService.ts} +1 -1
  52. package/Server/Services/LlmLogService.ts +27 -0
  53. package/Server/Services/LlmProviderService.ts +108 -0
  54. package/Server/Services/MetricBaselineService.ts +123 -0
  55. package/Server/Services/MonitorService.ts +15 -0
  56. package/Server/Services/TelemetryExceptionService.ts +323 -116
  57. package/Server/Services/TraceAggregationService.ts +176 -0
  58. package/Server/Types/Workflow/ComponentCode.ts +6 -0
  59. package/Server/Types/Workflow/Components/AI/GenerateText.ts +326 -0
  60. package/Server/Types/Workflow/Components/Index.ts +2 -0
  61. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +1 -1
  62. package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +71 -0
  63. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +243 -0
  64. package/Server/Utils/AI/CodeFix/CodeFixRunQueue.ts +131 -0
  65. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +148 -0
  66. package/Server/Utils/AI/CodeFix/OpenPullRequestCap.ts +117 -0
  67. package/Server/Utils/AI/Eval/EvalCorpus.ts +369 -0
  68. package/Server/Utils/AI/Eval/EvalScores.ts +172 -0
  69. package/Server/Utils/AI/Eval/ReplayInvestigation.ts +87 -0
  70. package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +676 -0
  71. package/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.ts → SRE/AIInvestigationEngine.ts} +58 -37
  72. package/Server/Utils/AI/{Sentinel/SentinelMemory.ts → SRE/AIMemory.ts} +3 -3
  73. package/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.ts +50 -20
  74. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +293 -0
  75. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +115 -0
  76. package/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.ts +223 -0
  77. package/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.ts +71 -21
  78. package/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.ts +8 -8
  79. package/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.ts +364 -0
  80. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +317 -0
  81. package/Server/Utils/AI/SRE/Insights/Detectors/Index.ts +27 -0
  82. package/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.ts +221 -0
  83. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +238 -0
  84. package/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.ts +521 -0
  85. package/Server/Utils/AI/SRE/Insights/FixRouting.ts +242 -0
  86. package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +290 -0
  87. package/Server/Utils/AI/SRE/Insights/InsightStore.ts +283 -0
  88. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +242 -0
  89. package/Server/Utils/AI/SRE/Insights/Triage.ts +162 -0
  90. package/Server/Utils/AI/SRE/Insights/Types.ts +49 -0
  91. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +212 -0
  92. package/Server/Utils/AI/SRE/InvestigationGrader.ts +282 -0
  93. package/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.ts +114 -19
  94. package/Server/Utils/AI/{Sentinel → SRE}/README.md +4 -4
  95. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +172 -0
  96. package/Server/Utils/AI/Toolbox/{SentinelActionTools.ts → AIActionTools.ts} +22 -1
  97. package/Server/Utils/AI/Toolbox/Index.ts +2 -2
  98. package/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.ts +526 -0
  99. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +319 -1
  100. package/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.ts +221 -0
  101. package/Server/Utils/CodeRepository/StackTraceRepoResolver.ts +571 -0
  102. package/Server/Utils/Execute.ts +2 -1
  103. package/Server/Utils/LLM/LLMService.ts +160 -30
  104. package/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.ts +152 -0
  105. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +29 -0
  106. package/Tests/Server/Infrastructure/Queue.test.ts +227 -0
  107. package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +159 -0
  108. package/Tests/Server/Services/AIAgentTaskPullRequestOutcomeStats.test.ts +154 -0
  109. package/Tests/Server/Services/AIInsightService.test.ts +324 -0
  110. package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +401 -0
  111. package/Tests/Server/Services/AIRunHumanVerdict.test.ts +161 -0
  112. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +95 -5
  113. package/Tests/Server/Services/AIServiceProjectAccess.test.ts +259 -0
  114. package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +249 -0
  115. package/Tests/Server/Services/FixPerformanceTaskTrigger.test.ts +274 -0
  116. package/Tests/Server/Services/GlobalConfigService.test.ts +80 -0
  117. package/Tests/Server/Services/IncidentInternalNoteAnnouncement.test.ts +1 -1
  118. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +313 -0
  119. package/Tests/Server/Services/LlmProviderProjectOwned.test.ts +132 -0
  120. package/Tests/Server/Services/TelemetryExceptionAIFixReadiness.test.ts +405 -0
  121. package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +322 -0
  122. package/Tests/Server/Services/TraceServiceLatencyProfile.test.ts +278 -0
  123. package/Tests/Server/Types/Workflow/Components/AIGenerateText.test.ts +722 -0
  124. package/Tests/Server/Utils/AI/{SentinelAlertGating.test.ts → AIAlertGating.test.ts} +19 -19
  125. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +362 -0
  126. package/Tests/Server/Utils/AI/{SentinelInvestigationQueue.test.ts → AIInvestigationQueue.test.ts} +19 -19
  127. package/Tests/Server/Utils/AI/CodeAgentWorkspaceGuard.test.ts +138 -0
  128. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +335 -0
  129. package/Tests/Server/Utils/AI/CodeFixRunQueue.test.ts +134 -0
  130. package/Tests/Server/Utils/AI/EvalCorpus.test.ts +209 -0
  131. package/Tests/Server/Utils/AI/EvalScores.test.ts +343 -0
  132. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +218 -0
  133. package/Tests/Server/Utils/AI/Insights/ErrorLogSpikeDetector.test.ts +437 -0
  134. package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +287 -0
  135. package/Tests/Server/Utils/AI/Insights/InsightDetectorsIndex.test.ts +34 -0
  136. package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +572 -0
  137. package/Tests/Server/Utils/AI/Insights/InsightNeverThrowsHardening.test.ts +344 -0
  138. package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +720 -0
  139. package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +467 -0
  140. package/Tests/Server/Utils/AI/Insights/InsightStoreHardening.test.ts +370 -0
  141. package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +210 -0
  142. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +221 -0
  143. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +328 -0
  144. package/Tests/Server/Utils/AI/Insights/MetricBaselineDrift.test.ts +182 -0
  145. package/Tests/Server/Utils/AI/Insights/MetricDriftDetector.test.ts +280 -0
  146. package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +259 -0
  147. package/Tests/Server/Utils/AI/Insights/TraceLatencyRegressionDetector.test.ts +770 -0
  148. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +343 -0
  149. package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +307 -0
  150. package/Tests/Server/Utils/AI/OpenPullRequestCap.test.ts +170 -0
  151. package/Tests/Server/Utils/AI/SpanTreeAnalyzer.test.ts +559 -0
  152. package/Tests/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.test.ts +158 -0
  153. package/Tests/Server/Utils/GitHubCheckRunsConclusion.test.ts +100 -0
  154. package/Tests/Server/Utils/GitHubPullRequestStateMapping.test.ts +50 -0
  155. package/Tests/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.test.ts +266 -0
  156. package/Tests/Server/Utils/ServiceRepoLinkSuggester.test.ts +167 -0
  157. package/Tests/Server/Utils/StackTraceRepoResolver.test.ts +527 -0
  158. package/Tests/Types/AI/AIChatPermissionMode.test.ts +112 -0
  159. package/Tests/Types/AI/CodeFixTaskType.test.ts +152 -0
  160. package/Tests/Types/AI/FixPullRequestCiStatus.test.ts +181 -0
  161. package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +110 -0
  162. package/Tests/Types/Monitor/SqlDatabaseType.test.ts +55 -0
  163. package/Tests/Types/Workflow/AIGenerateTextMetadata.test.ts +180 -0
  164. package/Tests/UI/Components/TableBulkCsvExport.test.tsx +168 -0
  165. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +523 -0
  166. package/Types/AI/AIChatTypes.ts +8 -0
  167. package/Types/AI/AIInsightEvidence.ts +77 -0
  168. package/Types/AI/AIInsightHumanVerdict.ts +15 -0
  169. package/Types/AI/AIInsightSeverity.ts +13 -0
  170. package/Types/AI/AIInsightStatus.ts +38 -0
  171. package/Types/AI/AIInsightType.ts +41 -0
  172. package/Types/AI/AIRunAutoGrade.ts +18 -0
  173. package/Types/AI/AIRunEventType.ts +5 -0
  174. package/Types/AI/AIRunHumanVerdict.ts +17 -0
  175. package/Types/AI/AIRunType.ts +6 -0
  176. package/Types/AI/CodeFixTaskContext.ts +88 -0
  177. package/Types/AI/CodeFixTaskType.ts +132 -0
  178. package/Types/AI/FixPullRequestCiStatus.ts +132 -0
  179. package/Types/BaseDatabase/AggregationIntervalUtil.ts +67 -0
  180. package/Types/Incident/IncidentMetricType.ts +7 -0
  181. package/Types/Monitor/CriteriaFilter.ts +8 -0
  182. package/Types/Monitor/MonitorCriteriaInstance.ts +67 -0
  183. package/Types/Monitor/MonitorStep.ts +38 -0
  184. package/Types/Monitor/MonitorStepSqlMonitor.ts +141 -0
  185. package/Types/Monitor/MonitorType.ts +17 -0
  186. package/Types/Monitor/SqlDatabaseType.ts +49 -0
  187. package/Types/Monitor/SqlMonitor/SqlMonitorResponse.ts +28 -0
  188. package/Types/Permission.ts +11 -95
  189. package/Types/Probe/ProbeMonitorResponse.ts +2 -0
  190. package/Types/Runbook/RunbookStep.ts +26 -2
  191. package/Types/Runbook/RunbookStepType.ts +1 -0
  192. package/Types/Workflow/Component.ts +13 -0
  193. package/Types/Workflow/ComponentID.ts +1 -0
  194. package/Types/Workflow/Components/AI.ts +148 -0
  195. package/Types/Workflow/Components.ts +8 -0
  196. package/UI/Components/AI/GenerateFromAIModal.tsx +1 -1
  197. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +11 -0
  198. package/UI/Components/MoreMenu/MoreMenu.tsx +1 -1
  199. package/UI/Components/Table/Table.tsx +38 -2
  200. package/UI/Utils/TableColumnsToCsv.ts +385 -0
  201. package/Utils/Monitor/MonitorMetricType.ts +1 -0
  202. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +59 -45
  203. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/AIInsight.js +795 -0
  205. package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -0
  206. package/build/dist/Models/DatabaseModels/AIRun.js +274 -0
  207. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/CodeRepository.js +43 -0
  209. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/GlobalConfig.js +110 -0
  211. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  212. package/build/dist/Models/DatabaseModels/Index.js +4 -8
  213. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  214. package/build/dist/Models/DatabaseModels/InstanceHealthLog.js +304 -0
  215. package/build/dist/Models/DatabaseModels/InstanceHealthLog.js.map +1 -0
  216. package/build/dist/Models/DatabaseModels/LlmLog.js +35 -0
  217. package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -1
  218. package/build/dist/Models/DatabaseModels/Project.js +127 -6
  219. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  220. package/build/dist/Models/DatabaseModels/Runbook.js +1 -1
  221. package/build/dist/Models/DatabaseModels/Runbook.js.map +1 -1
  222. package/build/dist/Server/API/AIAgentDataAPI.js +568 -85
  223. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  224. package/build/dist/Server/API/AIAgentTaskAPI.js +100 -44
  225. package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
  226. package/build/dist/Server/API/AIAgentTaskLogAPI.js +49 -25
  227. package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -1
  228. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js +27 -0
  229. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js.map +1 -1
  230. package/build/dist/Server/API/AIInsightAPI.js +140 -0
  231. package/build/dist/Server/API/AIInsightAPI.js.map +1 -0
  232. package/build/dist/Server/API/AIInvestigationAPI.js +257 -1
  233. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  234. package/build/dist/Server/API/CodeFixRunAPI.js +181 -0
  235. package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -0
  236. package/build/dist/Server/API/GitHubAPI.js +164 -2
  237. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  238. package/build/dist/Server/API/TelemetryExceptionAPI.js +148 -43
  239. package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
  240. package/build/dist/Server/EnvironmentConfig.js +1 -1
  241. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js +23 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js.map +1 -0
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js +32 -0
  245. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js.map +1 -0
  246. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js +16 -0
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js.map +1 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js +16 -0
  249. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js.map +1 -0
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js +24 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js.map +1 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js +16 -0
  253. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js.map +1 -0
  254. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js +24 -0
  255. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js.map +1 -0
  256. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js +24 -0
  257. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js.map +1 -0
  258. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js +24 -0
  259. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js.map +1 -0
  260. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js +18 -0
  261. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js.map +1 -0
  262. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js +18 -0
  263. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js.map +1 -0
  264. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js +32 -0
  265. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js.map +1 -0
  266. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js +18 -0
  267. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js.map +1 -0
  268. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js +125 -0
  269. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js.map +1 -0
  270. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js +62 -0
  271. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js.map +1 -0
  272. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +30 -0
  273. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  274. package/build/dist/Server/Infrastructure/Queue.js +73 -3
  275. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  276. package/build/dist/Server/Infrastructure/Semaphore.js +44 -1
  277. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  278. package/build/dist/Server/Services/AIAgentService.js +29 -0
  279. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  280. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js +78 -0
  281. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js.map +1 -1
  282. package/build/dist/Server/Services/AIInsightService.js +164 -0
  283. package/build/dist/Server/Services/AIInsightService.js.map +1 -0
  284. package/build/dist/Server/Services/AIRunEventService.js +49 -0
  285. package/build/dist/Server/Services/AIRunEventService.js.map +1 -1
  286. package/build/dist/Server/Services/AIRunService.js +221 -0
  287. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  288. package/build/dist/Server/Services/AIService.js +198 -11
  289. package/build/dist/Server/Services/AIService.js.map +1 -1
  290. package/build/dist/Server/Services/AlertService.js +4 -4
  291. package/build/dist/Server/Services/AlertService.js.map +1 -1
  292. package/build/dist/Server/Services/CodeRepositoryService.js +180 -0
  293. package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
  294. package/build/dist/Server/Services/GlobalConfigService.js +84 -0
  295. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  296. package/build/dist/Server/Services/IncidentService.js +149 -37
  297. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  298. package/build/dist/Server/Services/IncidentStateTimelineService.js +24 -4
  299. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  300. package/build/dist/Server/Services/Index.js +4 -4
  301. package/build/dist/Server/Services/Index.js.map +1 -1
  302. package/build/dist/Server/Services/{AIAgentTaskLogService.js → InstanceHealthLogService.js} +2 -2
  303. package/build/dist/Server/Services/InstanceHealthLogService.js.map +1 -0
  304. package/build/dist/Server/Services/LlmLogService.js +23 -0
  305. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  306. package/build/dist/Server/Services/LlmProviderService.js +96 -0
  307. package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
  308. package/build/dist/Server/Services/MetricBaselineService.js +65 -0
  309. package/build/dist/Server/Services/MetricBaselineService.js.map +1 -1
  310. package/build/dist/Server/Services/MonitorService.js +9 -1
  311. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  312. package/build/dist/Server/Services/TelemetryExceptionService.js +243 -82
  313. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  314. package/build/dist/Server/Services/TraceAggregationService.js +124 -0
  315. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  316. package/build/dist/Server/Types/Workflow/ComponentCode.js.map +1 -1
  317. package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js +240 -0
  318. package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js.map +1 -0
  319. package/build/dist/Server/Types/Workflow/Components/Index.js +2 -0
  320. package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
  321. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +48 -0
  322. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -0
  323. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +174 -0
  324. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -0
  325. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js +126 -0
  326. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js.map +1 -0
  327. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +131 -0
  328. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -0
  329. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js +99 -0
  330. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js.map +1 -0
  331. package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js +245 -0
  332. package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js.map +1 -0
  333. package/build/dist/Server/Utils/AI/Eval/EvalScores.js +83 -0
  334. package/build/dist/Server/Utils/AI/Eval/EvalScores.js.map +1 -0
  335. package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js +12 -0
  336. package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js.map +1 -0
  337. package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +439 -0
  338. package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -0
  339. package/build/dist/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.js → SRE/AIInvestigationEngine.js} +47 -31
  340. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -0
  341. package/build/dist/Server/Utils/AI/{Sentinel/SentinelMemory.js → SRE/AIMemory.js} +5 -5
  342. package/build/dist/Server/Utils/AI/SRE/AIMemory.js.map +1 -0
  343. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.js +42 -19
  344. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -0
  345. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +226 -0
  346. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -0
  347. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +100 -0
  348. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -0
  349. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js +174 -0
  350. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js.map +1 -0
  351. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.js +60 -22
  352. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -0
  353. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.js +9 -9
  354. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -0
  355. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js +268 -0
  356. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js.map +1 -0
  357. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +226 -0
  358. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -0
  359. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js +26 -0
  360. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js.map +1 -0
  361. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js +159 -0
  362. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js.map +1 -0
  363. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +177 -0
  364. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -0
  365. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js +384 -0
  366. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js.map +1 -0
  367. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js +180 -0
  368. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -0
  369. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +269 -0
  370. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js.map +1 -0
  371. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +231 -0
  372. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -0
  373. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +206 -0
  374. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -0
  375. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js +121 -0
  376. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js.map +1 -0
  377. package/build/dist/Server/Utils/AI/SRE/Insights/Types.js +2 -0
  378. package/build/dist/Server/Utils/AI/SRE/Insights/Types.js.map +1 -0
  379. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +148 -0
  380. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -0
  381. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +231 -0
  382. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -0
  383. package/build/dist/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.js +102 -23
  384. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -0
  385. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +167 -0
  386. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -0
  387. package/build/dist/Server/Utils/AI/Toolbox/{SentinelActionTools.js → AIActionTools.js} +18 -2
  388. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -0
  389. package/build/dist/Server/Utils/AI/Toolbox/Index.js +2 -2
  390. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  391. package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js +301 -0
  392. package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js.map +1 -0
  393. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +240 -2
  394. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  395. package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js +127 -0
  396. package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js.map +1 -0
  397. package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js +336 -0
  398. package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js.map +1 -0
  399. package/build/dist/Server/Utils/Execute.js.map +1 -1
  400. package/build/dist/Server/Utils/LLM/LLMService.js +125 -25
  401. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  402. package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js +120 -0
  403. package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js.map +1 -0
  404. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -0
  405. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  406. package/build/dist/Types/AI/AIInsightEvidence.js +2 -0
  407. package/build/dist/Types/AI/AIInsightEvidence.js.map +1 -0
  408. package/build/dist/Types/AI/AIInsightHumanVerdict.js +16 -0
  409. package/build/dist/Types/AI/AIInsightHumanVerdict.js.map +1 -0
  410. package/build/dist/Types/AI/AIInsightSeverity.js +14 -0
  411. package/build/dist/Types/AI/AIInsightSeverity.js.map +1 -0
  412. package/build/dist/Types/AI/AIInsightStatus.js +36 -0
  413. package/build/dist/Types/AI/AIInsightStatus.js.map +1 -0
  414. package/build/dist/Types/AI/AIInsightType.js +42 -0
  415. package/build/dist/Types/AI/AIInsightType.js.map +1 -0
  416. package/build/dist/Types/AI/AIRunAutoGrade.js +19 -0
  417. package/build/dist/Types/AI/AIRunAutoGrade.js.map +1 -0
  418. package/build/dist/Types/AI/AIRunEventType.js +5 -0
  419. package/build/dist/Types/AI/AIRunEventType.js.map +1 -1
  420. package/build/dist/Types/AI/AIRunHumanVerdict.js +18 -0
  421. package/build/dist/Types/AI/AIRunHumanVerdict.js.map +1 -0
  422. package/build/dist/Types/AI/AIRunType.js +6 -0
  423. package/build/dist/Types/AI/AIRunType.js.map +1 -1
  424. package/build/dist/Types/AI/CodeFixTaskContext.js +29 -0
  425. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -0
  426. package/build/dist/Types/AI/CodeFixTaskType.js +122 -0
  427. package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -0
  428. package/build/dist/Types/AI/FixPullRequestCiStatus.js +102 -0
  429. package/build/dist/Types/AI/FixPullRequestCiStatus.js.map +1 -0
  430. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +55 -0
  431. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
  432. package/build/dist/Types/Incident/IncidentMetricType.js +7 -0
  433. package/build/dist/Types/Incident/IncidentMetricType.js.map +1 -1
  434. package/build/dist/Types/Monitor/CriteriaFilter.js +7 -0
  435. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  436. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +62 -0
  437. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  438. package/build/dist/Types/Monitor/MonitorStep.js +28 -0
  439. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  440. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +93 -0
  441. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -0
  442. package/build/dist/Types/Monitor/MonitorType.js +15 -0
  443. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  444. package/build/dist/Types/Monitor/SqlDatabaseType.js +47 -0
  445. package/build/dist/Types/Monitor/SqlDatabaseType.js.map +1 -0
  446. package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js +2 -0
  447. package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js.map +1 -0
  448. package/build/dist/Types/Permission.js +10 -84
  449. package/build/dist/Types/Permission.js.map +1 -1
  450. package/build/dist/Types/Runbook/RunbookStepType.js +1 -0
  451. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  452. package/build/dist/Types/Workflow/ComponentID.js +1 -0
  453. package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
  454. package/build/dist/Types/Workflow/Components/AI.js +135 -0
  455. package/build/dist/Types/Workflow/Components/AI.js.map +1 -0
  456. package/build/dist/Types/Workflow/Components.js +7 -0
  457. package/build/dist/Types/Workflow/Components.js.map +1 -1
  458. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -1
  459. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
  460. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +9 -0
  461. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  462. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +1 -1
  463. package/build/dist/UI/Components/Table/Table.js +28 -2
  464. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  465. package/build/dist/UI/Utils/TableColumnsToCsv.js +291 -0
  466. package/build/dist/UI/Utils/TableColumnsToCsv.js.map +1 -0
  467. package/build/dist/Utils/Monitor/MonitorMetricType.js +1 -0
  468. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  469. package/package.json +1 -1
  470. package/Models/DatabaseModels/AIAgentTask.ts +0 -660
  471. package/Models/DatabaseModels/AIAgentTaskLog.ts +0 -426
  472. package/Models/DatabaseModels/AIAgentTaskTelemetryException.ts +0 -399
  473. package/Models/DatabaseModels/ServiceCodeRepository.ts +0 -647
  474. package/Server/Services/AIAgentTaskService.ts +0 -240
  475. package/Server/Services/AIAgentTaskTelemetryExceptionService.ts +0 -39
  476. package/Server/Services/ServiceCodeRepositoryService.ts +0 -55
  477. package/Tests/Server/Services/AIAgentTaskServiceClaim.test.ts +0 -146
  478. package/Types/AI/AIAgentTaskMetadata.ts +0 -25
  479. package/Types/AI/AIAgentTaskType.ts +0 -40
  480. package/build/dist/Models/DatabaseModels/AIAgentTask.js +0 -691
  481. package/build/dist/Models/DatabaseModels/AIAgentTask.js.map +0 -1
  482. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js +0 -447
  483. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js.map +0 -1
  484. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js +0 -415
  485. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js.map +0 -1
  486. package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js +0 -665
  487. package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js.map +0 -1
  488. package/build/dist/Server/Services/AIAgentTaskLogService.js.map +0 -1
  489. package/build/dist/Server/Services/AIAgentTaskService.js +0 -217
  490. package/build/dist/Server/Services/AIAgentTaskService.js.map +0 -1
  491. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js +0 -36
  492. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js.map +0 -1
  493. package/build/dist/Server/Services/ServiceCodeRepositoryService.js +0 -54
  494. package/build/dist/Server/Services/ServiceCodeRepositoryService.js.map +0 -1
  495. package/build/dist/Server/Utils/AI/Sentinel/AlertInvestigationRunner.js.map +0 -1
  496. package/build/dist/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.js.map +0 -1
  497. package/build/dist/Server/Utils/AI/Sentinel/IncidentPostmortemRunner.js.map +0 -1
  498. package/build/dist/Server/Utils/AI/Sentinel/InvestigationQueue.js.map +0 -1
  499. package/build/dist/Server/Utils/AI/Sentinel/SentinelInvestigationEngine.js.map +0 -1
  500. package/build/dist/Server/Utils/AI/Sentinel/SentinelMemory.js.map +0 -1
  501. package/build/dist/Server/Utils/AI/Toolbox/SentinelActionTools.js.map +0 -1
  502. package/build/dist/Types/AI/AIAgentTaskMetadata.js +0 -6
  503. package/build/dist/Types/AI/AIAgentTaskMetadata.js.map +0 -1
  504. package/build/dist/Types/AI/AIAgentTaskType.js +0 -29
  505. package/build/dist/Types/AI/AIAgentTaskType.js.map +0 -1
@@ -0,0 +1,526 @@
1
+ import { ClickhouseDatabase } from "../../EnvironmentConfig";
2
+ import {
3
+ ClickhouseAppInstance,
4
+ ClickhouseClient,
5
+ } from "../../Infrastructure/ClickhouseDatabase";
6
+ import AnalyticsTableName from "../../../Types/AnalyticsDatabase/AnalyticsTableName";
7
+ import { JSONObject } from "../../../Types/JSON";
8
+ import { getClickhouseClusterName, getStorageTableName } from "./ClusterConfig";
9
+
10
+ export interface ClickhouseDiskSnapshot {
11
+ shardNum: number;
12
+ host: string;
13
+ diskName: string;
14
+ path: string;
15
+ freeInBytes: number;
16
+ unreservedInBytes: number;
17
+ totalInBytes: number;
18
+ usedInBytes: number;
19
+ utilizationPercent: number;
20
+ }
21
+
22
+ export interface ClickhouseLocalTableSize {
23
+ shardNum: number;
24
+ host: string;
25
+ tableName: string;
26
+ sizeInBytes: number;
27
+ rowCount: number;
28
+ partCount: number;
29
+ }
30
+
31
+ export interface ClickhousePartitionLocation {
32
+ shardNum: number;
33
+ host: string;
34
+ diskName: string;
35
+ sizeInBytes: number;
36
+ }
37
+
38
+ export interface ClickhousePartitionCandidate {
39
+ tableName: string;
40
+ partitionId: string;
41
+ partition: string;
42
+ locations: Array<ClickhousePartitionLocation>;
43
+ totalSizeInBytes: number;
44
+ }
45
+
46
+ export interface ClickhousePlannedPartition {
47
+ tableName: string;
48
+ partitionId: string;
49
+ estimatedFreedBytes: number;
50
+ }
51
+
52
+ export interface ClickhousePruningPlan {
53
+ partitions: Array<ClickhousePlannedPartition>;
54
+ estimatedFreedBytes: number;
55
+ projectedMaxUtilizationPercent: number;
56
+ targetReachable: boolean;
57
+ }
58
+
59
+ export interface ClickhousePartitionReclaimState {
60
+ inactivePartCount: number;
61
+ inactiveBytes: number;
62
+ }
63
+
64
+ type ClickhouseJsonResult = { data: Array<JSONObject> };
65
+
66
+ /*
67
+ * Emergency capacity pruning is intentionally narrower than the complete
68
+ * analytics schema. These are high-volume telemetry tables whose partitions
69
+ * are date-based and can be removed as whole units. Audit logs (compliance),
70
+ * mutable metrics (current lifecycle state), and derived monthly rollups are
71
+ * deliberately excluded.
72
+ */
73
+ const PRUNABLE_LOCAL_TABLES: ReadonlySet<string> = new Set<string>([
74
+ getStorageTableName(AnalyticsTableName.Log),
75
+ getStorageTableName(AnalyticsTableName.Metric),
76
+ getStorageTableName(AnalyticsTableName.Span),
77
+ getStorageTableName(AnalyticsTableName.ExceptionInstance),
78
+ getStorageTableName(AnalyticsTableName.MonitorLog),
79
+ getStorageTableName(AnalyticsTableName.Profile),
80
+ getStorageTableName(AnalyticsTableName.ProfileSample),
81
+ ]);
82
+
83
+ const DAILY_PARTITION_ID_PATTERN: RegExp = /^\d{8}$/;
84
+ const DEFAULT_MAX_PARTITIONS_PER_RUN: number = 25;
85
+
86
+ function toNumber(value: unknown): number {
87
+ const parsed: number = Number(value);
88
+ return Number.isFinite(parsed) ? parsed : 0;
89
+ }
90
+
91
+ function escapeStringLiteral(value: string): string {
92
+ return value.replace(/'/g, "''");
93
+ }
94
+
95
+ function quoteIdentifier(value: string): string {
96
+ return `\`${value.replace(/`/g, "``")}\``;
97
+ }
98
+
99
+ function getClient(): ClickhouseClient {
100
+ const client: ClickhouseClient | null = ClickhouseAppInstance.getDataSource();
101
+
102
+ if (!client) {
103
+ throw new Error("ClickHouse is not connected.");
104
+ }
105
+
106
+ return client;
107
+ }
108
+
109
+ async function queryJson(query: string): Promise<Array<JSONObject>> {
110
+ const result: ClickhouseJsonResult = (await (
111
+ await getClient().query({
112
+ query,
113
+ format: "JSON",
114
+ clickhouse_settings: {
115
+ max_execution_time: 10,
116
+ },
117
+ })
118
+ ).json()) as ClickhouseJsonResult;
119
+
120
+ return result.data || [];
121
+ }
122
+
123
+ function diskKey(host: string, diskName: string): string {
124
+ return `${host}\u0000${diskName}`;
125
+ }
126
+
127
+ /*
128
+ * One row per physical, writable local disk. Capacity and destructive pruning
129
+ * decisions use filesystem `free_space`: `unreserved_space` also subtracts
130
+ * temporary merge/insert reservations and can fall sharply during normal
131
+ * background work, so treating it as physically used could prune real data on
132
+ * a transient reservation. Keeping disks separate prevents one roomy volume
133
+ * from hiding another volume that is nearly full.
134
+ */
135
+ export async function getClickhouseDiskSnapshots(): Promise<
136
+ Array<ClickhouseDiskSnapshot>
137
+ > {
138
+ const cluster: string = escapeStringLiteral(getClickhouseClusterName());
139
+
140
+ const rows: Array<JSONObject> = await queryJson(
141
+ `SELECT _shard_num AS shard_num, hostName() AS host, name AS disk_name, path, free_space, unreserved_space, total_space FROM clusterAllReplicas('${cluster}', system.disks) WHERE total_space > 0 AND is_remote = 0 AND is_read_only = 0 AND is_broken = 0 ORDER BY shard_num ASC, host ASC, disk_name ASC`,
142
+ );
143
+
144
+ return rows.map((row: JSONObject): ClickhouseDiskSnapshot => {
145
+ const totalInBytes: number = toNumber(row["total_space"]);
146
+ const freeInBytes: number = toNumber(row["free_space"]);
147
+ const unreservedInBytes: number = toNumber(row["unreserved_space"]);
148
+ const usedInBytes: number = Math.max(0, totalInBytes - freeInBytes);
149
+
150
+ return {
151
+ shardNum: toNumber(row["shard_num"]),
152
+ host: String(row["host"] || ""),
153
+ diskName: String(row["disk_name"] || ""),
154
+ path: String(row["path"] || ""),
155
+ freeInBytes,
156
+ unreservedInBytes,
157
+ totalInBytes,
158
+ usedInBytes,
159
+ utilizationPercent:
160
+ totalInBytes > 0 ? (usedInBytes / totalInBytes) * 100 : 0,
161
+ };
162
+ });
163
+ }
164
+
165
+ export function getMaxClickhouseDiskUtilization(
166
+ disks: Array<ClickhouseDiskSnapshot>,
167
+ ): number | null {
168
+ if (disks.length === 0) {
169
+ return null;
170
+ }
171
+
172
+ return disks.reduce(
173
+ (maximum: number, disk: ClickhouseDiskSnapshot): number => {
174
+ return Math.max(maximum, disk.utilizationPercent);
175
+ },
176
+ 0,
177
+ );
178
+ }
179
+
180
+ /*
181
+ * Exact replica-local table sizes. `_shard_num` comes from the cluster table
182
+ * function and remains reliable even when system.clusters.host_name is a DNS
183
+ * alias that does not match the remote node's hostName().
184
+ */
185
+ export async function getClickhouseLocalTableSizes(): Promise<
186
+ Array<ClickhouseLocalTableSize>
187
+ > {
188
+ const cluster: string = escapeStringLiteral(getClickhouseClusterName());
189
+ const database: string = escapeStringLiteral(ClickhouseDatabase);
190
+
191
+ const rows: Array<JSONObject> = await queryJson(
192
+ `SELECT _shard_num AS shard_num, hostName() AS host, table, sum(bytes_on_disk) AS bytes, sum(rows) AS row_count, count() AS part_count FROM clusterAllReplicas('${cluster}', system.parts) WHERE active AND database = '${database}' AND endsWith(table, 'Local') GROUP BY shard_num, host, table ORDER BY shard_num ASC, host ASC, bytes DESC`,
193
+ );
194
+
195
+ return rows.map((row: JSONObject): ClickhouseLocalTableSize => {
196
+ return {
197
+ shardNum: toNumber(row["shard_num"]),
198
+ host: String(row["host"] || ""),
199
+ tableName: String(row["table"] || ""),
200
+ sizeInBytes: toNumber(row["bytes"]),
201
+ rowCount: toNumber(row["row_count"]),
202
+ partCount: toNumber(row["part_count"]),
203
+ };
204
+ });
205
+ }
206
+
207
+ /*
208
+ * Return complete date partitions grouped globally by table + partition id,
209
+ * with their physical footprint on every replica/disk. The newest partition
210
+ * of every table is always protected, even if ingest has stopped and it is no
211
+ * longer today's partition. This is intentionally more conservative than
212
+ * merely comparing against the wall clock.
213
+ */
214
+ export async function getClickhousePrunablePartitions(): Promise<
215
+ Array<ClickhousePartitionCandidate>
216
+ > {
217
+ const cluster: string = escapeStringLiteral(getClickhouseClusterName());
218
+ const database: string = escapeStringLiteral(ClickhouseDatabase);
219
+ const tableList: string = Array.from(PRUNABLE_LOCAL_TABLES)
220
+ .map((tableName: string): string => {
221
+ return `'${escapeStringLiteral(tableName)}'`;
222
+ })
223
+ .join(", ");
224
+
225
+ const rows: Array<JSONObject> = await queryJson(
226
+ `SELECT _shard_num AS shard_num, hostName() AS host, disk_name, table, partition, partition_id, sum(bytes_on_disk) AS bytes FROM clusterAllReplicas('${cluster}', system.parts) WHERE active AND database = '${database}' AND table IN (${tableList}) GROUP BY shard_num, host, disk_name, table, partition, partition_id ORDER BY partition_id ASC, table ASC`,
227
+ );
228
+
229
+ const latestPartitionByTable: Map<string, string> = new Map<string, string>();
230
+
231
+ for (const row of rows) {
232
+ const tableName: string = String(row["table"] || "");
233
+ const partitionId: string = String(row["partition_id"] || "");
234
+
235
+ if (
236
+ !PRUNABLE_LOCAL_TABLES.has(tableName) ||
237
+ !DAILY_PARTITION_ID_PATTERN.test(partitionId)
238
+ ) {
239
+ continue;
240
+ }
241
+
242
+ const latest: string | undefined = latestPartitionByTable.get(tableName);
243
+ if (!latest || partitionId > latest) {
244
+ latestPartitionByTable.set(tableName, partitionId);
245
+ }
246
+ }
247
+
248
+ const candidatesByKey: Map<string, ClickhousePartitionCandidate> = new Map<
249
+ string,
250
+ ClickhousePartitionCandidate
251
+ >();
252
+
253
+ for (const row of rows) {
254
+ const tableName: string = String(row["table"] || "");
255
+ const partitionId: string = String(row["partition_id"] || "");
256
+
257
+ if (
258
+ !PRUNABLE_LOCAL_TABLES.has(tableName) ||
259
+ !DAILY_PARTITION_ID_PATTERN.test(partitionId) ||
260
+ latestPartitionByTable.get(tableName) === partitionId
261
+ ) {
262
+ continue;
263
+ }
264
+
265
+ const key: string = `${tableName}\u0000${partitionId}`;
266
+ const candidate: ClickhousePartitionCandidate = candidatesByKey.get(
267
+ key,
268
+ ) || {
269
+ tableName,
270
+ partitionId,
271
+ partition: String(row["partition"] || partitionId),
272
+ locations: [],
273
+ totalSizeInBytes: 0,
274
+ };
275
+ const sizeInBytes: number = toNumber(row["bytes"]);
276
+
277
+ candidate.locations.push({
278
+ shardNum: toNumber(row["shard_num"]),
279
+ host: String(row["host"] || ""),
280
+ diskName: String(row["disk_name"] || ""),
281
+ sizeInBytes,
282
+ });
283
+ candidate.totalSizeInBytes += sizeInBytes;
284
+ candidatesByKey.set(key, candidate);
285
+ }
286
+
287
+ return Array.from(candidatesByKey.values()).sort(
288
+ (
289
+ left: ClickhousePartitionCandidate,
290
+ right: ClickhousePartitionCandidate,
291
+ ): number => {
292
+ return (
293
+ left.partitionId.localeCompare(right.partitionId) ||
294
+ left.tableName.localeCompare(right.tableName)
295
+ );
296
+ },
297
+ );
298
+ }
299
+
300
+ /*
301
+ * A DROP PARTITION can return before ClickHouse removes the inactive parts from
302
+ * disk. Capacity automation must not select another historical batch while the
303
+ * prior batch still occupies space, or delayed cleanup could eventually drive
304
+ * utilization far below the configured target. Query every replica and fail
305
+ * closed in the caller until these exact inactive parts are gone.
306
+ */
307
+ export async function getClickhousePartitionReclaimState(
308
+ partitions: Array<ClickhousePlannedPartition>,
309
+ ): Promise<ClickhousePartitionReclaimState> {
310
+ if (partitions.length === 0) {
311
+ return {
312
+ inactivePartCount: 0,
313
+ inactiveBytes: 0,
314
+ };
315
+ }
316
+
317
+ const uniqueReferences: Map<string, ClickhousePlannedPartition> = new Map<
318
+ string,
319
+ ClickhousePlannedPartition
320
+ >();
321
+
322
+ for (const partition of partitions) {
323
+ if (!PRUNABLE_LOCAL_TABLES.has(partition.tableName)) {
324
+ throw new Error(
325
+ `ClickHouse table is not eligible for pruning reconciliation: ${partition.tableName}`,
326
+ );
327
+ }
328
+
329
+ if (!DAILY_PARTITION_ID_PATTERN.test(partition.partitionId)) {
330
+ throw new Error(
331
+ `Invalid ClickHouse daily partition id for reconciliation: ${partition.partitionId}`,
332
+ );
333
+ }
334
+
335
+ uniqueReferences.set(
336
+ `${partition.tableName}\u0000${partition.partitionId}`,
337
+ partition,
338
+ );
339
+ }
340
+
341
+ const cluster: string = escapeStringLiteral(getClickhouseClusterName());
342
+ const database: string = escapeStringLiteral(ClickhouseDatabase);
343
+ const tupleList: string = Array.from(uniqueReferences.values())
344
+ .map((partition: ClickhousePlannedPartition): string => {
345
+ return `('${escapeStringLiteral(partition.tableName)}', '${escapeStringLiteral(partition.partitionId)}')`;
346
+ })
347
+ .join(", ");
348
+ const rows: Array<JSONObject> = await queryJson(
349
+ `SELECT count() AS part_count, coalesce(sum(bytes_on_disk), 0) AS bytes FROM clusterAllReplicas('${cluster}', system.parts) WHERE active = 0 AND database = '${database}' AND (table, partition_id) IN (${tupleList})`,
350
+ );
351
+
352
+ return {
353
+ inactivePartCount: toNumber(rows[0]?.["part_count"]),
354
+ inactiveBytes: toNumber(rows[0]?.["bytes"]),
355
+ };
356
+ }
357
+
358
+ /*
359
+ * Simulate global partition drops against each physical disk independently.
360
+ * A global table/partition drop is selected only when it relieves at least one
361
+ * disk that remains over the requested target; its footprint is then removed
362
+ * from every matching replica/disk projection. The result is bounded so one
363
+ * controller tick can never issue an unbounded destructive batch.
364
+ */
365
+ export function buildClickhousePruningPlan(data: {
366
+ disks: Array<ClickhouseDiskSnapshot>;
367
+ candidates: Array<ClickhousePartitionCandidate>;
368
+ targetPercent: number;
369
+ maxPartitions?: number | undefined;
370
+ }): ClickhousePruningPlan {
371
+ if (
372
+ !Number.isFinite(data.targetPercent) ||
373
+ data.targetPercent < 1 ||
374
+ data.targetPercent > 100
375
+ ) {
376
+ throw new Error("ClickHouse pruning target must be between 1 and 100.");
377
+ }
378
+
379
+ const maxPartitions: number = Math.max(
380
+ 1,
381
+ Math.min(
382
+ data.maxPartitions || DEFAULT_MAX_PARTITIONS_PER_RUN,
383
+ DEFAULT_MAX_PARTITIONS_PER_RUN,
384
+ ),
385
+ );
386
+ const projectedByDisk: Map<
387
+ string,
388
+ { totalInBytes: number; usedInBytes: number }
389
+ > = new Map();
390
+
391
+ for (const disk of data.disks) {
392
+ projectedByDisk.set(diskKey(disk.host, disk.diskName), {
393
+ totalInBytes: disk.totalInBytes,
394
+ usedInBytes: disk.usedInBytes,
395
+ });
396
+ }
397
+
398
+ const isOverTarget: (projection: {
399
+ totalInBytes: number;
400
+ usedInBytes: number;
401
+ }) => boolean = (projection: {
402
+ totalInBytes: number;
403
+ usedInBytes: number;
404
+ }): boolean => {
405
+ return (
406
+ projection.totalInBytes > 0 &&
407
+ (projection.usedInBytes / projection.totalInBytes) * 100 >
408
+ data.targetPercent
409
+ );
410
+ };
411
+
412
+ const selected: Array<ClickhousePlannedPartition> = [];
413
+ let estimatedFreedBytes: number = 0;
414
+
415
+ const oldestCandidatesFirst: Array<ClickhousePartitionCandidate> = [
416
+ ...data.candidates,
417
+ ].sort(
418
+ (
419
+ left: ClickhousePartitionCandidate,
420
+ right: ClickhousePartitionCandidate,
421
+ ): number => {
422
+ return (
423
+ left.partitionId.localeCompare(right.partitionId) ||
424
+ left.tableName.localeCompare(right.tableName)
425
+ );
426
+ },
427
+ );
428
+
429
+ for (const candidate of oldestCandidatesFirst) {
430
+ if (selected.length >= maxPartitions) {
431
+ break;
432
+ }
433
+
434
+ const relievesOverTargetDisk: boolean = candidate.locations.some(
435
+ (location: ClickhousePartitionLocation): boolean => {
436
+ const projection:
437
+ | { totalInBytes: number; usedInBytes: number }
438
+ | undefined = projectedByDisk.get(
439
+ diskKey(location.host, location.diskName),
440
+ );
441
+ return Boolean(projection && isOverTarget(projection));
442
+ },
443
+ );
444
+
445
+ if (!relievesOverTargetDisk) {
446
+ continue;
447
+ }
448
+
449
+ selected.push({
450
+ tableName: candidate.tableName,
451
+ partitionId: candidate.partitionId,
452
+ estimatedFreedBytes: candidate.totalSizeInBytes,
453
+ });
454
+ estimatedFreedBytes += candidate.totalSizeInBytes;
455
+
456
+ for (const location of candidate.locations) {
457
+ const key: string = diskKey(location.host, location.diskName);
458
+ const projection:
459
+ | { totalInBytes: number; usedInBytes: number }
460
+ | undefined = projectedByDisk.get(key);
461
+
462
+ if (projection) {
463
+ projection.usedInBytes = Math.max(
464
+ 0,
465
+ projection.usedInBytes - location.sizeInBytes,
466
+ );
467
+ }
468
+ }
469
+
470
+ if (
471
+ Array.from(projectedByDisk.values()).every(
472
+ (projection: {
473
+ totalInBytes: number;
474
+ usedInBytes: number;
475
+ }): boolean => {
476
+ return !isOverTarget(projection);
477
+ },
478
+ )
479
+ ) {
480
+ break;
481
+ }
482
+ }
483
+
484
+ const projectedUtilizations: Array<number> = Array.from(
485
+ projectedByDisk.values(),
486
+ ).map((projection: { totalInBytes: number; usedInBytes: number }): number => {
487
+ return projection.totalInBytes > 0
488
+ ? (projection.usedInBytes / projection.totalInBytes) * 100
489
+ : 0;
490
+ });
491
+ const projectedMaxUtilizationPercent: number =
492
+ projectedUtilizations.length > 0 ? Math.max(...projectedUtilizations) : 0;
493
+
494
+ return {
495
+ partitions: selected,
496
+ estimatedFreedBytes,
497
+ projectedMaxUtilizationPercent,
498
+ targetReachable: projectedMaxUtilizationPercent <= data.targetPercent,
499
+ };
500
+ }
501
+
502
+ export async function dropClickhousePartition(data: {
503
+ tableName: string;
504
+ partitionId: string;
505
+ }): Promise<void> {
506
+ if (!PRUNABLE_LOCAL_TABLES.has(data.tableName)) {
507
+ throw new Error(
508
+ `ClickHouse table is not eligible for pruning: ${data.tableName}`,
509
+ );
510
+ }
511
+
512
+ if (!DAILY_PARTITION_ID_PATTERN.test(data.partitionId)) {
513
+ throw new Error(
514
+ `Invalid ClickHouse daily partition id: ${data.partitionId}`,
515
+ );
516
+ }
517
+
518
+ const database: string = quoteIdentifier(ClickhouseDatabase);
519
+ const tableName: string = quoteIdentifier(data.tableName);
520
+ const cluster: string = escapeStringLiteral(getClickhouseClusterName());
521
+ const partitionId: string = escapeStringLiteral(data.partitionId);
522
+
523
+ await getClient().command({
524
+ query: `ALTER TABLE ${database}.${tableName} ON CLUSTER '${cluster}' DROP PARTITION ID '${partitionId}'`,
525
+ });
526
+ }