@oneuptime/common 12.0.4 → 12.0.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/AIRun.ts +38 -1
- package/Models/DatabaseModels/AlertFeed.ts +30 -0
- package/Models/DatabaseModels/Dashboard.ts +28 -0
- package/Models/DatabaseModels/Incident.ts +2 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentFeed.ts +30 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
- package/Models/DatabaseModels/LogSavedView.ts +33 -0
- package/Models/DatabaseModels/Project.ts +231 -9
- package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +4 -4
- package/Models/DatabaseModels/StatusPage.ts +28 -0
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
- package/Server/API/AIAgentDataAPI.ts +44 -55
- package/Server/API/AIInvestigationAPI.ts +175 -17
- package/Server/API/DashboardAPI.ts +10 -10
- package/Server/API/StatusPageAPI.ts +38 -19
- package/Server/EnvironmentConfig.ts +16 -0
- package/Server/Infrastructure/ClickhouseConfig.ts +15 -1
- package/Server/Infrastructure/ClickhouseDatabase.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.ts +89 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.ts +40 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Services/AIRunService.ts +78 -10
- package/Server/Services/AIService.ts +94 -22
- package/Server/Services/AlertFeedService.ts +5 -0
- package/Server/Services/AnalyticsDatabaseService.ts +29 -0
- package/Server/Services/DatabaseService.ts +43 -2
- package/Server/Services/IncidentFeedService.ts +5 -0
- package/Server/Services/LlmLogService.ts +46 -2
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +6 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +4 -0
- package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +8 -5
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +90 -16
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +2 -0
- package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +2 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +223 -22
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +25 -24
- package/Server/Utils/AI/SRE/ConfidenceSignal.ts +182 -71
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +252 -43
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +25 -24
- package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +47 -13
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +9 -5
- package/Server/Utils/AI/SRE/InvestigationQueue.ts +141 -24
- package/Server/Utils/AI/SRE/InvestigationSubjectLock.ts +66 -0
- package/Server/Utils/AI/SRE/PostedRootCause.ts +94 -3
- package/Server/Utils/AI/SRE/README.md +1 -1
- package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +132 -10
- package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +24 -0
- package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +29 -0
- package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +56 -0
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +46 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
- package/Server/Utils/PasswordHash.ts +28 -4
- package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +251 -0
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +747 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +480 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1184 -0
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +500 -0
- package/Tests/App/Dashboard/PortMonitorCriteriaFilter.test.ts +93 -0
- package/Tests/App/StatusPage/PublicStatusPageAPIErrorHandling.test.ts +117 -0
- package/Tests/App/StatusPage/StatusPageModelAPIPolymorphism.test.ts +223 -0
- package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +243 -0
- package/Tests/Server/API/AIAgentDataFixFromIncidentContext.test.ts +266 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +594 -0
- package/Tests/Server/API/AIInvestigationCreateFixTask.test.ts +80 -0
- package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +172 -1
- package/Tests/Server/API/StatusPageMasterPasswordAPI.test.ts +335 -0
- package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +59 -5
- package/Tests/Server/Services/AIRunHumanVerdict.test.ts +127 -58
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +396 -20
- package/Tests/Server/Services/AddMasterPasswordSaltMigration.test.ts +283 -0
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +25 -1
- package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +45 -35
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +54 -0
- package/Tests/Server/Services/FeedAIRunAssociation.test.ts +125 -0
- package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +418 -57
- package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +173 -14
- package/Tests/Server/Services/MasterPasswordScrypt.test.ts +567 -0
- package/Tests/Server/Services/SeparateIncidentAlertAiSettingsMigration.test.ts +194 -0
- package/Tests/Server/Utils/AI/AIAlertGating.test.ts +37 -4
- package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +330 -29
- package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +25 -0
- package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +293 -5
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +59 -1
- package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +342 -19
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +214 -30
- package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +2 -0
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +65 -17
- package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +3 -0
- package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +313 -20
- package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +4 -0
- package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +2 -0
- package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +44 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +30 -0
- package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +212 -0
- package/Tests/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.test.ts +401 -0
- package/Tests/Server/Utils/Monitor/MonitorMetricUtilPortTimings.test.ts +243 -0
- package/Tests/Server/Utils/PasswordHash.test.ts +30 -0
- package/Tests/Types/Dashboard/DashboardTemplates.test.ts +111 -0
- package/Tests/Types/Monitor/CephMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/CriteriaFilter.test.ts +4 -0
- package/Tests/Types/Monitor/DockerMetricCatalog.test.ts +109 -0
- package/Tests/Types/Monitor/DockerSwarmMetricCatalog.test.ts +118 -0
- package/Tests/Types/Monitor/HostMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/IotMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +118 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +42 -0
- package/Tests/Types/Monitor/MonitorStep.test.ts +38 -0
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +75 -0
- package/Tests/Types/Monitor/PodmanMetricCatalog.test.ts +109 -0
- package/Tests/Types/Monitor/ProxmoxMetricCatalog.test.ts +107 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.test.ts +151 -0
- package/Tests/Types/Permission.test.ts +137 -0
- package/Tests/Types/Rum/SessionReplayMaskingMode.test.ts +101 -0
- package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +5 -5
- package/Tests/UI/Components/CardModelDetailEdit.test.tsx +3 -5
- package/Tests/UI/Components/ErrorBoundary.test.tsx +158 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +74 -0
- package/Tests/UI/Components/MoreMenu.test.tsx +756 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +62 -0
- package/Tests/UI/Monitor/PortMonitorView.test.tsx +237 -0
- package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +91 -0
- package/Tests/UI/Utils/DownloadFile.test.ts +103 -0
- package/Tests/UI/Utils/ErrorSupportBundle.test.ts +582 -0
- package/Tests/UI/Utils/Project.test.ts +31 -0
- package/Tests/UI/Utils/StatusPageModelAPIInjection.test.ts +245 -0
- package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +820 -0
- package/Tests/Utils/Dashboard/DashboardViewConfig.test.ts +329 -0
- package/Tests/Utils/Dashboard/GridLayout.test.ts +951 -0
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +117 -0
- package/Tests/Utils/RecordingRuleExpression.test.ts +327 -0
- package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +186 -0
- package/Tests/Utils/StatusPage/GroupTree.test.ts +456 -0
- package/Tests/Utils/StatusPage/OverviewGroupHierarchyVisibility.test.ts +588 -0
- package/Tests/Utils/Telemetry/SavedViewTimeRange.test.ts +244 -0
- package/Tests/Utils/Telemetry/TelemetryQueryTimeRange.test.ts +825 -0
- package/Types/AI/AIRunCodeFixRecommendation.ts +17 -0
- package/Types/AI/CodeFixTaskContext.ts +63 -3
- package/Types/AI/CodeFixTaskType.ts +3 -3
- package/Types/HashedString.ts +4 -3
- package/Types/Monitor/CriteriaFilter.ts +4 -0
- package/Types/Monitor/DomainMonitor/DomainLookupMethod.ts +23 -0
- package/Types/Monitor/DomainMonitor/DomainMonitorResponse.ts +7 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +24 -7
- package/Types/Monitor/MonitorMetricType.ts +8 -0
- package/Types/Monitor/MonitorStep.ts +10 -1
- package/Types/Monitor/MonitorStepDomainMonitor.ts +21 -0
- package/Types/Monitor/PortMonitor/PortMonitorTimings.ts +10 -0
- package/Types/Permission.ts +23 -175
- package/Types/Probe/ProbeMonitorResponse.ts +6 -0
- package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +2 -3
- package/UI/Components/ErrorBoundary.tsx +138 -11
- package/UI/Components/Feed/FeedItem.tsx +9 -2
- package/UI/Components/ModelDetail/CardModelDetail.tsx +0 -12
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +12 -2
- package/UI/Components/MoreMenu/MoreMenu.tsx +285 -97
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +8 -5
- package/UI/Utils/DownloadFile.ts +16 -8
- package/UI/Utils/ErrorSupportBundle.ts +805 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +19 -8
- package/UI/Utils/Project.ts +4 -0
- package/UI/Utils/StatusPage.ts +8 -2
- package/UI/Utils/UseDashboardGridDnd.ts +917 -0
- package/Utils/Dashboard/DashboardViewConfig.ts +80 -36
- package/Utils/Dashboard/GridLayout.ts +523 -0
- package/Utils/Metrics/RecordingRuleExpression.ts +19 -17
- package/Utils/Monitor/MonitorMetricType.ts +44 -2
- package/Utils/StatusPage/GroupNestingLayout.ts +69 -0
- package/Utils/StatusPage/GroupTree.ts +157 -66
- package/Utils/StatusPage/ResourceUptime.ts +37 -2
- package/Utils/Telemetry/SavedViewTimeRange.ts +114 -0
- package/Utils/Telemetry/TelemetryQueryTimeRange.ts +334 -0
- package/build/dist/Models/DatabaseModels/AIRun.js +39 -1
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertFeed.js +32 -0
- package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Dashboard.js +29 -0
- package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +2 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentFeed.js +32 -0
- package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogSavedView.js +33 -0
- package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +241 -11
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +4 -4
- package/build/dist/Models/DatabaseModels/StatusPage.js +29 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +28 -46
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +111 -11
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +8 -5
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +29 -11
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +14 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +12 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +58 -12
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +74 -21
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertFeedService.js +3 -0
- package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +29 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +21 -2
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentFeedService.js +3 -0
- package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
- package/build/dist/Server/Services/LlmLogService.js +22 -1
- package/build/dist/Server/Services/LlmLogService.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +4 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +8 -5
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +63 -24
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +2 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +2 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +156 -28
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +21 -19
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +128 -49
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +170 -31
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +21 -19
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +33 -9
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +9 -5
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +121 -41
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js +46 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js +61 -14
- package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +79 -1
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +21 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +20 -3
- package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +43 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/PasswordHash.js +25 -4
- package/build/dist/Server/Utils/PasswordHash.js.map +1 -1
- package/build/dist/Types/AI/AIRunCodeFixRecommendation.js +18 -0
- package/build/dist/Types/AI/AIRunCodeFixRecommendation.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js +23 -3
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskType.js +3 -3
- package/build/dist/Types/HashedString.js +4 -3
- package/build/dist/Types/HashedString.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +4 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js +24 -0
- package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +24 -7
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +6 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +15 -0
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js +2 -0
- package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js.map +1 -0
- package/build/dist/Types/Permission.js +23 -155
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +2 -5
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +67 -8
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +2 -2
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +0 -12
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +12 -2
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +193 -65
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Utils/DownloadFile.js +15 -8
- package/build/dist/UI/Utils/DownloadFile.js.map +1 -1
- package/build/dist/UI/Utils/ErrorSupportBundle.js +476 -0
- package/build/dist/UI/Utils/ErrorSupportBundle.js.map +1 -0
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -8
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Project.js +3 -0
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/UI/Utils/StatusPage.js +4 -4
- package/build/dist/UI/Utils/StatusPage.js.map +1 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js +551 -0
- package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -0
- package/build/dist/Utils/Dashboard/DashboardViewConfig.js +42 -26
- package/build/dist/Utils/Dashboard/DashboardViewConfig.js.map +1 -1
- package/build/dist/Utils/Dashboard/GridLayout.js +338 -0
- package/build/dist/Utils/Dashboard/GridLayout.js.map +1 -0
- package/build/dist/Utils/Metrics/RecordingRuleExpression.js +19 -17
- package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +38 -6
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js +46 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupTree.js +79 -34
- package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -1
- package/build/dist/Utils/StatusPage/ResourceUptime.js +22 -1
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/Telemetry/SavedViewTimeRange.js +79 -0
- package/build/dist/Utils/Telemetry/SavedViewTimeRange.js.map +1 -0
- package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js +236 -0
- package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import ObjectID from "../../../../Types/ObjectID";
|
|
2
2
|
import AIRunType from "../../../../Types/AI/AIRunType";
|
|
3
3
|
import AIRunStatus from "../../../../Types/AI/AIRunStatus";
|
|
4
|
+
import AIRunCodeFixRecommendation from "../../../../Types/AI/AIRunCodeFixRecommendation";
|
|
5
|
+
import CodeFixTaskContext, {
|
|
6
|
+
getInvestigationCodeFixTaskSnapshot,
|
|
7
|
+
InvestigationCodeFixTaskSnapshot,
|
|
8
|
+
} from "../../../../Types/AI/CodeFixTaskContext";
|
|
4
9
|
import CodeFixTaskType from "../../../../Types/AI/CodeFixTaskType";
|
|
10
|
+
import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
|
|
5
11
|
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
6
12
|
import AIRun from "../../../../Models/DatabaseModels/AIRun";
|
|
7
13
|
import Project from "../../../../Models/DatabaseModels/Project";
|
|
@@ -9,6 +15,7 @@ import AIRunService from "../../../Services/AIRunService";
|
|
|
9
15
|
import ProjectService from "../../../Services/ProjectService";
|
|
10
16
|
import FixRunBudget, { FixRunBudgetDecision } from "../CodeFix/FixRunBudget";
|
|
11
17
|
import SubjectCodeFixRun from "./SubjectCodeFixRun";
|
|
18
|
+
import PostedRootCause from "./PostedRootCause";
|
|
12
19
|
import logger from "../../Logger";
|
|
13
20
|
import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
14
21
|
|
|
@@ -17,28 +24,32 @@ import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
|
17
24
|
* capability, vision §4.8), in two forms:
|
|
18
25
|
*
|
|
19
26
|
* HUMAN-TRIGGERED: after an AI investigation posts a root-cause analysis on
|
|
20
|
-
* an incident or alert
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* No project opt-in flag is needed for
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* message when a gate is not met.
|
|
27
|
+
* an incident or alert and records a Recommended code-fix decision, the user
|
|
28
|
+
* can click "Open Fix PR from this analysis" on the investigation panel: the
|
|
29
|
+
* agent takes the immutable stored copy of that posted analysis as its
|
|
30
|
+
* context and opens a fix pull request. No project opt-in flag is needed for
|
|
31
|
+
* this form, but the durable recommendation remains a server-side gate so a
|
|
32
|
+
* stale or forged client cannot turn a non-code investigation into a PR.
|
|
27
33
|
*
|
|
28
|
-
* AUTOMATIC: for projects that opted in
|
|
29
|
-
* default FALSE — G11 posture:
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
34
|
+
* AUTOMATIC: for projects that opted in through the subject lane's incident
|
|
35
|
+
* or alert automatic-code-fix setting (default FALSE — G11 posture:
|
|
36
|
+
* autonomous PR creation is opt-in only), an
|
|
37
|
+
* investigation that ends with a POSITIVE code-fix classification (per the
|
|
38
|
+
* structured G6 signal, never a regex over the analysis prose) enqueues the
|
|
39
|
+
* same FixFromIncident task with no human click. Confidence alone is not
|
|
40
|
+
* sufficient: operational and other non-code causes do not open PRs. Like its
|
|
41
|
+
* InstrumentationTaskTrigger sibling it runs only after the Recommended
|
|
42
|
+
* decision and snapshot are durable, and it never throws. The PR still opens as a
|
|
35
43
|
* DRAFT and is always human-reviewed — the opt-in moves the human gate from
|
|
36
44
|
* PR creation to PR review, never past it.
|
|
37
45
|
*/
|
|
38
46
|
|
|
39
47
|
export interface AutoFixTaskGateInput {
|
|
40
|
-
// The project row with enableAi +
|
|
48
|
+
// The project row with enableAi + the subject lane's opt-in selected.
|
|
41
49
|
project: Project | null;
|
|
50
|
+
// Exactly one subject selects the incident or alert opt-in.
|
|
51
|
+
incidentId?: ObjectID | undefined;
|
|
52
|
+
alertId?: ObjectID | undefined;
|
|
42
53
|
// Whether the project has at least one GitHub-App-connected repository.
|
|
43
54
|
hasConnectedRepository: boolean;
|
|
44
55
|
// A non-terminal FixFromIncident run for the same subject, if any.
|
|
@@ -59,19 +70,27 @@ export default class FixFromIncidentTaskTrigger {
|
|
|
59
70
|
* incidentId/alertId is expected; userId is the clicking user
|
|
60
71
|
* (attribution on the run).
|
|
61
72
|
*
|
|
62
|
-
* Throws BadDataException naming the failed gate: no
|
|
63
|
-
* investigation, no GitHub-App repository, or a
|
|
73
|
+
* Throws BadDataException naming the failed gate: no latest
|
|
74
|
+
* completed/recommended investigation, no GitHub-App repository, or a
|
|
75
|
+
* duplicate active run.
|
|
64
76
|
*/
|
|
65
77
|
@CaptureSpan()
|
|
66
78
|
public static async createFixTaskFromInvestigation(data: {
|
|
67
79
|
projectId: ObjectID;
|
|
80
|
+
investigationRunId: ObjectID;
|
|
68
81
|
incidentId?: ObjectID | undefined;
|
|
69
82
|
alertId?: ObjectID | undefined;
|
|
70
83
|
userId: ObjectID;
|
|
71
84
|
}): Promise<AIRun> {
|
|
72
|
-
if (!data.
|
|
85
|
+
if (!data.investigationRunId) {
|
|
73
86
|
throw new BadDataException(
|
|
74
|
-
"An
|
|
87
|
+
"An investigation run id is required to create a fix task.",
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (Boolean(data.incidentId) === Boolean(data.alertId)) {
|
|
92
|
+
throw new BadDataException(
|
|
93
|
+
"Exactly one incident or alert subject is required to create a fix task.",
|
|
75
94
|
);
|
|
76
95
|
}
|
|
77
96
|
|
|
@@ -80,28 +99,119 @@ export default class FixFromIncidentTaskTrigger {
|
|
|
80
99
|
: "alert";
|
|
81
100
|
|
|
82
101
|
/*
|
|
83
|
-
* Gate 1:
|
|
84
|
-
*
|
|
85
|
-
*
|
|
102
|
+
* Gate 1: inspect the LATEST investigation for the subject, matching the
|
|
103
|
+
* run shown by the dashboard panel. Its durable recommendation is the
|
|
104
|
+
* server-authored decision about whether a code fix is appropriate, and
|
|
105
|
+
* its taskContext carries the exact posted analysis that decision covered.
|
|
106
|
+
* An older Recommended run must never override a newer NotRecommended,
|
|
107
|
+
* Running or failed result.
|
|
86
108
|
*/
|
|
87
|
-
const
|
|
109
|
+
const latestInvestigation: AIRun | null = await AIRunService.findOneBy({
|
|
88
110
|
query: {
|
|
111
|
+
projectId: data.projectId,
|
|
89
112
|
runType: AIRunType.Investigation,
|
|
90
|
-
status: AIRunStatus.Completed,
|
|
91
113
|
...(data.incidentId
|
|
92
114
|
? { triggeredByIncidentId: data.incidentId }
|
|
93
115
|
: { triggeredByAlertId: data.alertId! }),
|
|
94
116
|
},
|
|
95
|
-
select: {
|
|
117
|
+
select: {
|
|
118
|
+
_id: true,
|
|
119
|
+
completedAt: true,
|
|
120
|
+
status: true,
|
|
121
|
+
codeFixRecommendation: true,
|
|
122
|
+
taskContext: true,
|
|
123
|
+
},
|
|
124
|
+
sort: { createdAt: SortOrder.Descending },
|
|
96
125
|
props: { isRoot: true },
|
|
97
126
|
});
|
|
98
127
|
|
|
99
|
-
if (!
|
|
128
|
+
if (!latestInvestigation) {
|
|
100
129
|
throw new BadDataException(
|
|
101
130
|
`No completed AI investigation exists for this ${subjectLabel} — the fix task uses the investigation's posted analysis as its context. Wait for the investigation to complete, or enable AI investigations in the AI settings.`,
|
|
102
131
|
);
|
|
103
132
|
}
|
|
104
133
|
|
|
134
|
+
if (
|
|
135
|
+
latestInvestigation.id?.toString() !== data.investigationRunId.toString()
|
|
136
|
+
) {
|
|
137
|
+
throw new BadDataException(
|
|
138
|
+
`A newer AI investigation is now available for this ${subjectLabel}. Refresh the page before creating a fix task.`,
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (latestInvestigation.status !== AIRunStatus.Completed) {
|
|
143
|
+
throw new BadDataException(
|
|
144
|
+
`The latest AI investigation for this ${subjectLabel} has not completed, so a fix task cannot be created from an older analysis. Wait for the latest investigation to complete successfully.`,
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (
|
|
149
|
+
latestInvestigation.codeFixRecommendation ===
|
|
150
|
+
AIRunCodeFixRecommendation.Pending
|
|
151
|
+
) {
|
|
152
|
+
throw new BadDataException(
|
|
153
|
+
`The latest AI investigation for this ${subjectLabel} is still deciding whether a code fix is appropriate. Wait for that recommendation to finish before creating a fix task.`,
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (
|
|
158
|
+
latestInvestigation.codeFixRecommendation !==
|
|
159
|
+
AIRunCodeFixRecommendation.Recommended
|
|
160
|
+
) {
|
|
161
|
+
throw new BadDataException(
|
|
162
|
+
`The latest AI investigation for this ${subjectLabel} did not recommend a code fix, so a fix pull request task cannot be created from it.`,
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/*
|
|
167
|
+
* Gate the same immutable pair the worker will consume. A Recommended
|
|
168
|
+
* row without a complete snapshot (or whose snapshot names another run)
|
|
169
|
+
* is unsafe: looking up the subject's latest feed item would allow a
|
|
170
|
+
* later investigation to change the task after this authorization check.
|
|
171
|
+
*/
|
|
172
|
+
const investigationSnapshot: InvestigationCodeFixTaskSnapshot | null =
|
|
173
|
+
getInvestigationCodeFixTaskSnapshot(latestInvestigation.taskContext);
|
|
174
|
+
|
|
175
|
+
if (
|
|
176
|
+
!latestInvestigation.id ||
|
|
177
|
+
!investigationSnapshot ||
|
|
178
|
+
investigationSnapshot.investigationRunId !==
|
|
179
|
+
latestInvestigation.id.toString()
|
|
180
|
+
) {
|
|
181
|
+
throw new BadDataException(
|
|
182
|
+
`The latest AI investigation for this ${subjectLabel} has no complete stored analysis snapshot, so a fix task cannot be created safely. Run a new investigation and try again.`,
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/*
|
|
187
|
+
* The feed item is the published report the user actually saw. Resolve
|
|
188
|
+
* it by the exact run association added to the feed model, then require
|
|
189
|
+
* it to match the durable recommendation snapshot. A missing or
|
|
190
|
+
* mismatched report fails closed instead of silently borrowing a newer
|
|
191
|
+
* subject-level RootCause.
|
|
192
|
+
*/
|
|
193
|
+
const analysisMarkdown: string | null =
|
|
194
|
+
await PostedRootCause.getForInvestigation({
|
|
195
|
+
incidentId: data.incidentId,
|
|
196
|
+
alertId: data.alertId,
|
|
197
|
+
aiRunId: data.investigationRunId,
|
|
198
|
+
runCompletedAt: latestInvestigation.completedAt,
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
if (!analysisMarkdown) {
|
|
202
|
+
throw new BadDataException(
|
|
203
|
+
`No posted investigation analysis exists for this ${subjectLabel} and investigation run. Refresh the page and wait for the report to finish publishing before creating a fix task.`,
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (
|
|
208
|
+
analysisMarkdown !== investigationSnapshot.investigationAnalysisMarkdown
|
|
209
|
+
) {
|
|
210
|
+
throw new BadDataException(
|
|
211
|
+
`The posted investigation analysis for this ${subjectLabel} does not match its durable recommendation snapshot. Run a new investigation before creating a fix task.`,
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
|
|
105
215
|
// Gate 2: a repository the agent can actually open a PR against.
|
|
106
216
|
const hasConnectedRepository: boolean =
|
|
107
217
|
await SubjectCodeFixRun.hasGitHubAppConnectedRepository(data.projectId);
|
|
@@ -136,6 +246,10 @@ export default class FixFromIncidentTaskTrigger {
|
|
|
136
246
|
incidentId: data.incidentId,
|
|
137
247
|
alertId: data.alertId,
|
|
138
248
|
userId: data.userId,
|
|
249
|
+
taskContext: {
|
|
250
|
+
sourceInvestigationRunId: data.investigationRunId.toString(),
|
|
251
|
+
sourceInvestigationAnalysisMarkdown: analysisMarkdown,
|
|
252
|
+
},
|
|
139
253
|
});
|
|
140
254
|
}
|
|
141
255
|
|
|
@@ -143,9 +257,8 @@ export default class FixFromIncidentTaskTrigger {
|
|
|
143
257
|
* The pure trigger decision for the AUTOMATIC form, separated from IO so
|
|
144
258
|
* it can be tested directly: strict opt-in (default FALSE), a repository
|
|
145
259
|
* the agent can actually open a PR against, and the per-subject dedupe
|
|
146
|
-
* guard. The caller has already established the
|
|
147
|
-
*
|
|
148
|
-
* by AIConfidenceSignal.shouldAutoEnqueueCodeFixTask).
|
|
260
|
+
* guard. The caller has already established and durably persisted the
|
|
261
|
+
* code-fix-recommended investigation prerequisite.
|
|
149
262
|
*/
|
|
150
263
|
public static shouldAutoEnqueueFixTask(
|
|
151
264
|
input: AutoFixTaskGateInput,
|
|
@@ -162,10 +275,21 @@ export default class FixFromIncidentTaskTrigger {
|
|
|
162
275
|
* Strict opt-in — the column defaults to false, so unset/legacy rows
|
|
163
276
|
* never enqueue. Autonomous PR creation must never be default-on.
|
|
164
277
|
*/
|
|
165
|
-
if (input.
|
|
278
|
+
if (Boolean(input.incidentId) === Boolean(input.alertId)) {
|
|
279
|
+
return {
|
|
280
|
+
enqueue: false,
|
|
281
|
+
reason: "exactly one incident or alert subject is required",
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const automaticCodeFixesEnabled: boolean = input.incidentId
|
|
286
|
+
? input.project.enableAutomaticIncidentCodeFixes === true
|
|
287
|
+
: input.project.enableAutomaticAlertCodeFixes === true;
|
|
288
|
+
|
|
289
|
+
if (!automaticCodeFixesEnabled) {
|
|
166
290
|
return {
|
|
167
291
|
enqueue: false,
|
|
168
|
-
reason:
|
|
292
|
+
reason: `project has not opted in to automatic ${input.incidentId ? "incident" : "alert"} code fixes`,
|
|
169
293
|
};
|
|
170
294
|
}
|
|
171
295
|
|
|
@@ -197,31 +321,52 @@ export default class FixFromIncidentTaskTrigger {
|
|
|
197
321
|
|
|
198
322
|
/*
|
|
199
323
|
* The AUTOMATIC form: enqueue a FixFromIncident run for a subject whose
|
|
200
|
-
* investigation
|
|
324
|
+
* latest investigation durably recommends a repository code fix. Exactly one of
|
|
201
325
|
* incidentId/alertId is expected. NEVER throws — every failure is logged
|
|
202
|
-
* and swallowed, because this
|
|
203
|
-
*
|
|
326
|
+
* and swallowed, because this is a best-effort post-recommendation
|
|
327
|
+
* follow-up and must not fail the investigation. No userId: the run stays
|
|
204
328
|
* system-authored.
|
|
205
329
|
*/
|
|
206
330
|
@CaptureSpan()
|
|
207
|
-
public static async
|
|
331
|
+
public static async autoEnqueueFromRecommendedInvestigation(data: {
|
|
208
332
|
projectId: ObjectID;
|
|
333
|
+
investigationRunId: ObjectID;
|
|
334
|
+
analysisMarkdown: string;
|
|
209
335
|
incidentId?: ObjectID | undefined;
|
|
210
336
|
alertId?: ObjectID | undefined;
|
|
211
337
|
}): Promise<void> {
|
|
212
338
|
const { projectId } = data;
|
|
213
339
|
|
|
214
340
|
try {
|
|
215
|
-
if (
|
|
341
|
+
if (Boolean(data.incidentId) === Boolean(data.alertId)) {
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
const taskContext: CodeFixTaskContext = {
|
|
346
|
+
sourceInvestigationRunId: data.investigationRunId?.toString(),
|
|
347
|
+
sourceInvestigationAnalysisMarkdown: data.analysisMarkdown,
|
|
348
|
+
};
|
|
349
|
+
const investigationSnapshot: InvestigationCodeFixTaskSnapshot | null =
|
|
350
|
+
getInvestigationCodeFixTaskSnapshot(taskContext);
|
|
351
|
+
|
|
352
|
+
if (!investigationSnapshot) {
|
|
353
|
+
logger.error(
|
|
354
|
+
`AI: not auto-enqueueing fix task for project ${projectId.toString()} — the recommended investigation has no complete stored analysis snapshot.`,
|
|
355
|
+
);
|
|
216
356
|
return;
|
|
217
357
|
}
|
|
218
358
|
|
|
219
359
|
const project: Project | null = await ProjectService.findOneById({
|
|
220
360
|
id: projectId,
|
|
221
|
-
select:
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
361
|
+
select: data.incidentId
|
|
362
|
+
? {
|
|
363
|
+
enableAi: true,
|
|
364
|
+
enableAutomaticIncidentCodeFixes: true,
|
|
365
|
+
}
|
|
366
|
+
: {
|
|
367
|
+
enableAi: true,
|
|
368
|
+
enableAutomaticAlertCodeFixes: true,
|
|
369
|
+
},
|
|
225
370
|
props: { isRoot: true },
|
|
226
371
|
});
|
|
227
372
|
|
|
@@ -232,6 +377,8 @@ export default class FixFromIncidentTaskTrigger {
|
|
|
232
377
|
const optInDecision: AutoFixTaskGateDecision =
|
|
233
378
|
this.shouldAutoEnqueueFixTask({
|
|
234
379
|
project,
|
|
380
|
+
incidentId: data.incidentId,
|
|
381
|
+
alertId: data.alertId,
|
|
235
382
|
hasConnectedRepository: true,
|
|
236
383
|
existingRun: null,
|
|
237
384
|
});
|
|
@@ -243,17 +390,73 @@ export default class FixFromIncidentTaskTrigger {
|
|
|
243
390
|
return;
|
|
244
391
|
}
|
|
245
392
|
|
|
393
|
+
/*
|
|
394
|
+
* Re-read the authoritative latest source after the engine has durably
|
|
395
|
+
* settled it. This prevents an older overlapping investigation from
|
|
396
|
+
* auto-authorizing a task after a newer run became authoritative, and
|
|
397
|
+
* guarantees a task is never claimable while its source is Pending.
|
|
398
|
+
*/
|
|
399
|
+
const latestInvestigation: AIRun | null = await AIRunService.findOneBy({
|
|
400
|
+
query: {
|
|
401
|
+
projectId,
|
|
402
|
+
runType: AIRunType.Investigation,
|
|
403
|
+
...(data.incidentId
|
|
404
|
+
? { triggeredByIncidentId: data.incidentId }
|
|
405
|
+
: { triggeredByAlertId: data.alertId! }),
|
|
406
|
+
},
|
|
407
|
+
select: {
|
|
408
|
+
_id: true,
|
|
409
|
+
status: true,
|
|
410
|
+
codeFixRecommendation: true,
|
|
411
|
+
taskContext: true,
|
|
412
|
+
},
|
|
413
|
+
sort: { createdAt: SortOrder.Descending },
|
|
414
|
+
props: { isRoot: true },
|
|
415
|
+
});
|
|
416
|
+
const persistedSnapshot: InvestigationCodeFixTaskSnapshot | null =
|
|
417
|
+
getInvestigationCodeFixTaskSnapshot(latestInvestigation?.taskContext);
|
|
418
|
+
|
|
419
|
+
if (
|
|
420
|
+
!latestInvestigation?.id ||
|
|
421
|
+
latestInvestigation.id.toString() !==
|
|
422
|
+
data.investigationRunId.toString() ||
|
|
423
|
+
latestInvestigation.status !== AIRunStatus.Completed ||
|
|
424
|
+
latestInvestigation.codeFixRecommendation !==
|
|
425
|
+
AIRunCodeFixRecommendation.Recommended ||
|
|
426
|
+
!persistedSnapshot ||
|
|
427
|
+
persistedSnapshot.investigationRunId !==
|
|
428
|
+
data.investigationRunId.toString() ||
|
|
429
|
+
persistedSnapshot.investigationAnalysisMarkdown !==
|
|
430
|
+
investigationSnapshot.investigationAnalysisMarkdown
|
|
431
|
+
) {
|
|
432
|
+
logger.debug(
|
|
433
|
+
`AI: not auto-enqueueing fix task for project ${projectId.toString()} — the source is no longer the latest durably Recommended investigation.`,
|
|
434
|
+
);
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
|
|
246
438
|
/*
|
|
247
439
|
* G11 guardrail: the per-project daily fix-run budget. For this
|
|
248
440
|
* AUTOMATIC trigger, over-budget is a logged skip — never an error
|
|
249
441
|
* thrown into the investigation.
|
|
250
442
|
*/
|
|
251
|
-
const budget: FixRunBudgetDecision =
|
|
252
|
-
|
|
443
|
+
const budget: FixRunBudgetDecision = await FixRunBudget.getBudgetStatus(
|
|
444
|
+
projectId,
|
|
445
|
+
{
|
|
446
|
+
incidentId: data.incidentId,
|
|
447
|
+
alertId: data.alertId,
|
|
448
|
+
},
|
|
449
|
+
);
|
|
253
450
|
|
|
254
451
|
if (!budget.allowed) {
|
|
255
452
|
logger.debug(
|
|
256
|
-
`AI: not auto-enqueueing fix task for project ${projectId.toString()} — ${FixRunBudget.describeRejection(
|
|
453
|
+
`AI: not auto-enqueueing fix task for project ${projectId.toString()} — ${FixRunBudget.describeRejection(
|
|
454
|
+
budget,
|
|
455
|
+
{
|
|
456
|
+
incidentId: data.incidentId,
|
|
457
|
+
alertId: data.alertId,
|
|
458
|
+
},
|
|
459
|
+
)}`,
|
|
257
460
|
);
|
|
258
461
|
return;
|
|
259
462
|
}
|
|
@@ -270,6 +473,8 @@ export default class FixFromIncidentTaskTrigger {
|
|
|
270
473
|
|
|
271
474
|
const decision: AutoFixTaskGateDecision = this.shouldAutoEnqueueFixTask({
|
|
272
475
|
project,
|
|
476
|
+
incidentId: data.incidentId,
|
|
477
|
+
alertId: data.alertId,
|
|
273
478
|
hasConnectedRepository,
|
|
274
479
|
existingRun,
|
|
275
480
|
});
|
|
@@ -287,6 +492,10 @@ export default class FixFromIncidentTaskTrigger {
|
|
|
287
492
|
taskType: CodeFixTaskType.FixFromIncident,
|
|
288
493
|
incidentId: data.incidentId,
|
|
289
494
|
alertId: data.alertId,
|
|
495
|
+
taskContext: {
|
|
496
|
+
sourceInvestigationRunId: data.investigationRunId.toString(),
|
|
497
|
+
sourceInvestigationAnalysisMarkdown: data.analysisMarkdown,
|
|
498
|
+
},
|
|
290
499
|
});
|
|
291
500
|
|
|
292
501
|
logger.debug(
|
|
@@ -216,6 +216,8 @@ export default class AIIncidentInvestigationRunner {
|
|
|
216
216
|
projectId,
|
|
217
217
|
monitorId: QueryHelper.any(monitorIds),
|
|
218
218
|
runType: AIRunType.Investigation,
|
|
219
|
+
triggeredByIncidentId: QueryHelper.notNull(),
|
|
220
|
+
triggeredByAlertId: QueryHelper.isNull(),
|
|
219
221
|
createdAt: QueryHelper.greaterThan(windowStart),
|
|
220
222
|
},
|
|
221
223
|
props: { isRoot: true },
|
|
@@ -349,7 +351,9 @@ export default class AIIncidentInvestigationRunner {
|
|
|
349
351
|
request: {
|
|
350
352
|
// Persisted LlmLog label — owned by AIService (G4 budget list).
|
|
351
353
|
feature: AI_INCIDENT_INVESTIGATION_FEATURE,
|
|
354
|
+
incidentId,
|
|
352
355
|
contextSummary,
|
|
356
|
+
persistCodeFixRecommendation: true,
|
|
353
357
|
postAnalysis: async (postData: {
|
|
354
358
|
analysisMarkdown: string;
|
|
355
359
|
confidence: ConfidenceSignal;
|
|
@@ -358,6 +362,7 @@ export default class AIIncidentInvestigationRunner {
|
|
|
358
362
|
await IncidentFeedService.createIncidentFeedItem({
|
|
359
363
|
incidentId,
|
|
360
364
|
projectId,
|
|
365
|
+
aiRunId,
|
|
361
366
|
incidentFeedEventType: IncidentFeedEventType.RootCause,
|
|
362
367
|
displayColor: Blue500,
|
|
363
368
|
feedInfoInMarkdown: postData.analysisMarkdown,
|
|
@@ -421,7 +426,7 @@ export default class AIIncidentInvestigationRunner {
|
|
|
421
426
|
|
|
422
427
|
/*
|
|
423
428
|
* Inconclusive means the telemetry was insufficient — for
|
|
424
|
-
* opted-in projects (
|
|
429
|
+
* opted-in projects (the incident instrumentation-fix setting,
|
|
425
430
|
* default false), queue an ImproveInstrumentation fix task that
|
|
426
431
|
* opens a PR adding the missing observability. Runs strictly
|
|
427
432
|
* AFTER the analysis is posted, and the trigger never throws, so
|
|
@@ -442,29 +447,25 @@ export default class AIIncidentInvestigationRunner {
|
|
|
442
447
|
},
|
|
443
448
|
);
|
|
444
449
|
}
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
incidentId,
|
|
465
|
-
},
|
|
466
|
-
);
|
|
467
|
-
}
|
|
450
|
+
},
|
|
451
|
+
/*
|
|
452
|
+
* The engine calls this only after it atomically persists Recommended
|
|
453
|
+
* with the exact posted analysis snapshot. That durable decision is
|
|
454
|
+
* the prerequisite for the optional automatic FixFromIncident task;
|
|
455
|
+
* the trigger then applies the incident lane's independent opt-in and
|
|
456
|
+
* remaining repository, budget and dedupe gates.
|
|
457
|
+
*/
|
|
458
|
+
onCodeFixRecommended: async (data: {
|
|
459
|
+
analysisMarkdown: string;
|
|
460
|
+
}): Promise<void> => {
|
|
461
|
+
await FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation(
|
|
462
|
+
{
|
|
463
|
+
projectId,
|
|
464
|
+
investigationRunId: aiRunId,
|
|
465
|
+
analysisMarkdown: data.analysisMarkdown,
|
|
466
|
+
incidentId,
|
|
467
|
+
},
|
|
468
|
+
);
|
|
468
469
|
},
|
|
469
470
|
/*
|
|
470
471
|
* RCA-first ordering: auto-remediation for this incident was
|
|
@@ -15,8 +15,8 @@ import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
|
15
15
|
* confidence signal (ConfidenceSignal.ts), never the analysis prose — the
|
|
16
16
|
* telemetry itself is the bug: the code paths involved were not observable
|
|
17
17
|
* enough to diagnose. For projects that opted in
|
|
18
|
-
* (
|
|
19
|
-
* autonomous PR creation is opt-in only), the inconclusive analysis becomes
|
|
18
|
+
* (the subject lane's incident/alert instrumentation setting, default FALSE
|
|
19
|
+
* — G11 posture: autonomous PR creation is opt-in only), the inconclusive analysis becomes
|
|
20
20
|
* the input to a CodeFix AIRun (codeFixTaskType: ImproveInstrumentation)
|
|
21
21
|
* that the agent worker turns into a pull request adding the missing
|
|
22
22
|
* observability — so the NEXT investigation of a similar signal can reach a
|
|
@@ -28,8 +28,11 @@ import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
30
|
export interface InstrumentationTaskGateInput {
|
|
31
|
-
// The project row with enableAi +
|
|
31
|
+
// The project row with enableAi + the subject lane's opt-in selected.
|
|
32
32
|
project: Project | null;
|
|
33
|
+
// Exactly one subject selects the incident or alert opt-in.
|
|
34
|
+
incidentId?: ObjectID | undefined;
|
|
35
|
+
alertId?: ObjectID | undefined;
|
|
33
36
|
// Whether the project has at least one GitHub-App-connected repository.
|
|
34
37
|
hasConnectedRepository: boolean;
|
|
35
38
|
// A non-terminal ImproveInstrumentation run for the same subject, if any.
|
|
@@ -63,10 +66,21 @@ export default class InstrumentationTaskTrigger {
|
|
|
63
66
|
* Strict opt-in — the column defaults to false, so unset/legacy rows
|
|
64
67
|
* never enqueue. Autonomous PR creation must never be default-on.
|
|
65
68
|
*/
|
|
66
|
-
if (input.
|
|
69
|
+
if (Boolean(input.incidentId) === Boolean(input.alertId)) {
|
|
67
70
|
return {
|
|
68
71
|
enqueue: false,
|
|
69
|
-
reason: "
|
|
72
|
+
reason: "exactly one incident or alert subject is required",
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const instrumentationFixTasksEnabled: boolean = input.incidentId
|
|
77
|
+
? input.project.enableIncidentInstrumentationFixTasks === true
|
|
78
|
+
: input.project.enableAlertInstrumentationFixTasks === true;
|
|
79
|
+
|
|
80
|
+
if (!instrumentationFixTasksEnabled) {
|
|
81
|
+
return {
|
|
82
|
+
enqueue: false,
|
|
83
|
+
reason: `project has not opted in to ${input.incidentId ? "incident" : "alert"} instrumentation fix tasks`,
|
|
70
84
|
};
|
|
71
85
|
}
|
|
72
86
|
|
|
@@ -112,16 +126,21 @@ export default class InstrumentationTaskTrigger {
|
|
|
112
126
|
const { projectId } = data;
|
|
113
127
|
|
|
114
128
|
try {
|
|
115
|
-
if (
|
|
129
|
+
if (Boolean(data.incidentId) === Boolean(data.alertId)) {
|
|
116
130
|
return;
|
|
117
131
|
}
|
|
118
132
|
|
|
119
133
|
const project: Project | null = await ProjectService.findOneById({
|
|
120
134
|
id: projectId,
|
|
121
|
-
select:
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
135
|
+
select: data.incidentId
|
|
136
|
+
? {
|
|
137
|
+
enableAi: true,
|
|
138
|
+
enableIncidentInstrumentationFixTasks: true,
|
|
139
|
+
}
|
|
140
|
+
: {
|
|
141
|
+
enableAi: true,
|
|
142
|
+
enableAlertInstrumentationFixTasks: true,
|
|
143
|
+
},
|
|
125
144
|
props: { isRoot: true },
|
|
126
145
|
});
|
|
127
146
|
|
|
@@ -132,6 +151,8 @@ export default class InstrumentationTaskTrigger {
|
|
|
132
151
|
const optInDecision: InstrumentationTaskGateDecision =
|
|
133
152
|
this.shouldEnqueueInstrumentationTask({
|
|
134
153
|
project,
|
|
154
|
+
incidentId: data.incidentId,
|
|
155
|
+
alertId: data.alertId,
|
|
135
156
|
hasConnectedRepository: true,
|
|
136
157
|
existingRun: null,
|
|
137
158
|
});
|
|
@@ -150,12 +171,23 @@ export default class InstrumentationTaskTrigger {
|
|
|
150
171
|
* throw the same rejection, but that lands in the catch below as an
|
|
151
172
|
* error log; a budget skip is expected behavior, not a failure).
|
|
152
173
|
*/
|
|
153
|
-
const budget: FixRunBudgetDecision =
|
|
154
|
-
|
|
174
|
+
const budget: FixRunBudgetDecision = await FixRunBudget.getBudgetStatus(
|
|
175
|
+
projectId,
|
|
176
|
+
{
|
|
177
|
+
incidentId: data.incidentId,
|
|
178
|
+
alertId: data.alertId,
|
|
179
|
+
},
|
|
180
|
+
);
|
|
155
181
|
|
|
156
182
|
if (!budget.allowed) {
|
|
157
183
|
logger.debug(
|
|
158
|
-
`AI: not enqueueing instrumentation task for project ${projectId.toString()} — ${FixRunBudget.describeRejection(
|
|
184
|
+
`AI: not enqueueing instrumentation task for project ${projectId.toString()} — ${FixRunBudget.describeRejection(
|
|
185
|
+
budget,
|
|
186
|
+
{
|
|
187
|
+
incidentId: data.incidentId,
|
|
188
|
+
alertId: data.alertId,
|
|
189
|
+
},
|
|
190
|
+
)}`,
|
|
159
191
|
);
|
|
160
192
|
return;
|
|
161
193
|
}
|
|
@@ -177,6 +209,8 @@ export default class InstrumentationTaskTrigger {
|
|
|
177
209
|
const decision: InstrumentationTaskGateDecision =
|
|
178
210
|
this.shouldEnqueueInstrumentationTask({
|
|
179
211
|
project,
|
|
212
|
+
incidentId: data.incidentId,
|
|
213
|
+
alertId: data.alertId,
|
|
180
214
|
hasConnectedRepository,
|
|
181
215
|
existingRun,
|
|
182
216
|
});
|