@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.
- 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/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/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 +2 -1
- 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/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/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/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.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
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import OneUptimeDate from "../../../../../Types/Date";
|
|
11
|
+
import LIMIT_MAX from "../../../../../Types/Database/LimitMax";
|
|
12
|
+
import Project from "../../../../../Models/DatabaseModels/Project";
|
|
13
|
+
import AIInsightStatus from "../../../../../Types/AI/AIInsightStatus";
|
|
14
|
+
import ProjectService from "../../../../Services/ProjectService";
|
|
15
|
+
import AIInsightService from "../../../../Services/AIInsightService";
|
|
16
|
+
import InsightDetectors from "./Detectors/Index";
|
|
17
|
+
import InsightStore from "./InsightStore";
|
|
18
|
+
import InsightFixRouting from "./FixRouting";
|
|
19
|
+
import InsightTriage from "./Triage";
|
|
20
|
+
import logger from "../../../Logger";
|
|
21
|
+
import CaptureSpan from "../../../Telemetry/CaptureSpan";
|
|
22
|
+
/*
|
|
23
|
+
* AI Insights — the scan orchestration (the "watch loop").
|
|
24
|
+
*
|
|
25
|
+
* THE RULE: no LLM here. Detectors are deterministic statistical sensors;
|
|
26
|
+
* the LLM only engages per-finding AFTERWARDS through InsightTriage
|
|
27
|
+
* (budgeted, read-only), and the fix decision inside InsightFixRouting is
|
|
28
|
+
* deterministic and reuses the existing budgeted CodeFix creation paths.
|
|
29
|
+
*
|
|
30
|
+
* Everything is opt-in and quiet: only projects with the default-false
|
|
31
|
+
* enableAiInsights flag are scanned, insights never page and never
|
|
32
|
+
* open incidents, and every layer (project, detector, insight) fails in
|
|
33
|
+
* isolation — one broken tenant or sensor must not stop the sweep.
|
|
34
|
+
*/
|
|
35
|
+
export default class InsightScanner {
|
|
36
|
+
/*
|
|
37
|
+
* One scan tick across all opted-in projects. The flag query IS the gate:
|
|
38
|
+
* enableAiInsights defaults to false, so nothing runs for a project
|
|
39
|
+
* that never opted in. Runs as root with explicit projectId scoping
|
|
40
|
+
* (monitor-worker precedent), not per-user ACL. Never throws — the cron
|
|
41
|
+
* caller gets a clean resolve either way.
|
|
42
|
+
*/
|
|
43
|
+
static async scanAllProjects() {
|
|
44
|
+
var _a;
|
|
45
|
+
let projects = [];
|
|
46
|
+
try {
|
|
47
|
+
projects = await ProjectService.findBy({
|
|
48
|
+
query: { enableAiInsights: true },
|
|
49
|
+
select: {
|
|
50
|
+
_id: true,
|
|
51
|
+
enableInsightFixTasks: true,
|
|
52
|
+
enableAi: true,
|
|
53
|
+
},
|
|
54
|
+
limit: LIMIT_MAX,
|
|
55
|
+
skip: 0,
|
|
56
|
+
props: { isRoot: true },
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
logger.error(`AI Insights: failed to list opted-in projects for the scan tick: ${error}`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
for (const project of projects) {
|
|
64
|
+
try {
|
|
65
|
+
await this.scanProjectForInsights(project);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
logger.error(`AI Insights: scan failed for project ${(_a = project.id) === null || _a === void 0 ? void 0 : _a.toString()}: ${error}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/*
|
|
73
|
+
* One project's scan: self-heal any insight an earlier tick left unrouted,
|
|
74
|
+
* run every registered detector (isolated — one failing sensor must not
|
|
75
|
+
* blind the others), dedupe/upsert the candidates through InsightStore,
|
|
76
|
+
* then route each NEWLY created insight to FixOpened or ActionRequired and
|
|
77
|
+
* enqueue its triage.
|
|
78
|
+
*/
|
|
79
|
+
static async scanProjectForInsights(project) {
|
|
80
|
+
var _a;
|
|
81
|
+
const projectId = project.id || undefined;
|
|
82
|
+
if (!projectId) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
/*
|
|
86
|
+
* The self-heal sweep runs FIRST — before the detectors — so it can only
|
|
87
|
+
* ever see rows from EARLIER ticks: this tick's own new rows do not
|
|
88
|
+
* exist yet and therefore cannot be routed twice.
|
|
89
|
+
*/
|
|
90
|
+
await this.rerouteStrandedInsights({
|
|
91
|
+
projectId: projectId,
|
|
92
|
+
project: project,
|
|
93
|
+
});
|
|
94
|
+
// The tick's single clock — detectors compute all windows from it.
|
|
95
|
+
const now = OneUptimeDate.getCurrentDate();
|
|
96
|
+
const context = {
|
|
97
|
+
projectId: projectId,
|
|
98
|
+
now: now,
|
|
99
|
+
};
|
|
100
|
+
const candidates = [];
|
|
101
|
+
const detectors = InsightDetectors.getAllDetectors();
|
|
102
|
+
for (const detector of detectors) {
|
|
103
|
+
try {
|
|
104
|
+
const detected = await detector.detect(context);
|
|
105
|
+
candidates.push(...detected);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
logger.error(`AI Insights: ${detector.insightType} detector failed for project ${projectId.toString()} — continuing with the remaining detectors: ${error}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (candidates.length === 0) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const upsertResult = await InsightStore.upsertCandidates({
|
|
115
|
+
projectId: projectId,
|
|
116
|
+
candidates: candidates,
|
|
117
|
+
now: now,
|
|
118
|
+
});
|
|
119
|
+
/*
|
|
120
|
+
* Only NEWLY created insights are routed — refreshed rows were routed
|
|
121
|
+
* on the tick that created them and their status is owned by humans and
|
|
122
|
+
* the fix flow from then on.
|
|
123
|
+
*/
|
|
124
|
+
for (const insight of upsertResult.created) {
|
|
125
|
+
try {
|
|
126
|
+
await this.routeNewInsight({ insight: insight, project: project });
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
logger.error(`AI Insights: routing failed for insight ${(_a = insight.id) === null || _a === void 0 ? void 0 : _a.toString()} (project ${projectId.toString()}) — continuing with the remaining insights: ${error}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/*
|
|
134
|
+
* Self-heal for insights stranded in the defensive Detected state.
|
|
135
|
+
*
|
|
136
|
+
* InsightStore CREATES rows as Detected and the routing status write is a
|
|
137
|
+
* SEPARATE, later write. If the pod dies in between (eviction, OOM,
|
|
138
|
+
* deploy) — or that write simply fails — the row is stranded: later ticks
|
|
139
|
+
* take the REFRESH path, which by contract never touches status and never
|
|
140
|
+
* re-routes, so the insight would stay Detected FOREVER: never triaged,
|
|
141
|
+
* never fix-routed, and its fingerprint permanently pinned (the dedupe
|
|
142
|
+
* lookup would keep refreshing the dead row instead of letting a fresh,
|
|
143
|
+
* routable insight be created for that finding).
|
|
144
|
+
*
|
|
145
|
+
* RE-ROUTING IS SAFE BY CONSTRUCTION — it cannot double-create work:
|
|
146
|
+
* - fix creation dedupes inside the creation paths (per (exception,
|
|
147
|
+
* recipe) for FixException, per trace for FixPerformance), so a row
|
|
148
|
+
* that DID get its fix run created before the pod died gets a rejected
|
|
149
|
+
* create here, which InsightFixRouting swallows into "no fix opened";
|
|
150
|
+
* - triage dedupes to one non-terminal run per insight, so a re-routed
|
|
151
|
+
* insight with a live triage run enqueues nothing;
|
|
152
|
+
* - both status writes are idempotent overwrites of the same row.
|
|
153
|
+
* NEVER throws: a sweep failure must not cost the project its scan.
|
|
154
|
+
*/
|
|
155
|
+
static async rerouteStrandedInsights(data) {
|
|
156
|
+
var _a;
|
|
157
|
+
const { projectId, project } = data;
|
|
158
|
+
let stranded = [];
|
|
159
|
+
try {
|
|
160
|
+
stranded = await AIInsightService.findBy({
|
|
161
|
+
query: {
|
|
162
|
+
projectId: projectId,
|
|
163
|
+
status: AIInsightStatus.Detected,
|
|
164
|
+
},
|
|
165
|
+
// Exactly the fields routeNewInsight's collaborators read.
|
|
166
|
+
select: {
|
|
167
|
+
_id: true,
|
|
168
|
+
projectId: true,
|
|
169
|
+
insightType: true,
|
|
170
|
+
serviceName: true,
|
|
171
|
+
traceId: true,
|
|
172
|
+
telemetryExceptionId: true,
|
|
173
|
+
evidence: true,
|
|
174
|
+
},
|
|
175
|
+
limit: LIMIT_MAX,
|
|
176
|
+
skip: 0,
|
|
177
|
+
props: { isRoot: true },
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
logger.error(`AI Insights: failed to sweep unrouted (Detected) insights for project ${projectId.toString()} — continuing with the scan: ${error}`);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
for (const insight of stranded) {
|
|
185
|
+
try {
|
|
186
|
+
await this.routeNewInsight({ insight: insight, project: project });
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
logger.error(`AI Insights: re-routing failed for stranded insight ${(_a = insight.id) === null || _a === void 0 ? void 0 : _a.toString()} (project ${projectId.toString()}) — continuing with the remaining stranded insights: ${error}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/*
|
|
194
|
+
* Route one insight — newly created this tick, or swept up as stranded
|
|
195
|
+
* from an earlier one — out of the defensive Detected state:
|
|
196
|
+
* 1. deterministic fix routing (gated on enableAi + enableInsightFixTasks
|
|
197
|
+
* inside InsightFixRouting) → FixOpened + fixAiRunId, else
|
|
198
|
+
* ActionRequired;
|
|
199
|
+
* 2. triage enqueue for EVERY new insight — triage enriches fix and
|
|
200
|
+
* non-fix insights alike → triageAiRunId when a run was enqueued.
|
|
201
|
+
* Both collaborators are never-throws by contract, but they are wrapped
|
|
202
|
+
* anyway: a contract breach must degrade (no fix / no triage), not leave
|
|
203
|
+
* the insight stuck in Detected or fail the scan.
|
|
204
|
+
*/
|
|
205
|
+
static async routeNewInsight(data) {
|
|
206
|
+
var _a, _b;
|
|
207
|
+
const { insight, project } = data;
|
|
208
|
+
let fixAiRunId = undefined;
|
|
209
|
+
try {
|
|
210
|
+
const fixResult = await InsightFixRouting.routeInsightFix({
|
|
211
|
+
insight: insight,
|
|
212
|
+
project: project,
|
|
213
|
+
});
|
|
214
|
+
fixAiRunId = fixResult.fixAiRunId;
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
logger.error(`AI Insights: fix routing threw for insight ${(_a = insight.id) === null || _a === void 0 ? void 0 : _a.toString()} (treating as no fix opened): ${error}`);
|
|
218
|
+
}
|
|
219
|
+
if (fixAiRunId) {
|
|
220
|
+
await AIInsightService.updateOneById({
|
|
221
|
+
id: insight.id,
|
|
222
|
+
data: {
|
|
223
|
+
status: AIInsightStatus.FixOpened,
|
|
224
|
+
fixAiRunId: fixAiRunId,
|
|
225
|
+
},
|
|
226
|
+
props: { isRoot: true },
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
await AIInsightService.updateOneById({
|
|
231
|
+
id: insight.id,
|
|
232
|
+
data: {
|
|
233
|
+
status: AIInsightStatus.ActionRequired,
|
|
234
|
+
},
|
|
235
|
+
props: { isRoot: true },
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
let triageAiRunId = undefined;
|
|
239
|
+
try {
|
|
240
|
+
const triageResult = await InsightTriage.enqueueInsightTriage({ insight: insight });
|
|
241
|
+
triageAiRunId = triageResult.triageAiRunId;
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
logger.error(`AI Insights: triage enqueue threw for insight ${(_b = insight.id) === null || _b === void 0 ? void 0 : _b.toString()} (continuing without triage): ${error}`);
|
|
245
|
+
}
|
|
246
|
+
if (triageAiRunId) {
|
|
247
|
+
await AIInsightService.updateOneById({
|
|
248
|
+
id: insight.id,
|
|
249
|
+
data: {
|
|
250
|
+
triageAiRunId: triageAiRunId,
|
|
251
|
+
},
|
|
252
|
+
props: { isRoot: true },
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
__decorate([
|
|
258
|
+
CaptureSpan(),
|
|
259
|
+
__metadata("design:type", Function),
|
|
260
|
+
__metadata("design:paramtypes", []),
|
|
261
|
+
__metadata("design:returntype", Promise)
|
|
262
|
+
], InsightScanner, "scanAllProjects", null);
|
|
263
|
+
__decorate([
|
|
264
|
+
CaptureSpan(),
|
|
265
|
+
__metadata("design:type", Function),
|
|
266
|
+
__metadata("design:paramtypes", [Project]),
|
|
267
|
+
__metadata("design:returntype", Promise)
|
|
268
|
+
], InsightScanner, "scanProjectForInsights", null);
|
|
269
|
+
//# sourceMappingURL=InsightScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InsightScanner.js","sourceRoot":"","sources":["../../../../../../../Server/Utils/AI/SRE/Insights/InsightScanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import OneUptimeDate from "../../../../../Types/Date";
|
|
11
|
+
import ColumnLength from "../../../../../Types/Database/ColumnLength";
|
|
12
|
+
import SortOrder from "../../../../../Types/BaseDatabase/SortOrder";
|
|
13
|
+
import AIInsight from "../../../../../Models/DatabaseModels/AIInsight";
|
|
14
|
+
import AIInsightStatus, { AIInsightStatusHelper, } from "../../../../../Types/AI/AIInsightStatus";
|
|
15
|
+
import AIInsightService from "../../../../Services/AIInsightService";
|
|
16
|
+
import logger from "../../../Logger";
|
|
17
|
+
import CaptureSpan from "../../../Telemetry/CaptureSpan";
|
|
18
|
+
/*
|
|
19
|
+
* AI Insights — the dedupe/upsert store between detectors and the
|
|
20
|
+
* AIInsight table. Detectors re-emit the same finding on every scan
|
|
21
|
+
* tick while the underlying signal persists; the store's job is to keep the
|
|
22
|
+
* inbox quiet: one row per live finding (refreshed in place), a cooldown on
|
|
23
|
+
* findings a human already dismissed, and a hard cap on how many NEW rows a
|
|
24
|
+
* single scan may create.
|
|
25
|
+
*/
|
|
26
|
+
/*
|
|
27
|
+
* G4/G11 volume guardrail: a single scan tick may create at most this many
|
|
28
|
+
* NEW insights per project. A telemetry storm (deploy gone wrong, detector
|
|
29
|
+
* mis-tuning) would otherwise flood the inbox — and every new insight fans
|
|
30
|
+
* out into budgeted triage/fix work. Recurring findings still refresh their
|
|
31
|
+
* existing rows beyond the cap; drops are logged, never silent.
|
|
32
|
+
*/
|
|
33
|
+
export const MAX_NEW_INSIGHTS_PER_PROJECT_PER_SCAN = 10;
|
|
34
|
+
/*
|
|
35
|
+
* G11 noise posture: a human dismissal is the strongest precision signal we
|
|
36
|
+
* have, so a finding with the same fingerprint stays suppressed for this
|
|
37
|
+
* many days after the dismissal instead of reappearing on the next tick.
|
|
38
|
+
* After the cooldown (or after a Resolved insight's signal returns) a fresh
|
|
39
|
+
* insight is warranted — a resolved issue that reappears is a regression.
|
|
40
|
+
*/
|
|
41
|
+
export const DISMISSED_COOLDOWN_DAYS = 7;
|
|
42
|
+
/*
|
|
43
|
+
* Column-safety clamps: DatabaseService validates string columns against the
|
|
44
|
+
* model's declared lengths and THROWS on overflow, and detectors embed raw
|
|
45
|
+
* telemetry strings (a span name can be an entire SQL statement, exception
|
|
46
|
+
* types and service names are unbounded). Clamping here — the single choke
|
|
47
|
+
* point where candidates become rows — protects every current and future
|
|
48
|
+
* detector. The fingerprint clamp is applied to the dedupe LOOKUP as well as
|
|
49
|
+
* the insert, so a clamped fingerprint keeps refreshing the same row instead
|
|
50
|
+
* of failing (or duplicating) on every tick. Values mirror the
|
|
51
|
+
* AIInsight column definitions (LongText/ShortText).
|
|
52
|
+
*/
|
|
53
|
+
export const INSIGHT_FINGERPRINT_MAX_LENGTH = ColumnLength.LongText;
|
|
54
|
+
export const INSIGHT_TITLE_MAX_LENGTH = ColumnLength.LongText;
|
|
55
|
+
export const INSIGHT_SERVICE_NAME_MAX_LENGTH = ColumnLength.LongText;
|
|
56
|
+
export const INSIGHT_METRIC_NAME_MAX_LENGTH = ColumnLength.LongText;
|
|
57
|
+
export const INSIGHT_TRACE_ID_MAX_LENGTH = ColumnLength.ShortText;
|
|
58
|
+
export default class InsightStore {
|
|
59
|
+
/*
|
|
60
|
+
* Upsert one scan tick's candidates for one project. For each candidate,
|
|
61
|
+
* the most recent insight with the same (projectId, fingerprint) decides
|
|
62
|
+
* the outcome:
|
|
63
|
+
* - none → CREATE (subject to the per-scan cap)
|
|
64
|
+
* - non-terminal → REFRESH (never touches status)
|
|
65
|
+
* - Dismissed within the cooldown → suppress
|
|
66
|
+
* - Dismissed past the cooldown,
|
|
67
|
+
* or Resolved → CREATE (regression / recurrence)
|
|
68
|
+
* All access is root-props: the scanner is a system actor with explicit
|
|
69
|
+
* projectId scoping, not a per-user ACL consumer.
|
|
70
|
+
*/
|
|
71
|
+
static async upsertCandidates(data) {
|
|
72
|
+
const result = {
|
|
73
|
+
created: [],
|
|
74
|
+
refreshed: 0,
|
|
75
|
+
suppressed: 0,
|
|
76
|
+
droppedByCap: 0,
|
|
77
|
+
};
|
|
78
|
+
// No silent caps: dropped fingerprints are logged after the loop.
|
|
79
|
+
const droppedFingerprints = [];
|
|
80
|
+
for (const candidate of data.candidates) {
|
|
81
|
+
/*
|
|
82
|
+
* Per-candidate isolation: one failing candidate (transient DB error,
|
|
83
|
+
* unexpected data) must not abort the batch — insights created earlier
|
|
84
|
+
* in this tick are returned for routing either way, and the remaining
|
|
85
|
+
* candidates still get their chance. Without this, a mid-batch failure
|
|
86
|
+
* would strand already-created rows in Detected forever (refreshes
|
|
87
|
+
* never touch status, so they would never be routed).
|
|
88
|
+
*/
|
|
89
|
+
try {
|
|
90
|
+
/*
|
|
91
|
+
* The clamped fingerprint is the row's identity everywhere — lookup
|
|
92
|
+
* and insert — so dedupe survives the clamp (see the constants).
|
|
93
|
+
*/
|
|
94
|
+
const fingerprint = this.clampToColumn(candidate.fingerprint, INSIGHT_FINGERPRINT_MAX_LENGTH);
|
|
95
|
+
/*
|
|
96
|
+
* Most recent row wins: (projectId, fingerprint) is deliberately NOT
|
|
97
|
+
* unique — terminal rows accumulate as history — so sort by createdAt
|
|
98
|
+
* to judge against the latest lifecycle state of this finding.
|
|
99
|
+
*/
|
|
100
|
+
const existing = await AIInsightService.findOneBy({
|
|
101
|
+
query: {
|
|
102
|
+
projectId: data.projectId,
|
|
103
|
+
fingerprint: fingerprint,
|
|
104
|
+
},
|
|
105
|
+
select: {
|
|
106
|
+
_id: true,
|
|
107
|
+
status: true,
|
|
108
|
+
occurrenceCount: true,
|
|
109
|
+
humanVerdictAt: true,
|
|
110
|
+
},
|
|
111
|
+
sort: { createdAt: SortOrder.Descending },
|
|
112
|
+
props: { isRoot: true },
|
|
113
|
+
});
|
|
114
|
+
if (existing &&
|
|
115
|
+
existing.status &&
|
|
116
|
+
!AIInsightStatusHelper.isTerminalStatus(existing.status)) {
|
|
117
|
+
/*
|
|
118
|
+
* REFRESH: the finding is still live and already has a row. The
|
|
119
|
+
* evidence/severity are replaced with this tick's numbers (the
|
|
120
|
+
* newest picture of the signal), but status is NEVER touched here —
|
|
121
|
+
* routing (ActionRequired/FixOpened) happened when the row was
|
|
122
|
+
* created and humans/fix flows own it from there.
|
|
123
|
+
*/
|
|
124
|
+
await AIInsightService.updateOneById({
|
|
125
|
+
id: existing.id,
|
|
126
|
+
data: {
|
|
127
|
+
lastSeenAt: data.now,
|
|
128
|
+
occurrenceCount: (existing.occurrenceCount || 1) + 1,
|
|
129
|
+
severity: candidate.severity,
|
|
130
|
+
detailMarkdown: candidate.detailMarkdown,
|
|
131
|
+
evidence: candidate.evidence,
|
|
132
|
+
},
|
|
133
|
+
props: { isRoot: true },
|
|
134
|
+
});
|
|
135
|
+
result.refreshed++;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (existing && existing.status === AIInsightStatus.Dismissed) {
|
|
139
|
+
/*
|
|
140
|
+
* Cooldown is measured from the human's dismissal, inclusive at the
|
|
141
|
+
* boundary (exactly DISMISSED_COOLDOWN_DAYS old still suppresses).
|
|
142
|
+
* A Dismissed row without a verdict timestamp cannot prove the
|
|
143
|
+
* cooldown elapsed, so it suppresses too — when in doubt, stay
|
|
144
|
+
* quiet (G11 noise posture).
|
|
145
|
+
*/
|
|
146
|
+
const cooldownMs = OneUptimeDate.getMillisecondsInDays(DISMISSED_COOLDOWN_DAYS);
|
|
147
|
+
const withinCooldown = existing.humanVerdictAt
|
|
148
|
+
? data.now.getTime() -
|
|
149
|
+
OneUptimeDate.fromString(existing.humanVerdictAt).getTime() <=
|
|
150
|
+
cooldownMs
|
|
151
|
+
: true;
|
|
152
|
+
if (withinCooldown) {
|
|
153
|
+
logger.debug(`AI Insights: suppressing candidate ${fingerprint} for project ${data.projectId.toString()} — dismissed by a human within the last ${DISMISSED_COOLDOWN_DAYS} days.`);
|
|
154
|
+
result.suppressed++;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/*
|
|
159
|
+
* CREATE: no live row for this fingerprint (never seen, Resolved, or
|
|
160
|
+
* Dismissed long enough ago). Subject to the per-scan cap.
|
|
161
|
+
*/
|
|
162
|
+
if (result.created.length >= MAX_NEW_INSIGHTS_PER_PROJECT_PER_SCAN) {
|
|
163
|
+
droppedFingerprints.push(fingerprint);
|
|
164
|
+
result.droppedByCap++;
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const insight = new AIInsight();
|
|
168
|
+
insight.projectId = data.projectId;
|
|
169
|
+
insight.insightType = candidate.insightType;
|
|
170
|
+
// Defensive initial state — the scanner routes it in the same tick.
|
|
171
|
+
insight.status = AIInsightStatus.Detected;
|
|
172
|
+
insight.severity = candidate.severity;
|
|
173
|
+
insight.fingerprint = fingerprint;
|
|
174
|
+
insight.title = this.clampToColumn(candidate.title, INSIGHT_TITLE_MAX_LENGTH);
|
|
175
|
+
insight.detailMarkdown = candidate.detailMarkdown;
|
|
176
|
+
insight.evidence = candidate.evidence;
|
|
177
|
+
insight.firstSeenAt = data.now;
|
|
178
|
+
insight.lastSeenAt = data.now;
|
|
179
|
+
insight.occurrenceCount = 1;
|
|
180
|
+
if (candidate.serviceName) {
|
|
181
|
+
insight.serviceName = this.clampToColumn(candidate.serviceName, INSIGHT_SERVICE_NAME_MAX_LENGTH);
|
|
182
|
+
}
|
|
183
|
+
if (candidate.telemetryServiceId) {
|
|
184
|
+
insight.telemetryServiceId = candidate.telemetryServiceId;
|
|
185
|
+
}
|
|
186
|
+
if (candidate.telemetryExceptionId) {
|
|
187
|
+
insight.telemetryExceptionId = candidate.telemetryExceptionId;
|
|
188
|
+
}
|
|
189
|
+
if (candidate.traceId) {
|
|
190
|
+
insight.traceId = this.clampToColumn(candidate.traceId, INSIGHT_TRACE_ID_MAX_LENGTH);
|
|
191
|
+
}
|
|
192
|
+
if (candidate.metricName) {
|
|
193
|
+
insight.metricName = this.clampToColumn(candidate.metricName, INSIGHT_METRIC_NAME_MAX_LENGTH);
|
|
194
|
+
}
|
|
195
|
+
const created = await AIInsightService.create({
|
|
196
|
+
data: insight,
|
|
197
|
+
props: { isRoot: true },
|
|
198
|
+
});
|
|
199
|
+
result.created.push(created);
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
logger.error(`AI Insights: upsert failed for candidate ${candidate.fingerprint} (project ${data.projectId.toString()}) — continuing with the remaining candidates: ${error}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (result.droppedByCap > 0) {
|
|
206
|
+
logger.debug(`AI Insights: candidate fingerprints dropped by the per-scan cap for project ${data.projectId.toString()}: ${droppedFingerprints.join(", ")}`);
|
|
207
|
+
logger.info(`AI Insights: per-scan new-insight cap (${MAX_NEW_INSIGHTS_PER_PROJECT_PER_SCAN}) reached for project ${data.projectId.toString()} — dropped ${result.droppedByCap} candidate(s) this tick. Recurring findings will re-surface on later ticks if their signal persists.`);
|
|
208
|
+
}
|
|
209
|
+
return result;
|
|
210
|
+
}
|
|
211
|
+
/*
|
|
212
|
+
* Hard code-unit slice to the column's declared length — the same measure
|
|
213
|
+
* DatabaseService validates against, so a clamped value can never trip the
|
|
214
|
+
* length check. No cosmetic ellipsis: detectors own presentation; this is
|
|
215
|
+
* purely a data-safety guard, and it must be deterministic so a clamped
|
|
216
|
+
* fingerprint stays stable across ticks.
|
|
217
|
+
*/
|
|
218
|
+
static clampToColumn(value, maxLength) {
|
|
219
|
+
if (value.length <= maxLength) {
|
|
220
|
+
return value;
|
|
221
|
+
}
|
|
222
|
+
return value.slice(0, maxLength);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
__decorate([
|
|
226
|
+
CaptureSpan(),
|
|
227
|
+
__metadata("design:type", Function),
|
|
228
|
+
__metadata("design:paramtypes", [Object]),
|
|
229
|
+
__metadata("design:returntype", Promise)
|
|
230
|
+
], InsightStore, "upsertCandidates", null);
|
|
231
|
+
//# sourceMappingURL=InsightStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InsightStore.js","sourceRoot":"","sources":["../../../../../../../Server/Utils/AI/SRE/Insights/InsightStore.ts"],"names":[],"mappings":"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"}
|