@oneuptime/common 11.5.3 → 11.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AIAgentTaskPullRequest.ts +56 -45
- package/Models/DatabaseModels/AIInsight.ts +748 -0
- package/Models/DatabaseModels/AIRun.ts +262 -0
- package/Models/DatabaseModels/CodeRepository.ts +42 -0
- package/Models/DatabaseModels/Dashboard.ts +3 -3
- package/Models/DatabaseModels/GlobalConfig.ts +105 -0
- package/Models/DatabaseModels/Index.ts +4 -8
- package/Models/DatabaseModels/InstanceHealthLog.ts +277 -0
- package/Models/DatabaseModels/LlmLog.ts +33 -0
- package/Models/DatabaseModels/Project.ts +123 -6
- package/Models/DatabaseModels/Runbook.ts +1 -1
- package/Server/API/AIAgentDataAPI.ts +802 -140
- package/Server/API/AIAgentTaskAPI.ts +132 -69
- package/Server/API/AIAgentTaskLogAPI.ts +65 -41
- package/Server/API/AIAgentTaskPullRequestAPI.ts +41 -0
- package/Server/API/AIInsightAPI.ts +220 -0
- package/Server/API/AIInvestigationAPI.ts +363 -1
- package/Server/API/CodeFixRunAPI.ts +251 -0
- package/Server/API/GitHubAPI.ts +246 -3
- package/Server/API/TelemetryExceptionAPI.ts +193 -48
- package/Server/EnvironmentConfig.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.ts +73 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.ts +53 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.ts +37 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.ts +75 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.ts +37 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.ts +203 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.ts +163 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +30 -0
- package/Server/Infrastructure/Queue.ts +82 -4
- package/Server/Infrastructure/Semaphore.ts +62 -1
- package/Server/Services/AIAgentService.ts +32 -0
- package/Server/Services/AIAgentTaskPullRequestService.ts +117 -0
- package/Server/Services/AIInsightService.ts +174 -0
- package/Server/Services/AIRunEventService.ts +63 -0
- package/Server/Services/AIRunService.ts +259 -1
- package/Server/Services/AIService.ts +249 -7
- package/Server/Services/AlertService.ts +4 -4
- package/Server/Services/CodeRepositoryService.ts +209 -0
- package/Server/Services/DashboardService.ts +11 -2
- package/Server/Services/GlobalConfigService.ts +148 -0
- package/Server/Services/IncidentService.ts +183 -38
- package/Server/Services/IncidentStateTimelineService.ts +24 -4
- package/Server/Services/Index.ts +4 -4
- package/Server/Services/{AIAgentTaskLogService.ts → InstanceHealthLogService.ts} +1 -1
- package/Server/Services/LlmLogService.ts +27 -0
- package/Server/Services/LlmProviderService.ts +108 -0
- package/Server/Services/MetricBaselineService.ts +123 -0
- package/Server/Services/MonitorService.ts +15 -0
- package/Server/Services/TelemetryExceptionService.ts +323 -116
- package/Server/Services/TraceAggregationService.ts +176 -0
- package/Server/Types/Workflow/ComponentCode.ts +6 -0
- package/Server/Types/Workflow/Components/AI/GenerateText.ts +326 -0
- package/Server/Types/Workflow/Components/Index.ts +2 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +1 -1
- package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +71 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +243 -0
- package/Server/Utils/AI/CodeFix/CodeFixRunQueue.ts +131 -0
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +148 -0
- package/Server/Utils/AI/CodeFix/OpenPullRequestCap.ts +117 -0
- package/Server/Utils/AI/Eval/EvalCorpus.ts +369 -0
- package/Server/Utils/AI/Eval/EvalScores.ts +172 -0
- package/Server/Utils/AI/Eval/ReplayInvestigation.ts +87 -0
- package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +676 -0
- package/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.ts → SRE/AIInvestigationEngine.ts} +58 -37
- package/Server/Utils/AI/{Sentinel/SentinelMemory.ts → SRE/AIMemory.ts} +3 -3
- package/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.ts +50 -20
- package/Server/Utils/AI/SRE/ConfidenceSignal.ts +293 -0
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +115 -0
- package/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.ts +223 -0
- package/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.ts +71 -21
- package/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.ts +8 -8
- package/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.ts +364 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +317 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/Index.ts +27 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.ts +221 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +238 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.ts +521 -0
- package/Server/Utils/AI/SRE/Insights/FixRouting.ts +242 -0
- package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +290 -0
- package/Server/Utils/AI/SRE/Insights/InsightStore.ts +283 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +242 -0
- package/Server/Utils/AI/SRE/Insights/Triage.ts +162 -0
- package/Server/Utils/AI/SRE/Insights/Types.ts +49 -0
- package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +212 -0
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +282 -0
- package/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.ts +114 -19
- package/Server/Utils/AI/{Sentinel → SRE}/README.md +4 -4
- package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +172 -0
- package/Server/Utils/AI/Toolbox/{SentinelActionTools.ts → AIActionTools.ts} +22 -1
- package/Server/Utils/AI/Toolbox/Index.ts +2 -2
- package/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.ts +526 -0
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +319 -1
- package/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.ts +221 -0
- package/Server/Utils/CodeRepository/StackTraceRepoResolver.ts +571 -0
- package/Server/Utils/Execute.ts +34 -13
- package/Server/Utils/LLM/LLMService.ts +160 -30
- package/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.ts +152 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +29 -0
- package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +225 -0
- package/Tests/Server/Infrastructure/Queue.test.ts +227 -0
- package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +159 -0
- package/Tests/Server/Services/AIAgentTaskPullRequestOutcomeStats.test.ts +154 -0
- package/Tests/Server/Services/AIInsightService.test.ts +324 -0
- package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +401 -0
- package/Tests/Server/Services/AIRunHumanVerdict.test.ts +161 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +95 -5
- package/Tests/Server/Services/AIServiceProjectAccess.test.ts +259 -0
- package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +249 -0
- package/Tests/Server/Services/FixPerformanceTaskTrigger.test.ts +274 -0
- package/Tests/Server/Services/GlobalConfigService.test.ts +80 -0
- package/Tests/Server/Services/IncidentInternalNoteAnnouncement.test.ts +1 -1
- package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +313 -0
- package/Tests/Server/Services/LlmProviderProjectOwned.test.ts +132 -0
- package/Tests/Server/Services/TelemetryExceptionAIFixReadiness.test.ts +405 -0
- package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +322 -0
- package/Tests/Server/Services/TraceServiceLatencyProfile.test.ts +278 -0
- package/Tests/Server/Types/Workflow/Components/AIGenerateText.test.ts +722 -0
- package/Tests/Server/Utils/AI/{SentinelAlertGating.test.ts → AIAlertGating.test.ts} +19 -19
- package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +362 -0
- package/Tests/Server/Utils/AI/{SentinelInvestigationQueue.test.ts → AIInvestigationQueue.test.ts} +19 -19
- package/Tests/Server/Utils/AI/CodeAgentWorkspaceGuard.test.ts +138 -0
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +335 -0
- package/Tests/Server/Utils/AI/CodeFixRunQueue.test.ts +134 -0
- package/Tests/Server/Utils/AI/EvalCorpus.test.ts +209 -0
- package/Tests/Server/Utils/AI/EvalScores.test.ts +343 -0
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +218 -0
- package/Tests/Server/Utils/AI/Insights/ErrorLogSpikeDetector.test.ts +437 -0
- package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +287 -0
- package/Tests/Server/Utils/AI/Insights/InsightDetectorsIndex.test.ts +34 -0
- package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +572 -0
- package/Tests/Server/Utils/AI/Insights/InsightNeverThrowsHardening.test.ts +344 -0
- package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +720 -0
- package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +467 -0
- package/Tests/Server/Utils/AI/Insights/InsightStoreHardening.test.ts +370 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +210 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +221 -0
- package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +328 -0
- package/Tests/Server/Utils/AI/Insights/MetricBaselineDrift.test.ts +182 -0
- package/Tests/Server/Utils/AI/Insights/MetricDriftDetector.test.ts +280 -0
- package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +259 -0
- package/Tests/Server/Utils/AI/Insights/TraceLatencyRegressionDetector.test.ts +770 -0
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +343 -0
- package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +307 -0
- package/Tests/Server/Utils/AI/OpenPullRequestCap.test.ts +170 -0
- package/Tests/Server/Utils/AI/SpanTreeAnalyzer.test.ts +559 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.test.ts +158 -0
- package/Tests/Server/Utils/GitHubCheckRunsConclusion.test.ts +100 -0
- package/Tests/Server/Utils/GitHubPullRequestStateMapping.test.ts +50 -0
- package/Tests/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.test.ts +266 -0
- package/Tests/Server/Utils/ServiceRepoLinkSuggester.test.ts +167 -0
- package/Tests/Server/Utils/StackTraceRepoResolver.test.ts +527 -0
- package/Tests/Types/AI/AIChatPermissionMode.test.ts +112 -0
- package/Tests/Types/AI/CodeFixTaskType.test.ts +152 -0
- package/Tests/Types/AI/FixPullRequestCiStatus.test.ts +181 -0
- package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +110 -0
- package/Tests/Types/Monitor/SqlDatabaseType.test.ts +55 -0
- package/Tests/Types/Workflow/AIGenerateTextMetadata.test.ts +180 -0
- package/Tests/UI/Components/TableBulkCsvExport.test.tsx +168 -0
- package/Tests/UI/Utils/TableColumnsToCsv.test.ts +523 -0
- package/Types/AI/AIChatTypes.ts +8 -0
- package/Types/AI/AIInsightEvidence.ts +77 -0
- package/Types/AI/AIInsightHumanVerdict.ts +15 -0
- package/Types/AI/AIInsightSeverity.ts +13 -0
- package/Types/AI/AIInsightStatus.ts +38 -0
- package/Types/AI/AIInsightType.ts +41 -0
- package/Types/AI/AIRunAutoGrade.ts +18 -0
- package/Types/AI/AIRunEventType.ts +5 -0
- package/Types/AI/AIRunHumanVerdict.ts +17 -0
- package/Types/AI/AIRunType.ts +6 -0
- package/Types/AI/CodeFixTaskContext.ts +88 -0
- package/Types/AI/CodeFixTaskType.ts +132 -0
- package/Types/AI/FixPullRequestCiStatus.ts +132 -0
- package/Types/BaseDatabase/AggregationIntervalUtil.ts +67 -0
- package/Types/Incident/IncidentMetricType.ts +7 -0
- package/Types/Monitor/CriteriaFilter.ts +8 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +67 -0
- package/Types/Monitor/MonitorStep.ts +38 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +141 -0
- package/Types/Monitor/MonitorType.ts +17 -0
- package/Types/Monitor/SqlDatabaseType.ts +49 -0
- package/Types/Monitor/SqlMonitor/SqlMonitorResponse.ts +28 -0
- package/Types/Permission.ts +11 -95
- package/Types/Probe/ProbeMonitorResponse.ts +2 -0
- package/Types/Runbook/RunbookStep.ts +26 -2
- package/Types/Runbook/RunbookStepType.ts +1 -0
- package/Types/Workflow/Component.ts +13 -0
- package/Types/Workflow/ComponentID.ts +1 -0
- package/Types/Workflow/Components/AI.ts +148 -0
- package/Types/Workflow/Components.ts +8 -0
- package/UI/Components/AI/GenerateFromAIModal.tsx +1 -1
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +11 -0
- package/UI/Components/MoreMenu/MoreMenu.tsx +1 -1
- package/UI/Components/Table/Table.tsx +38 -2
- package/UI/Utils/TableColumnsToCsv.ts +385 -0
- package/Utils/Monitor/MonitorMetricType.ts +1 -0
- package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +59 -45
- package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIInsight.js +795 -0
- package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AIRun.js +274 -0
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +43 -0
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Dashboard.js +3 -3
- package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +110 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -8
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InstanceHealthLog.js +304 -0
- package/build/dist/Models/DatabaseModels/InstanceHealthLog.js.map +1 -0
- package/build/dist/Models/DatabaseModels/LlmLog.js +35 -0
- package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +127 -6
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Runbook.js +1 -1
- package/build/dist/Models/DatabaseModels/Runbook.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +568 -85
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskAPI.js +100 -44
- package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskLogAPI.js +49 -25
- package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js +27 -0
- package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +140 -0
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -0
- package/build/dist/Server/API/AIInvestigationAPI.js +257 -1
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/CodeFixRunAPI.js +181 -0
- package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -0
- package/build/dist/Server/API/GitHubAPI.js +164 -2
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryExceptionAPI.js +148 -43
- package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +1 -1
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js +125 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js +62 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +73 -3
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +44 -1
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +29 -0
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/AIAgentTaskPullRequestService.js +78 -0
- package/build/dist/Server/Services/AIAgentTaskPullRequestService.js.map +1 -1
- package/build/dist/Server/Services/AIInsightService.js +164 -0
- package/build/dist/Server/Services/AIInsightService.js.map +1 -0
- package/build/dist/Server/Services/AIRunEventService.js +49 -0
- package/build/dist/Server/Services/AIRunEventService.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +221 -0
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +198 -11
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +4 -4
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/CodeRepositoryService.js +180 -0
- package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
- package/build/dist/Server/Services/DashboardService.js +8 -2
- package/build/dist/Server/Services/DashboardService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +84 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +149 -37
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +24 -4
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -4
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/{AIAgentTaskLogService.js → InstanceHealthLogService.js} +2 -2
- package/build/dist/Server/Services/InstanceHealthLogService.js.map +1 -0
- package/build/dist/Server/Services/LlmLogService.js +23 -0
- package/build/dist/Server/Services/LlmLogService.js.map +1 -1
- package/build/dist/Server/Services/LlmProviderService.js +96 -0
- package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
- package/build/dist/Server/Services/MetricBaselineService.js +65 -0
- package/build/dist/Server/Services/MetricBaselineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +9 -1
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryExceptionService.js +243 -82
- package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +124 -0
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Types/Workflow/ComponentCode.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js +240 -0
- package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/Index.js +2 -0
- package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +48 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +174 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js +126 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +131 -0
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js +99 -0
- package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js.map +1 -0
- package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js +245 -0
- package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js.map +1 -0
- package/build/dist/Server/Utils/AI/Eval/EvalScores.js +83 -0
- package/build/dist/Server/Utils/AI/Eval/EvalScores.js.map +1 -0
- package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js +12 -0
- package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js.map +1 -0
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +439 -0
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.js → SRE/AIInvestigationEngine.js} +47 -31
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel/SentinelMemory.js → SRE/AIMemory.js} +5 -5
- package/build/dist/Server/Utils/AI/SRE/AIMemory.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.js +42 -19
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +226 -0
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +100 -0
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js +174 -0
- package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.js +60 -22
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.js +9 -9
- package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js +268 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +226 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js +26 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js +159 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +177 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js +384 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js +180 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +269 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +231 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +206 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js +121 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Types.js +2 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Types.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +148 -0
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +231 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.js +102 -23
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +167 -0
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/{SentinelActionTools.js → AIActionTools.js} +18 -2
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +2 -2
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js +301 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +240 -2
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js +127 -0
- package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js +336 -0
- package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js.map +1 -0
- package/build/dist/Server/Utils/Execute.js +21 -11
- package/build/dist/Server/Utils/Execute.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +125 -25
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js +120 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Types/AI/AIInsightEvidence.js +2 -0
- package/build/dist/Types/AI/AIInsightEvidence.js.map +1 -0
- package/build/dist/Types/AI/AIInsightHumanVerdict.js +16 -0
- package/build/dist/Types/AI/AIInsightHumanVerdict.js.map +1 -0
- package/build/dist/Types/AI/AIInsightSeverity.js +14 -0
- package/build/dist/Types/AI/AIInsightSeverity.js.map +1 -0
- package/build/dist/Types/AI/AIInsightStatus.js +36 -0
- package/build/dist/Types/AI/AIInsightStatus.js.map +1 -0
- package/build/dist/Types/AI/AIInsightType.js +42 -0
- package/build/dist/Types/AI/AIInsightType.js.map +1 -0
- package/build/dist/Types/AI/AIRunAutoGrade.js +19 -0
- package/build/dist/Types/AI/AIRunAutoGrade.js.map +1 -0
- package/build/dist/Types/AI/AIRunEventType.js +5 -0
- package/build/dist/Types/AI/AIRunEventType.js.map +1 -1
- package/build/dist/Types/AI/AIRunHumanVerdict.js +18 -0
- package/build/dist/Types/AI/AIRunHumanVerdict.js.map +1 -0
- package/build/dist/Types/AI/AIRunType.js +6 -0
- package/build/dist/Types/AI/AIRunType.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskContext.js +29 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskType.js +122 -0
- package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -0
- package/build/dist/Types/AI/FixPullRequestCiStatus.js +102 -0
- package/build/dist/Types/AI/FixPullRequestCiStatus.js.map +1 -0
- package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +55 -0
- package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
- package/build/dist/Types/Incident/IncidentMetricType.js +7 -0
- package/build/dist/Types/Incident/IncidentMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +7 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +62 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +28 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +93 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +15 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SqlDatabaseType.js +47 -0
- package/build/dist/Types/Monitor/SqlDatabaseType.js.map +1 -0
- package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js +2 -0
- package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js.map +1 -0
- package/build/dist/Types/Permission.js +10 -84
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Runbook/RunbookStepType.js +1 -0
- package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
- package/build/dist/Types/Workflow/ComponentID.js +1 -0
- package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
- package/build/dist/Types/Workflow/Components/AI.js +135 -0
- package/build/dist/Types/Workflow/Components/AI.js.map +1 -0
- package/build/dist/Types/Workflow/Components.js +7 -0
- package/build/dist/Types/Workflow/Components.js.map +1 -1
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -1
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +9 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +1 -1
- package/build/dist/UI/Components/Table/Table.js +28 -2
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Utils/TableColumnsToCsv.js +291 -0
- package/build/dist/UI/Utils/TableColumnsToCsv.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorMetricType.js +1 -0
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/package.json +1 -1
- package/Models/DatabaseModels/AIAgentTask.ts +0 -660
- package/Models/DatabaseModels/AIAgentTaskLog.ts +0 -426
- package/Models/DatabaseModels/AIAgentTaskTelemetryException.ts +0 -399
- package/Models/DatabaseModels/ServiceCodeRepository.ts +0 -647
- package/Server/Services/AIAgentTaskService.ts +0 -240
- package/Server/Services/AIAgentTaskTelemetryExceptionService.ts +0 -39
- package/Server/Services/ServiceCodeRepositoryService.ts +0 -55
- package/Tests/Server/Services/AIAgentTaskServiceClaim.test.ts +0 -146
- package/Types/AI/AIAgentTaskMetadata.ts +0 -25
- package/Types/AI/AIAgentTaskType.ts +0 -40
- package/build/dist/Models/DatabaseModels/AIAgentTask.js +0 -691
- package/build/dist/Models/DatabaseModels/AIAgentTask.js.map +0 -1
- package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js +0 -447
- package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js.map +0 -1
- package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js +0 -415
- package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js.map +0 -1
- package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js +0 -665
- package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js.map +0 -1
- package/build/dist/Server/Services/AIAgentTaskLogService.js.map +0 -1
- package/build/dist/Server/Services/AIAgentTaskService.js +0 -217
- package/build/dist/Server/Services/AIAgentTaskService.js.map +0 -1
- package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js +0 -36
- package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js.map +0 -1
- package/build/dist/Server/Services/ServiceCodeRepositoryService.js +0 -54
- package/build/dist/Server/Services/ServiceCodeRepositoryService.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/AlertInvestigationRunner.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/IncidentPostmortemRunner.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/InvestigationQueue.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/SentinelInvestigationEngine.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/SentinelMemory.js.map +0 -1
- package/build/dist/Server/Utils/AI/Toolbox/SentinelActionTools.js.map +0 -1
- package/build/dist/Types/AI/AIAgentTaskMetadata.js +0 -6
- package/build/dist/Types/AI/AIAgentTaskMetadata.js.map +0 -1
- package/build/dist/Types/AI/AIAgentTaskType.js +0 -29
- package/build/dist/Types/AI/AIAgentTaskType.js.map +0 -1
|
@@ -1,19 +1,30 @@
|
|
|
1
1
|
import AIAgentService from "../Services/AIAgentService";
|
|
2
|
-
import LlmProviderService from "../Services/LlmProviderService";
|
|
3
2
|
import TelemetryExceptionService from "../Services/TelemetryExceptionService";
|
|
4
3
|
import ServiceService from "../Services/ServiceService";
|
|
5
|
-
import ServiceCodeRepositoryService from "../Services/ServiceCodeRepositoryService";
|
|
6
4
|
import CodeRepositoryService from "../Services/CodeRepositoryService";
|
|
7
5
|
import AIAgentTaskPullRequestService from "../Services/AIAgentTaskPullRequestService";
|
|
8
|
-
import
|
|
6
|
+
import AIRunService from "../Services/AIRunService";
|
|
7
|
+
import AIRunEventService from "../Services/AIRunEventService";
|
|
8
|
+
import IncidentService from "../Services/IncidentService";
|
|
9
|
+
import AlertService from "../Services/AlertService";
|
|
10
|
+
import IncidentFeedService from "../Services/IncidentFeedService";
|
|
11
|
+
import AlertFeedService from "../Services/AlertFeedService";
|
|
9
12
|
import Express from "../Utils/Express";
|
|
10
13
|
import Response from "../Utils/Response";
|
|
11
14
|
import AIAgentTaskPullRequest from "../../Models/DatabaseModels/AIAgentTaskPullRequest";
|
|
15
|
+
import { IncidentFeedEventType, } from "../../Models/DatabaseModels/IncidentFeed";
|
|
16
|
+
import { AlertFeedEventType, } from "../../Models/DatabaseModels/AlertFeed";
|
|
17
|
+
import AIRunEventType from "../../Types/AI/AIRunEventType";
|
|
18
|
+
import AIRunType from "../../Types/AI/AIRunType";
|
|
19
|
+
import { CodeFixContextKind, CodeFixTaskTypeHelper, } from "../../Types/AI/CodeFixTaskType";
|
|
20
|
+
import SpanTreeAnalyzer from "../Utils/AI/PerfEvidence/SpanTreeAnalyzer";
|
|
21
|
+
import OpenPullRequestCap from "../Utils/AI/CodeFix/OpenPullRequestCap";
|
|
22
|
+
import CodeFixAgentCompletion from "../Utils/AI/CodeFix/CodeFixAgentCompletion";
|
|
23
|
+
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
12
24
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
13
25
|
import ObjectID from "../../Types/ObjectID";
|
|
14
26
|
import GitHubUtil from "../Utils/CodeRepository/GitHub/GitHub";
|
|
15
27
|
import CodeRepositoryType from "../../Types/CodeRepository/CodeRepositoryType";
|
|
16
|
-
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
17
28
|
import URL from "../../Types/API/URL";
|
|
18
29
|
import PullRequestState from "../../Types/CodeRepository/PullRequestState";
|
|
19
30
|
import logger, { getLogAttributesFromRequest } from "../Utils/Logger";
|
|
@@ -26,41 +37,53 @@ export default class AIAgentDataAPI {
|
|
|
26
37
|
return this.router;
|
|
27
38
|
}
|
|
28
39
|
initRoutes() {
|
|
29
|
-
|
|
30
|
-
|
|
40
|
+
/*
|
|
41
|
+
* Server-mediated LLM completion for the in-house code-fix agent (B4
|
|
42
|
+
* Tier 0, Internal/Roadmap/CodeFixSandboxDesign.md). One call = one
|
|
43
|
+
* completion of the worker's tool loop, executed through
|
|
44
|
+
* AIService.executeWithLogging: metered, LlmLog-linked to the run,
|
|
45
|
+
* inside the G4 daily budget, and under per-run loop budgets (max
|
|
46
|
+
* completion calls / output tokens) enforced server-side. The worker
|
|
47
|
+
* never receives a provider secret on this path.
|
|
48
|
+
*
|
|
49
|
+
* Request: { aiAgentId, aiAgentKey, taskId, messages, tools?, maxTokens? }
|
|
50
|
+
* Response: { message: { role: "assistant", content, toolCalls },
|
|
51
|
+
* stopReason: "stop" | "tool_use",
|
|
52
|
+
* budget: { completionCallsUsed, maxCompletionCalls,
|
|
53
|
+
* outputTokensUsed, maxOutputTokens } }
|
|
54
|
+
*/
|
|
55
|
+
this.router.post("/ai-agent-data/llm-completion", async (req, res, next) => {
|
|
31
56
|
try {
|
|
32
57
|
const data = req.body;
|
|
33
58
|
// Validate AI Agent credentials
|
|
34
59
|
const aiAgent = await this.validateAIAgent(data);
|
|
35
|
-
if (!aiAgent) {
|
|
60
|
+
if (!aiAgent || !aiAgent.id) {
|
|
36
61
|
return Response.sendErrorResponse(req, res, new BadDataException("Invalid AI Agent ID or AI Agent Key"));
|
|
37
62
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return Response.sendErrorResponse(req, res, new BadDataException("projectId is required"));
|
|
41
|
-
}
|
|
42
|
-
const projectId = new ObjectID(data["projectId"]);
|
|
43
|
-
// Check if this is a Project AI Agent (has a projectId)
|
|
44
|
-
const isProjectAIAgent = aiAgent.projectId !== null && aiAgent.projectId !== undefined;
|
|
45
|
-
// Get LLM provider for the project
|
|
46
|
-
const llmProvider = await LlmProviderService.getLLMProviderForProject(projectId);
|
|
47
|
-
if (!llmProvider) {
|
|
48
|
-
return Response.sendErrorResponse(req, res, new BadDataException("No LLM provider configured for this project"));
|
|
49
|
-
}
|
|
50
|
-
/*
|
|
51
|
-
* Security check: Project AI Agents cannot access Global LLM Providers
|
|
52
|
-
* Only Global AI Agents (projectId is null) can access Global LLM Providers
|
|
53
|
-
*/
|
|
54
|
-
const isGlobalLLMProvider = llmProvider.isGlobalLlm === true;
|
|
55
|
-
if (isProjectAIAgent && isGlobalLLMProvider) {
|
|
56
|
-
return Response.sendErrorResponse(req, res, new BadDataException("Project AI Agents cannot access Global LLM Providers. Please configure a project-specific LLM Provider."));
|
|
63
|
+
if (!data["taskId"]) {
|
|
64
|
+
return Response.sendErrorResponse(req, res, new BadDataException("taskId is required"));
|
|
57
65
|
}
|
|
58
|
-
|
|
66
|
+
const taskId = new ObjectID(data["taskId"]);
|
|
67
|
+
const messages = this.parseCompletionMessages(data["messages"]);
|
|
68
|
+
const tools = this.parseCompletionTools(data["tools"]);
|
|
69
|
+
const maxTokens = typeof data["maxTokens"] === "number" && data["maxTokens"] > 0
|
|
70
|
+
? data["maxTokens"]
|
|
71
|
+
: undefined;
|
|
72
|
+
const result = await CodeFixAgentCompletion.execute({
|
|
73
|
+
aiAgentId: aiAgent.id,
|
|
74
|
+
aiRunId: taskId,
|
|
75
|
+
messages,
|
|
76
|
+
tools,
|
|
77
|
+
maxTokens,
|
|
78
|
+
});
|
|
59
79
|
return Response.sendJsonObjectResponse(req, res, {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
80
|
+
message: {
|
|
81
|
+
role: "assistant",
|
|
82
|
+
content: result.content,
|
|
83
|
+
toolCalls: result.toolCalls,
|
|
84
|
+
},
|
|
85
|
+
stopReason: result.stopReason,
|
|
86
|
+
budget: result.budget,
|
|
64
87
|
});
|
|
65
88
|
}
|
|
66
89
|
catch (err) {
|
|
@@ -142,9 +165,14 @@ export default class AIAgentDataAPI {
|
|
|
142
165
|
next(err);
|
|
143
166
|
}
|
|
144
167
|
});
|
|
145
|
-
|
|
168
|
+
/*
|
|
169
|
+
* Resolve the repository the exception's code lives in — AT RUNTIME
|
|
170
|
+
* (stack-trace path matching over the project's connected repos, with
|
|
171
|
+
* name-match and only-repository fallbacks). Replaces the old
|
|
172
|
+
* ServiceCodeRepository mapping-table lookup; the response keeps the
|
|
173
|
+
* `repositories` array shape the agent already consumes.
|
|
174
|
+
*/
|
|
146
175
|
this.router.post("/ai-agent-data/get-code-repositories", async (req, res, next) => {
|
|
147
|
-
var _a;
|
|
148
176
|
try {
|
|
149
177
|
const data = req.body;
|
|
150
178
|
// Validate AI Agent credentials
|
|
@@ -152,63 +180,405 @@ export default class AIAgentDataAPI {
|
|
|
152
180
|
if (!aiAgent) {
|
|
153
181
|
return Response.sendErrorResponse(req, res, new BadDataException("Invalid AI Agent ID or AI Agent Key"));
|
|
154
182
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
const primaryEntityId = new ObjectID(serviceIdParam);
|
|
163
|
-
// Find CodeRepositories linked to this Service
|
|
164
|
-
const repositories = [];
|
|
165
|
-
const serviceCodeRepositories = await ServiceCodeRepositoryService.findBy({
|
|
166
|
-
query: {
|
|
167
|
-
serviceId: primaryEntityId,
|
|
168
|
-
},
|
|
183
|
+
if (!data["exceptionId"]) {
|
|
184
|
+
return Response.sendErrorResponse(req, res, new BadDataException("exceptionId is required (agents older than the runtime-resolution change must be upgraded)"));
|
|
185
|
+
}
|
|
186
|
+
const exceptionId = new ObjectID(data["exceptionId"]);
|
|
187
|
+
const exception = await TelemetryExceptionService.findOneById({
|
|
188
|
+
id: exceptionId,
|
|
169
189
|
select: {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
190
|
+
_id: true,
|
|
191
|
+
projectId: true,
|
|
192
|
+
stackTrace: true,
|
|
193
|
+
primaryEntityId: true,
|
|
194
|
+
},
|
|
195
|
+
props: {
|
|
196
|
+
isRoot: true,
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
if (!exception || !exception.projectId) {
|
|
200
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Exception not found"));
|
|
201
|
+
}
|
|
202
|
+
// Service name feeds the name-match fallback when there is one.
|
|
203
|
+
const service = exception.primaryEntityId
|
|
204
|
+
? await ServiceService.findOneById({
|
|
205
|
+
id: exception.primaryEntityId,
|
|
206
|
+
select: {
|
|
174
207
|
name: true,
|
|
175
|
-
repositoryHostedAt: true,
|
|
176
|
-
organizationName: true,
|
|
177
|
-
repositoryName: true,
|
|
178
|
-
mainBranchName: true,
|
|
179
|
-
gitHubAppInstallationId: true,
|
|
180
208
|
},
|
|
209
|
+
props: {
|
|
210
|
+
isRoot: true,
|
|
211
|
+
},
|
|
212
|
+
})
|
|
213
|
+
: null;
|
|
214
|
+
const resolution = await CodeRepositoryService.resolveRepositoryForException({
|
|
215
|
+
projectId: exception.projectId,
|
|
216
|
+
stackTrace: exception.stackTrace || null,
|
|
217
|
+
serviceName: (service === null || service === void 0 ? void 0 : service.name) || null,
|
|
218
|
+
});
|
|
219
|
+
if (!resolution) {
|
|
220
|
+
logger.debug(`No repository resolved for exception ${exceptionId.toString()}`, getLogAttributesFromRequest(req));
|
|
221
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
222
|
+
repositories: [],
|
|
223
|
+
resolutionError: "Could not resolve a repository for this exception: no connected repository contains the files in its stack trace, no repository name matches the service, and the project has more than one repository. Connect the right repository via the GitHub App.",
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
const repository = await CodeRepositoryService.findOneById({
|
|
227
|
+
id: new ObjectID(resolution.codeRepositoryId),
|
|
228
|
+
select: {
|
|
229
|
+
_id: true,
|
|
230
|
+
name: true,
|
|
231
|
+
repositoryHostedAt: true,
|
|
232
|
+
organizationName: true,
|
|
233
|
+
repositoryName: true,
|
|
234
|
+
mainBranchName: true,
|
|
235
|
+
gitHubAppInstallationId: true,
|
|
236
|
+
},
|
|
237
|
+
props: {
|
|
238
|
+
isRoot: true,
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
if (!repository) {
|
|
242
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Resolved repository no longer exists"));
|
|
243
|
+
}
|
|
244
|
+
logger.debug(`Resolved repository ${resolution.organizationName}/${resolution.repositoryName} for exception ${exceptionId.toString()} via ${resolution.method}: ${resolution.evidence}`, getLogAttributesFromRequest(req));
|
|
245
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
246
|
+
repositories: [
|
|
247
|
+
{
|
|
248
|
+
id: repository.id.toString(),
|
|
249
|
+
name: repository.name || "",
|
|
250
|
+
repositoryHostedAt: repository.repositoryHostedAt || "",
|
|
251
|
+
organizationName: repository.organizationName || "",
|
|
252
|
+
repositoryName: repository.repositoryName || "",
|
|
253
|
+
mainBranchName: repository.mainBranchName || "main",
|
|
254
|
+
servicePathInRepository: resolution.servicePathInRepository,
|
|
255
|
+
gitHubAppInstallationId: repository.gitHubAppInstallationId || null,
|
|
256
|
+
resolutionMethod: resolution.method,
|
|
257
|
+
resolutionEvidence: resolution.evidence,
|
|
258
|
+
},
|
|
259
|
+
],
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
next(err);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
/*
|
|
267
|
+
* Context for every non-exception recipe, keyed by the run id `taskId`
|
|
268
|
+
* (the id get-pending-task returned) — these runs have NO telemetry
|
|
269
|
+
* exception, so the exception-shaped endpoints above cannot serve them.
|
|
270
|
+
* The route name predates the newer recipes and is kept for agent
|
|
271
|
+
* compatibility. Two context kinds are served:
|
|
272
|
+
*
|
|
273
|
+
* - Incident/alert-subject recipes (ImproveInstrumentation,
|
|
274
|
+
* FixFromIncident): the investigation's posted analysis + subject
|
|
275
|
+
* metadata + the repository resolved without a stack trace. The
|
|
276
|
+
* analysis text comes from the subject's latest RootCause feed item:
|
|
277
|
+
* the AI's postAnalysis is the only writer of RootCause feed
|
|
278
|
+
* events, it writes them for BOTH subjects and BOTH confidence
|
|
279
|
+
* outcomes (quiet mode only mutes the workspace ping), so the feed
|
|
280
|
+
* item IS the investigation run's persisted output.
|
|
281
|
+
*
|
|
282
|
+
* - Trace-evidence recipes (FixPerformance): the deterministic
|
|
283
|
+
* span-tree findings stored on AIRun.taskContext at trigger time
|
|
284
|
+
* (subjectType "trace"; the rendered evidence rides in
|
|
285
|
+
* analysisMarkdown so the worker pipeline stays shared). Repository
|
|
286
|
+
* resolution here TRIES the stack-trace path matcher first, fed by a
|
|
287
|
+
* synthetic trace built from the implicated spans' code.*
|
|
288
|
+
* attributes, before the name-match / only-repository fallbacks.
|
|
289
|
+
*/
|
|
290
|
+
this.router.post("/ai-agent-data/get-instrumentation-task-details", async (req, res, next) => {
|
|
291
|
+
var _a;
|
|
292
|
+
try {
|
|
293
|
+
const data = req.body;
|
|
294
|
+
// Validate AI Agent credentials
|
|
295
|
+
const aiAgent = await this.validateAIAgent(data);
|
|
296
|
+
if (!aiAgent) {
|
|
297
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Invalid AI Agent ID or AI Agent Key"));
|
|
298
|
+
}
|
|
299
|
+
if (!data["taskId"]) {
|
|
300
|
+
return Response.sendErrorResponse(req, res, new BadDataException("taskId is required"));
|
|
301
|
+
}
|
|
302
|
+
const taskId = new ObjectID(data["taskId"]);
|
|
303
|
+
const run = await AIRunService.findOneById({
|
|
304
|
+
id: taskId,
|
|
305
|
+
select: {
|
|
306
|
+
_id: true,
|
|
307
|
+
projectId: true,
|
|
308
|
+
runType: true,
|
|
309
|
+
codeFixTaskType: true,
|
|
310
|
+
triggeredByIncidentId: true,
|
|
311
|
+
triggeredByAlertId: true,
|
|
312
|
+
taskContext: true,
|
|
181
313
|
},
|
|
182
|
-
skip: 0,
|
|
183
|
-
limit: LIMIT_MAX,
|
|
184
314
|
props: {
|
|
185
315
|
isRoot: true,
|
|
186
316
|
},
|
|
187
317
|
});
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
318
|
+
if (!run || !run.projectId) {
|
|
319
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Task not found"));
|
|
320
|
+
}
|
|
321
|
+
/*
|
|
322
|
+
* Any non-exception recipe is served here — the same context-kind
|
|
323
|
+
* grouping the claim guard uses.
|
|
324
|
+
*/
|
|
325
|
+
const taskType = CodeFixTaskTypeHelper.fromDatabaseValue(run.codeFixTaskType);
|
|
326
|
+
const contextKind = CodeFixTaskTypeHelper.getContextKind(taskType);
|
|
327
|
+
if (run.runType !== AIRunType.CodeFix ||
|
|
328
|
+
contextKind === CodeFixContextKind.TelemetryException) {
|
|
329
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Task is not an incident/alert-subject or trace-evidence code-fix run (ImproveInstrumentation, FixFromIncident or FixPerformance)"));
|
|
330
|
+
}
|
|
331
|
+
/*
|
|
332
|
+
* Trace-evidence recipes (FixPerformance): everything the worker
|
|
333
|
+
* needs was captured into taskContext at trigger time — the spans
|
|
334
|
+
* themselves may already be past ClickHouse retention.
|
|
335
|
+
*/
|
|
336
|
+
if (contextKind === CodeFixContextKind.TaskContext) {
|
|
337
|
+
const taskContext = run.taskContext;
|
|
338
|
+
const findings = (taskContext === null || taskContext === void 0 ? void 0 : taskContext.performanceFindings) || [];
|
|
339
|
+
if (!(taskContext === null || taskContext === void 0 ? void 0 : taskContext.traceId) || findings.length === 0) {
|
|
340
|
+
return Response.sendErrorResponse(req, res, new BadDataException("This performance-fix task has no stored trace evidence — the task has nothing to work from."));
|
|
341
|
+
}
|
|
342
|
+
// Deduped name+duration summary of every implicated span.
|
|
343
|
+
const spanSummaries = [];
|
|
344
|
+
const seenSpanIds = new Set();
|
|
345
|
+
for (const finding of findings) {
|
|
346
|
+
for (const implicated of finding.implicatedSpans) {
|
|
347
|
+
if (!seenSpanIds.has(implicated.spanId)) {
|
|
348
|
+
seenSpanIds.add(implicated.spanId);
|
|
349
|
+
spanSummaries.push(implicated);
|
|
350
|
+
}
|
|
206
351
|
}
|
|
207
352
|
}
|
|
353
|
+
/*
|
|
354
|
+
* Repository resolution: the implicated spans' code.*
|
|
355
|
+
* attributes (when the instrumentation stamps them) become a
|
|
356
|
+
* synthetic stack trace for the path matcher — each line is
|
|
357
|
+
* shaped so extractCandidatePathsFromStackTrace parses it.
|
|
358
|
+
* Without code attributes this degrades to the name-match /
|
|
359
|
+
* only-repository fallbacks, exactly like the subject recipes.
|
|
360
|
+
*/
|
|
361
|
+
const codeLocations = taskContext.codeLocations || [];
|
|
362
|
+
const syntheticStackTrace = codeLocations.length > 0
|
|
363
|
+
? codeLocations
|
|
364
|
+
.map((location) => {
|
|
365
|
+
var _a;
|
|
366
|
+
return ` at ${location.functionName ? `${location.functionName} ` : ""}(${location.filePath}:${(_a = location.lineNumber) !== null && _a !== void 0 ? _a : 1})`;
|
|
367
|
+
})
|
|
368
|
+
.join("\n")
|
|
369
|
+
: null;
|
|
370
|
+
const serviceName = taskContext.serviceName || null;
|
|
371
|
+
const resolution = await CodeRepositoryService.resolveRepositoryForException({
|
|
372
|
+
projectId: run.projectId,
|
|
373
|
+
stackTrace: syntheticStackTrace,
|
|
374
|
+
serviceName,
|
|
375
|
+
});
|
|
376
|
+
const repository = resolution
|
|
377
|
+
? await CodeRepositoryService.findOneById({
|
|
378
|
+
id: new ObjectID(resolution.codeRepositoryId),
|
|
379
|
+
select: {
|
|
380
|
+
_id: true,
|
|
381
|
+
name: true,
|
|
382
|
+
repositoryHostedAt: true,
|
|
383
|
+
organizationName: true,
|
|
384
|
+
repositoryName: true,
|
|
385
|
+
mainBranchName: true,
|
|
386
|
+
gitHubAppInstallationId: true,
|
|
387
|
+
},
|
|
388
|
+
props: {
|
|
389
|
+
isRoot: true,
|
|
390
|
+
},
|
|
391
|
+
})
|
|
392
|
+
: null;
|
|
393
|
+
/*
|
|
394
|
+
* The rendered evidence rides in analysisMarkdown and the top
|
|
395
|
+
* finding's headline in subjectTitle, so the shared
|
|
396
|
+
* SubjectPullRequestTaskHandler pipeline needs no special
|
|
397
|
+
* casing — the structured findings travel alongside.
|
|
398
|
+
*/
|
|
399
|
+
const basePayload = {
|
|
400
|
+
subjectType: "trace",
|
|
401
|
+
subjectTitle: findings[0].headline,
|
|
402
|
+
analysisMarkdown: SpanTreeAnalyzer.renderFindingsMarkdown(findings),
|
|
403
|
+
serviceName,
|
|
404
|
+
projectId: run.projectId.toString(),
|
|
405
|
+
traceId: taskContext.traceId,
|
|
406
|
+
findings: findings,
|
|
407
|
+
spanSummaries: spanSummaries,
|
|
408
|
+
};
|
|
409
|
+
if (!resolution || !repository) {
|
|
410
|
+
logger.debug(`No repository resolved for ${taskType} task ${taskId.toString()}`, getLogAttributesFromRequest(req));
|
|
411
|
+
return Response.sendJsonObjectResponse(req, res, Object.assign(Object.assign({}, basePayload), { repositories: [], resolutionError: "Could not resolve a repository for this performance-fix task: the trace's spans carried no matching code file paths, no connected repository name matches the affected service, and the project has more than one repository. Connect the right repository via the GitHub App, or rename one to match the service." }));
|
|
412
|
+
}
|
|
413
|
+
logger.debug(`Resolved repository ${resolution.organizationName}/${resolution.repositoryName} for ${taskType} task ${taskId.toString()} via ${resolution.method}: ${resolution.evidence}`, getLogAttributesFromRequest(req));
|
|
414
|
+
return Response.sendJsonObjectResponse(req, res, Object.assign(Object.assign({}, basePayload), { repositories: [
|
|
415
|
+
{
|
|
416
|
+
id: repository.id.toString(),
|
|
417
|
+
name: repository.name || "",
|
|
418
|
+
repositoryHostedAt: repository.repositoryHostedAt || "",
|
|
419
|
+
organizationName: repository.organizationName || "",
|
|
420
|
+
repositoryName: repository.repositoryName || "",
|
|
421
|
+
mainBranchName: repository.mainBranchName || "main",
|
|
422
|
+
servicePathInRepository: resolution.servicePathInRepository,
|
|
423
|
+
gitHubAppInstallationId: repository.gitHubAppInstallationId || null,
|
|
424
|
+
resolutionMethod: resolution.method,
|
|
425
|
+
resolutionEvidence: resolution.evidence,
|
|
426
|
+
},
|
|
427
|
+
] }));
|
|
428
|
+
}
|
|
429
|
+
if (!run.triggeredByIncidentId && !run.triggeredByAlertId) {
|
|
430
|
+
return Response.sendErrorResponse(req, res, new BadDataException("This task has no incident or alert subject"));
|
|
431
|
+
}
|
|
432
|
+
const subjectType = run.triggeredByIncidentId
|
|
433
|
+
? "incident"
|
|
434
|
+
: "alert";
|
|
435
|
+
let subjectTitle = "";
|
|
436
|
+
/*
|
|
437
|
+
* Best-effort service attribution from the subject's monitors —
|
|
438
|
+
* it only feeds the repository name-match fallback, so null is
|
|
439
|
+
* fine when the subject has no monitor.
|
|
440
|
+
*/
|
|
441
|
+
let serviceName = null;
|
|
442
|
+
let analysisMarkdown = null;
|
|
443
|
+
if (run.triggeredByIncidentId) {
|
|
444
|
+
const incident = await IncidentService.findOneById({
|
|
445
|
+
id: run.triggeredByIncidentId,
|
|
446
|
+
select: {
|
|
447
|
+
title: true,
|
|
448
|
+
monitors: {
|
|
449
|
+
name: true,
|
|
450
|
+
},
|
|
451
|
+
},
|
|
452
|
+
props: {
|
|
453
|
+
isRoot: true,
|
|
454
|
+
},
|
|
455
|
+
});
|
|
456
|
+
if (!incident) {
|
|
457
|
+
return Response.sendErrorResponse(req, res, new BadDataException("The incident this task was created for no longer exists"));
|
|
458
|
+
}
|
|
459
|
+
subjectTitle = incident.title || "Untitled incident";
|
|
460
|
+
serviceName =
|
|
461
|
+
(incident.monitors || [])
|
|
462
|
+
.map((monitor) => {
|
|
463
|
+
return monitor.name || "";
|
|
464
|
+
})
|
|
465
|
+
.filter(Boolean)[0] || null;
|
|
466
|
+
const feedItem = await IncidentFeedService.findOneBy({
|
|
467
|
+
query: {
|
|
468
|
+
incidentId: run.triggeredByIncidentId,
|
|
469
|
+
incidentFeedEventType: IncidentFeedEventType.RootCause,
|
|
470
|
+
},
|
|
471
|
+
select: {
|
|
472
|
+
feedInfoInMarkdown: true,
|
|
473
|
+
},
|
|
474
|
+
sort: {
|
|
475
|
+
createdAt: SortOrder.Descending,
|
|
476
|
+
},
|
|
477
|
+
props: {
|
|
478
|
+
isRoot: true,
|
|
479
|
+
},
|
|
480
|
+
});
|
|
481
|
+
analysisMarkdown = (feedItem === null || feedItem === void 0 ? void 0 : feedItem.feedInfoInMarkdown) || null;
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
const alert = await AlertService.findOneById({
|
|
485
|
+
id: run.triggeredByAlertId,
|
|
486
|
+
select: {
|
|
487
|
+
title: true,
|
|
488
|
+
monitor: {
|
|
489
|
+
name: true,
|
|
490
|
+
},
|
|
491
|
+
},
|
|
492
|
+
props: {
|
|
493
|
+
isRoot: true,
|
|
494
|
+
},
|
|
495
|
+
});
|
|
496
|
+
if (!alert) {
|
|
497
|
+
return Response.sendErrorResponse(req, res, new BadDataException("The alert this task was created for no longer exists"));
|
|
498
|
+
}
|
|
499
|
+
subjectTitle = alert.title || "Untitled alert";
|
|
500
|
+
serviceName = ((_a = alert.monitor) === null || _a === void 0 ? void 0 : _a.name) || null;
|
|
501
|
+
const feedItem = await AlertFeedService.findOneBy({
|
|
502
|
+
query: {
|
|
503
|
+
alertId: run.triggeredByAlertId,
|
|
504
|
+
alertFeedEventType: AlertFeedEventType.RootCause,
|
|
505
|
+
},
|
|
506
|
+
select: {
|
|
507
|
+
feedInfoInMarkdown: true,
|
|
508
|
+
},
|
|
509
|
+
sort: {
|
|
510
|
+
createdAt: SortOrder.Descending,
|
|
511
|
+
},
|
|
512
|
+
props: {
|
|
513
|
+
isRoot: true,
|
|
514
|
+
},
|
|
515
|
+
});
|
|
516
|
+
analysisMarkdown = (feedItem === null || feedItem === void 0 ? void 0 : feedItem.feedInfoInMarkdown) || null;
|
|
517
|
+
}
|
|
518
|
+
if (!analysisMarkdown) {
|
|
519
|
+
return Response.sendErrorResponse(req, res, new BadDataException(`No posted investigation analysis found for this ${subjectType} — the task has nothing to work from (the analysis feed item may have been deleted).`));
|
|
208
520
|
}
|
|
209
|
-
|
|
521
|
+
/*
|
|
522
|
+
* Resolve the repository WITHOUT a stack trace — these tasks have
|
|
523
|
+
* no exception, so only the name-match (against the subject's
|
|
524
|
+
* monitor/service name) and only-repository fallbacks apply. When
|
|
525
|
+
* nothing resolves the worker fails the run with this guidance.
|
|
526
|
+
*/
|
|
527
|
+
const resolution = await CodeRepositoryService.resolveRepositoryForException({
|
|
528
|
+
projectId: run.projectId,
|
|
529
|
+
stackTrace: null,
|
|
530
|
+
serviceName,
|
|
531
|
+
});
|
|
532
|
+
const repository = resolution
|
|
533
|
+
? await CodeRepositoryService.findOneById({
|
|
534
|
+
id: new ObjectID(resolution.codeRepositoryId),
|
|
535
|
+
select: {
|
|
536
|
+
_id: true,
|
|
537
|
+
name: true,
|
|
538
|
+
repositoryHostedAt: true,
|
|
539
|
+
organizationName: true,
|
|
540
|
+
repositoryName: true,
|
|
541
|
+
mainBranchName: true,
|
|
542
|
+
gitHubAppInstallationId: true,
|
|
543
|
+
},
|
|
544
|
+
props: {
|
|
545
|
+
isRoot: true,
|
|
546
|
+
},
|
|
547
|
+
})
|
|
548
|
+
: null;
|
|
549
|
+
if (!resolution || !repository) {
|
|
550
|
+
logger.debug(`No repository resolved for ${taskType} task ${taskId.toString()}`, getLogAttributesFromRequest(req));
|
|
551
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
552
|
+
subjectType,
|
|
553
|
+
subjectTitle,
|
|
554
|
+
analysisMarkdown,
|
|
555
|
+
serviceName,
|
|
556
|
+
projectId: run.projectId.toString(),
|
|
557
|
+
repositories: [],
|
|
558
|
+
resolutionError: "Could not resolve a repository for this task: no connected repository name matches the affected monitor/service and the project has more than one repository. Connect the right repository via the GitHub App, or rename one to match the service.",
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
logger.debug(`Resolved repository ${resolution.organizationName}/${resolution.repositoryName} for ${taskType} task ${taskId.toString()} via ${resolution.method}: ${resolution.evidence}`, getLogAttributesFromRequest(req));
|
|
210
562
|
return Response.sendJsonObjectResponse(req, res, {
|
|
211
|
-
|
|
563
|
+
subjectType,
|
|
564
|
+
subjectTitle,
|
|
565
|
+
analysisMarkdown,
|
|
566
|
+
serviceName,
|
|
567
|
+
projectId: run.projectId.toString(),
|
|
568
|
+
repositories: [
|
|
569
|
+
{
|
|
570
|
+
id: repository.id.toString(),
|
|
571
|
+
name: repository.name || "",
|
|
572
|
+
repositoryHostedAt: repository.repositoryHostedAt || "",
|
|
573
|
+
organizationName: repository.organizationName || "",
|
|
574
|
+
repositoryName: repository.repositoryName || "",
|
|
575
|
+
mainBranchName: repository.mainBranchName || "main",
|
|
576
|
+
servicePathInRepository: resolution.servicePathInRepository,
|
|
577
|
+
gitHubAppInstallationId: repository.gitHubAppInstallationId || null,
|
|
578
|
+
resolutionMethod: resolution.method,
|
|
579
|
+
resolutionEvidence: resolution.evidence,
|
|
580
|
+
},
|
|
581
|
+
],
|
|
212
582
|
});
|
|
213
583
|
}
|
|
214
584
|
catch (err) {
|
|
@@ -217,6 +587,7 @@ export default class AIAgentDataAPI {
|
|
|
217
587
|
});
|
|
218
588
|
// Get access token for a code repository
|
|
219
589
|
this.router.post("/ai-agent-data/get-repository-token", async (req, res, next) => {
|
|
590
|
+
var _a;
|
|
220
591
|
try {
|
|
221
592
|
const data = req.body;
|
|
222
593
|
// Validate AI Agent credentials
|
|
@@ -238,6 +609,7 @@ export default class AIAgentDataAPI {
|
|
|
238
609
|
organizationName: true,
|
|
239
610
|
repositoryName: true,
|
|
240
611
|
gitHubAppInstallationId: true,
|
|
612
|
+
maxOpenFixPullRequests: true,
|
|
241
613
|
},
|
|
242
614
|
props: {
|
|
243
615
|
isRoot: true,
|
|
@@ -254,6 +626,22 @@ export default class AIAgentDataAPI {
|
|
|
254
626
|
if (!codeRepository.gitHubAppInstallationId) {
|
|
255
627
|
return Response.sendErrorResponse(req, res, new BadDataException("No GitHub App installation ID found for this repository"));
|
|
256
628
|
}
|
|
629
|
+
/*
|
|
630
|
+
* G11 guardrail: per-repo open-PR cap, enforced HERE because the
|
|
631
|
+
* token is the agent's only way to clone and push — a repo at its
|
|
632
|
+
* cap physically cannot receive another AI branch or PR. The
|
|
633
|
+
* worker records this message as the run's failure guidance.
|
|
634
|
+
*/
|
|
635
|
+
const openPrCap = await OpenPullRequestCap.checkForRepository({
|
|
636
|
+
codeRepositoryId,
|
|
637
|
+
configuredLimit: (_a = codeRepository.maxOpenFixPullRequests) !== null && _a !== void 0 ? _a : null,
|
|
638
|
+
});
|
|
639
|
+
if (!openPrCap.allowed) {
|
|
640
|
+
return Response.sendErrorResponse(req, res, new BadDataException(OpenPullRequestCap.describeRejection({
|
|
641
|
+
decision: openPrCap,
|
|
642
|
+
repositoryName: `${codeRepository.organizationName}/${codeRepository.repositoryName}`,
|
|
643
|
+
})));
|
|
644
|
+
}
|
|
257
645
|
/*
|
|
258
646
|
* Generate GitHub installation access token with write permissions
|
|
259
647
|
* Required for AI Agent to push branches and create pull requests
|
|
@@ -311,8 +699,11 @@ export default class AIAgentDataAPI {
|
|
|
311
699
|
const description = data["description"];
|
|
312
700
|
const headRefName = data["headRefName"];
|
|
313
701
|
const baseRefName = data["baseRefName"];
|
|
314
|
-
|
|
315
|
-
|
|
702
|
+
/*
|
|
703
|
+
* `taskId` carries the AIRun id of the code-fix run — get the run
|
|
704
|
+
* for the project ID and so the PR can be recorded on its trail.
|
|
705
|
+
*/
|
|
706
|
+
const run = await AIRunService.findOneById({
|
|
316
707
|
id: taskId,
|
|
317
708
|
select: {
|
|
318
709
|
_id: true,
|
|
@@ -322,7 +713,7 @@ export default class AIAgentDataAPI {
|
|
|
322
713
|
isRoot: true,
|
|
323
714
|
},
|
|
324
715
|
});
|
|
325
|
-
if (!
|
|
716
|
+
if (!run) {
|
|
326
717
|
return Response.sendErrorResponse(req, res, new BadDataException("Task not found"));
|
|
327
718
|
}
|
|
328
719
|
// Get code repository for organization and repo name
|
|
@@ -339,10 +730,10 @@ export default class AIAgentDataAPI {
|
|
|
339
730
|
});
|
|
340
731
|
// Create the pull request record
|
|
341
732
|
const pullRequest = new AIAgentTaskPullRequest();
|
|
342
|
-
if (
|
|
343
|
-
pullRequest.projectId =
|
|
733
|
+
if (run.projectId) {
|
|
734
|
+
pullRequest.projectId = run.projectId;
|
|
344
735
|
}
|
|
345
|
-
pullRequest.
|
|
736
|
+
pullRequest.aiRunId = taskId;
|
|
346
737
|
pullRequest.aiAgentId = aiAgent.id;
|
|
347
738
|
pullRequest.codeRepositoryId = codeRepositoryId;
|
|
348
739
|
pullRequest.pullRequestUrl = URL.fromString(pullRequestUrl);
|
|
@@ -375,7 +766,22 @@ export default class AIAgentDataAPI {
|
|
|
375
766
|
isRoot: true,
|
|
376
767
|
},
|
|
377
768
|
});
|
|
378
|
-
|
|
769
|
+
/*
|
|
770
|
+
* The pull request is the run's headline action — record it on
|
|
771
|
+
* the run's glass-box trail so the activity feed shows it.
|
|
772
|
+
*/
|
|
773
|
+
if (run.projectId) {
|
|
774
|
+
await AIRunEventService.appendEventToRun({
|
|
775
|
+
projectId: run.projectId,
|
|
776
|
+
aiRunId: taskId,
|
|
777
|
+
eventType: AIRunEventType.ActionExecuted,
|
|
778
|
+
toolName: "open_pull_request",
|
|
779
|
+
resultSummary: {
|
|
780
|
+
message: `Opened pull request: ${title} — ${pullRequestUrl}`,
|
|
781
|
+
},
|
|
782
|
+
});
|
|
783
|
+
}
|
|
784
|
+
logger.debug(`Recorded pull request ${pullRequestUrl} for run ${taskId.toString()}`, getLogAttributesFromRequest(req));
|
|
379
785
|
return Response.sendJsonObjectResponse(req, res, {
|
|
380
786
|
success: true,
|
|
381
787
|
pullRequestId: (_a = createdPullRequest._id) === null || _a === void 0 ? void 0 : _a.toString(),
|
|
@@ -386,6 +792,83 @@ export default class AIAgentDataAPI {
|
|
|
386
792
|
}
|
|
387
793
|
});
|
|
388
794
|
}
|
|
795
|
+
/*
|
|
796
|
+
* Parse the completion request's messages into the LLMMessage shape —
|
|
797
|
+
* strict on structure (role whitelist, string content) so malformed
|
|
798
|
+
* worker payloads fail with a clear 4xx instead of a provider error.
|
|
799
|
+
*/
|
|
800
|
+
parseCompletionMessages(raw) {
|
|
801
|
+
if (!Array.isArray(raw) || raw.length === 0) {
|
|
802
|
+
throw new BadDataException("messages must be a non-empty array");
|
|
803
|
+
}
|
|
804
|
+
const validRoles = ["system", "user", "assistant", "tool"];
|
|
805
|
+
return raw.map((entry, index) => {
|
|
806
|
+
if (!entry || typeof entry !== "object") {
|
|
807
|
+
throw new BadDataException(`messages[${index}] must be an object`);
|
|
808
|
+
}
|
|
809
|
+
const messageObject = entry;
|
|
810
|
+
const role = messageObject["role"];
|
|
811
|
+
if (!validRoles.includes(role)) {
|
|
812
|
+
throw new BadDataException(`messages[${index}].role must be one of: ${validRoles.join(", ")}`);
|
|
813
|
+
}
|
|
814
|
+
const message = {
|
|
815
|
+
role: role,
|
|
816
|
+
content: typeof messageObject["content"] === "string"
|
|
817
|
+
? messageObject["content"]
|
|
818
|
+
: "",
|
|
819
|
+
};
|
|
820
|
+
if (Array.isArray(messageObject["toolCalls"])) {
|
|
821
|
+
message.toolCalls = messageObject["toolCalls"].map((toolCall, toolCallIndex) => {
|
|
822
|
+
if (typeof toolCall["id"] !== "string" ||
|
|
823
|
+
typeof toolCall["name"] !== "string") {
|
|
824
|
+
throw new BadDataException(`messages[${index}].toolCalls[${toolCallIndex}] must carry string id and name`);
|
|
825
|
+
}
|
|
826
|
+
return {
|
|
827
|
+
id: toolCall["id"],
|
|
828
|
+
name: toolCall["name"],
|
|
829
|
+
arguments: toolCall["arguments"] &&
|
|
830
|
+
typeof toolCall["arguments"] === "object" &&
|
|
831
|
+
!Array.isArray(toolCall["arguments"])
|
|
832
|
+
? toolCall["arguments"]
|
|
833
|
+
: {},
|
|
834
|
+
};
|
|
835
|
+
});
|
|
836
|
+
}
|
|
837
|
+
if (typeof messageObject["toolCallId"] === "string") {
|
|
838
|
+
message.toolCallId = messageObject["toolCallId"];
|
|
839
|
+
}
|
|
840
|
+
return message;
|
|
841
|
+
});
|
|
842
|
+
}
|
|
843
|
+
// Parse the completion request's tool definitions (optional).
|
|
844
|
+
parseCompletionTools(raw) {
|
|
845
|
+
if (raw === undefined || raw === null) {
|
|
846
|
+
return undefined;
|
|
847
|
+
}
|
|
848
|
+
if (!Array.isArray(raw)) {
|
|
849
|
+
throw new BadDataException("tools must be an array when provided");
|
|
850
|
+
}
|
|
851
|
+
if (raw.length === 0) {
|
|
852
|
+
return undefined;
|
|
853
|
+
}
|
|
854
|
+
return raw.map((entry, index) => {
|
|
855
|
+
if (!entry || typeof entry !== "object") {
|
|
856
|
+
throw new BadDataException(`tools[${index}] must be an object`);
|
|
857
|
+
}
|
|
858
|
+
const toolObject = entry;
|
|
859
|
+
if (typeof toolObject["name"] !== "string" ||
|
|
860
|
+
typeof toolObject["description"] !== "string" ||
|
|
861
|
+
!toolObject["inputSchema"] ||
|
|
862
|
+
typeof toolObject["inputSchema"] !== "object") {
|
|
863
|
+
throw new BadDataException(`tools[${index}] must carry string name, string description and an inputSchema object`);
|
|
864
|
+
}
|
|
865
|
+
return {
|
|
866
|
+
name: toolObject["name"],
|
|
867
|
+
description: toolObject["description"],
|
|
868
|
+
inputSchema: toolObject["inputSchema"],
|
|
869
|
+
};
|
|
870
|
+
});
|
|
871
|
+
}
|
|
389
872
|
// Validate AI Agent credentials from request body
|
|
390
873
|
async validateAIAgent(data) {
|
|
391
874
|
if (!data["aiAgentId"] || !data["aiAgentKey"]) {
|