@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
|
@@ -264,6 +264,8 @@ export default class RemediationPlanRunner {
|
|
|
264
264
|
attemptCount,
|
|
265
265
|
request: {
|
|
266
266
|
feature: AI_REMEDIATION_PLANNING_FEATURE,
|
|
267
|
+
incidentId: suggestion!.incidentId,
|
|
268
|
+
alertId: suggestion!.alertId,
|
|
267
269
|
contextSummary,
|
|
268
270
|
postAnalysis: async (postData: {
|
|
269
271
|
analysisMarkdown: string;
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
AIRunEventResultSummary,
|
|
7
7
|
} from "../../../../Types/AI/AIChatTypes";
|
|
8
8
|
import AIRunStatus from "../../../../Types/AI/AIRunStatus";
|
|
9
|
+
import AIRunCodeFixRecommendation from "../../../../Types/AI/AIRunCodeFixRecommendation";
|
|
9
10
|
import AIRunEventType from "../../../../Types/AI/AIRunEventType";
|
|
10
11
|
import AIRunEvent from "../../../../Models/DatabaseModels/AIRunEvent";
|
|
11
12
|
import Project from "../../../../Models/DatabaseModels/Project";
|
|
@@ -49,6 +50,12 @@ const MAX_TOOL_CALLS: number = 12;
|
|
|
49
50
|
const MAX_WALL_CLOCK_MS: number = 150 * 1000;
|
|
50
51
|
const MAX_OUTPUT_TOKENS: number = 2000;
|
|
51
52
|
|
|
53
|
+
/*
|
|
54
|
+
* Conditional recommendation persistence is idempotent, so transient
|
|
55
|
+
* database failures can be retried without risking a second decision.
|
|
56
|
+
*/
|
|
57
|
+
const CODE_FIX_RECOMMENDATION_PERSIST_ATTEMPTS: number = 3;
|
|
58
|
+
|
|
52
59
|
/*
|
|
53
60
|
* Failures a retry cannot fix within the run's usefulness window: missing/
|
|
54
61
|
* broken provider configuration and budget exhaustion (both messages minted
|
|
@@ -89,6 +96,12 @@ export type AISubjectType = "Incident" | "Alert";
|
|
|
89
96
|
export interface InvestigationRequest {
|
|
90
97
|
// Label recorded on LlmLog, e.g. "AI Incident Investigation".
|
|
91
98
|
feature: string;
|
|
99
|
+
/*
|
|
100
|
+
* The subject lane used for per-incident / per-alert autonomous budgets.
|
|
101
|
+
* Insight triage is intentionally subjectless and leaves both unset.
|
|
102
|
+
*/
|
|
103
|
+
incidentId?: ObjectID | undefined;
|
|
104
|
+
alertId?: ObjectID | undefined;
|
|
92
105
|
// A compact markdown summary of the subject that seeds the investigation.
|
|
93
106
|
contextSummary: string;
|
|
94
107
|
/*
|
|
@@ -105,6 +118,21 @@ export interface InvestigationRequest {
|
|
|
105
118
|
confidence: ConfidenceSignal;
|
|
106
119
|
result: ObservabilityAssistantResult;
|
|
107
120
|
}) => Promise<void>;
|
|
121
|
+
/*
|
|
122
|
+
* Incident and alert RCA runs opt into a persisted code-fix decision.
|
|
123
|
+
* Other users of this engine (insight triage and remediation) omit it and
|
|
124
|
+
* remain NotRecommended throughout their lifecycle.
|
|
125
|
+
*/
|
|
126
|
+
persistCodeFixRecommendation?: boolean | undefined;
|
|
127
|
+
/*
|
|
128
|
+
* Runs only after a Recommended decision and its exact analysis snapshot
|
|
129
|
+
* have been durably committed. Incident/alert runners use this for the
|
|
130
|
+
* optional automatic FixFromIncident lane; persistence failure means the
|
|
131
|
+
* callback is never invoked.
|
|
132
|
+
*/
|
|
133
|
+
onCodeFixRecommended?:
|
|
134
|
+
| ((data: { analysisMarkdown: string }) => Promise<void>)
|
|
135
|
+
| undefined;
|
|
108
136
|
/*
|
|
109
137
|
* Optional: called exactly once when THIS attempt settles the run into a
|
|
110
138
|
* terminal state — Completed (with or without an analysis, and even when
|
|
@@ -264,7 +292,7 @@ export default class AIInvestigationEngine {
|
|
|
264
292
|
* EVERY step — a slow self-hosted LLM call can approach the sweeper's
|
|
265
293
|
* timeout, so the heartbeat must be as frequent as we can make it.
|
|
266
294
|
*/
|
|
267
|
-
await this.touchHeartbeat(aiRunId);
|
|
295
|
+
await this.touchHeartbeat(aiRunId, data.attemptCount);
|
|
268
296
|
};
|
|
269
297
|
|
|
270
298
|
/*
|
|
@@ -279,6 +307,9 @@ export default class AIInvestigationEngine {
|
|
|
279
307
|
const result: ObservabilityAssistantResult =
|
|
280
308
|
await ObservabilityAssistant.answerQuestion({
|
|
281
309
|
projectId,
|
|
310
|
+
incidentId: request.incidentId,
|
|
311
|
+
alertId: request.alertId,
|
|
312
|
+
aiRunId,
|
|
282
313
|
// System run — full read access to the project's telemetry.
|
|
283
314
|
props: { isRoot: true },
|
|
284
315
|
feature: request.feature,
|
|
@@ -307,8 +338,14 @@ export default class AIInvestigationEngine {
|
|
|
307
338
|
{
|
|
308
339
|
aiRunId,
|
|
309
340
|
fromStatus: AIRunStatus.Running,
|
|
341
|
+
expectedAttemptCount: data.attemptCount,
|
|
310
342
|
set: {
|
|
311
343
|
status: AIRunStatus.Completed,
|
|
344
|
+
...(request.persistCodeFixRecommendation === true
|
|
345
|
+
? {
|
|
346
|
+
codeFixRecommendation: AIRunCodeFixRecommendation.Pending,
|
|
347
|
+
}
|
|
348
|
+
: {}),
|
|
312
349
|
completedAt: OneUptimeDate.getCurrentDate(),
|
|
313
350
|
lastHeartbeatAt: OneUptimeDate.getCurrentDate(),
|
|
314
351
|
llmCallCount: result.llmCallCount,
|
|
@@ -327,13 +364,6 @@ export default class AIInvestigationEngine {
|
|
|
327
364
|
|
|
328
365
|
settledAsCompleted = true;
|
|
329
366
|
|
|
330
|
-
await this.emitEvent({
|
|
331
|
-
projectId,
|
|
332
|
-
aiRunId,
|
|
333
|
-
sequence: sequence++,
|
|
334
|
-
eventType: AIRunEventType.RunCompleted,
|
|
335
|
-
});
|
|
336
|
-
|
|
337
367
|
const analysis: string = (result.contentInMarkdown || "").trim();
|
|
338
368
|
|
|
339
369
|
if (!analysis) {
|
|
@@ -341,10 +371,24 @@ export default class AIInvestigationEngine {
|
|
|
341
371
|
`AI: investigation (run ${aiRunId.toString()}) produced no analysis; nothing posted.`,
|
|
342
372
|
);
|
|
343
373
|
|
|
374
|
+
if (request.persistCodeFixRecommendation === true) {
|
|
375
|
+
await this.finalizeCodeFixRecommendation({
|
|
376
|
+
aiRunId,
|
|
377
|
+
recommendation: AIRunCodeFixRecommendation.NotRecommended,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
|
|
344
381
|
/*
|
|
345
382
|
* No analysis is still a settled run — the subject must not lose
|
|
346
383
|
* its deferred remediation because the model had nothing to say.
|
|
347
384
|
*/
|
|
385
|
+
await this.emitEvent({
|
|
386
|
+
projectId,
|
|
387
|
+
aiRunId,
|
|
388
|
+
sequence: sequence++,
|
|
389
|
+
eventType: AIRunEventType.RunCompleted,
|
|
390
|
+
});
|
|
391
|
+
|
|
348
392
|
await this.invokeOnSettled(request, aiRunId);
|
|
349
393
|
return;
|
|
350
394
|
}
|
|
@@ -367,18 +411,78 @@ export default class AIInvestigationEngine {
|
|
|
367
411
|
await AIConfidenceSignal.computeConfidenceSignal({
|
|
368
412
|
projectId,
|
|
369
413
|
aiRunId,
|
|
414
|
+
incidentId: request.incidentId,
|
|
415
|
+
alertId: request.alertId,
|
|
370
416
|
analysisMarkdown: analysis,
|
|
371
417
|
evidence: AIConfidenceSignal.evidenceFromCitations(
|
|
372
418
|
result.citations || [],
|
|
373
419
|
),
|
|
374
420
|
});
|
|
375
421
|
|
|
422
|
+
/*
|
|
423
|
+
* Build the posted form exactly once. The same immutable string is
|
|
424
|
+
* handed to the subject feed, persisted with the recommendation, and
|
|
425
|
+
* supplied to the automatic fix trigger by the subject runner.
|
|
426
|
+
*/
|
|
427
|
+
const investigationAnalysisMarkdown: string = this.buildBrandedMarkdown(
|
|
428
|
+
result,
|
|
429
|
+
analysis,
|
|
430
|
+
);
|
|
431
|
+
|
|
376
432
|
await request.postAnalysis({
|
|
377
|
-
analysisMarkdown:
|
|
433
|
+
analysisMarkdown: investigationAnalysisMarkdown,
|
|
378
434
|
confidence,
|
|
379
435
|
result,
|
|
380
436
|
});
|
|
381
437
|
|
|
438
|
+
/*
|
|
439
|
+
* Only expose the manual Fix PR action after the cited analysis has
|
|
440
|
+
* actually been posted. The same structured, fail-closed decision also
|
|
441
|
+
* gates the automatic FixFromIncident lane in the subject runner.
|
|
442
|
+
*/
|
|
443
|
+
if (request.persistCodeFixRecommendation === true) {
|
|
444
|
+
if (AIConfidenceSignal.isCodeFixRecommended(confidence)) {
|
|
445
|
+
const recommendationPersisted: boolean =
|
|
446
|
+
await this.finalizeCodeFixRecommendation({
|
|
447
|
+
aiRunId,
|
|
448
|
+
recommendation: AIRunCodeFixRecommendation.Recommended,
|
|
449
|
+
investigationAnalysisMarkdown,
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
if (recommendationPersisted && request.onCodeFixRecommended) {
|
|
453
|
+
try {
|
|
454
|
+
await request.onCodeFixRecommended({
|
|
455
|
+
analysisMarkdown: investigationAnalysisMarkdown,
|
|
456
|
+
});
|
|
457
|
+
} catch (error) {
|
|
458
|
+
logger.error(
|
|
459
|
+
`AI: post-recommendation follow-up failed for run ${aiRunId.toString()}: ${error}`,
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
} else {
|
|
464
|
+
await this.finalizeCodeFixRecommendation({
|
|
465
|
+
aiRunId,
|
|
466
|
+
recommendation: AIRunCodeFixRecommendation.NotRecommended,
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
/*
|
|
472
|
+
* RunCompleted is the durable publication-settlement signal, not just
|
|
473
|
+
* the earlier status CAS. The dashboard keeps polling a Completed run
|
|
474
|
+
* until either the matching report exists or this final event proves
|
|
475
|
+
* that finalization ended without one. Recommendation settlement and
|
|
476
|
+
* its post-persistence callback have finished before this event. If
|
|
477
|
+
* confidence/postAnalysis throws, the catch path emits RunFailed.
|
|
478
|
+
*/
|
|
479
|
+
await this.emitEvent({
|
|
480
|
+
projectId,
|
|
481
|
+
aiRunId,
|
|
482
|
+
sequence: sequence++,
|
|
483
|
+
eventType: AIRunEventType.RunCompleted,
|
|
484
|
+
});
|
|
485
|
+
|
|
382
486
|
logger.debug(
|
|
383
487
|
`AI: investigation complete (run ${aiRunId.toString()}, confident=${confidence.confident} via ${confidence.source}, ${result.llmCallCount} LLM calls, ${result.toolCallCount} tools, ${result.totalTokens} tokens).`,
|
|
384
488
|
);
|
|
@@ -389,12 +493,17 @@ export default class AIInvestigationEngine {
|
|
|
389
493
|
const message: string =
|
|
390
494
|
error instanceof Error ? error.message : String(error);
|
|
391
495
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
496
|
+
/*
|
|
497
|
+
* A failure after the Running -> Completed transition (classification
|
|
498
|
+
* or posting the RCA) must not strand the panel in Pending forever or
|
|
499
|
+
* offer a PR without a posted analysis. Fail closed.
|
|
500
|
+
*/
|
|
501
|
+
if (settledAsCompleted && request.persistCodeFixRecommendation === true) {
|
|
502
|
+
await this.finalizeCodeFixRecommendation({
|
|
503
|
+
aiRunId,
|
|
504
|
+
recommendation: AIRunCodeFixRecommendation.NotRecommended,
|
|
505
|
+
});
|
|
506
|
+
}
|
|
398
507
|
|
|
399
508
|
/*
|
|
400
509
|
* Hand the failure to the queue's retry policy: transient errors
|
|
@@ -423,7 +532,22 @@ export default class AIInvestigationEngine {
|
|
|
423
532
|
* settled (the retry owns it), and "noop" without a won Completed
|
|
424
533
|
* means another actor moved the run and owns settlement.
|
|
425
534
|
*/
|
|
426
|
-
|
|
535
|
+
const ownsTerminalOutcome: boolean =
|
|
536
|
+
settledAsCompleted || outcome === "finalized";
|
|
537
|
+
|
|
538
|
+
if (ownsTerminalOutcome) {
|
|
539
|
+
/*
|
|
540
|
+
* Emit terminal failure only after ownership is established. A stale
|
|
541
|
+
* or requeued attempt can finish after the retry's RunStarted; letting
|
|
542
|
+
* it append RunFailed would falsely look like the retry settled.
|
|
543
|
+
*/
|
|
544
|
+
await this.emitEvent({
|
|
545
|
+
projectId,
|
|
546
|
+
aiRunId,
|
|
547
|
+
sequence: sequence++,
|
|
548
|
+
eventType: AIRunEventType.RunFailed,
|
|
549
|
+
});
|
|
550
|
+
|
|
427
551
|
await this.invokeOnSettled(request, aiRunId);
|
|
428
552
|
}
|
|
429
553
|
|
|
@@ -455,6 +579,78 @@ export default class AIInvestigationEngine {
|
|
|
455
579
|
}
|
|
456
580
|
}
|
|
457
581
|
|
|
582
|
+
/*
|
|
583
|
+
* Resolve the recommendation exactly once. Pending is written by the
|
|
584
|
+
* winning Completed CAS, so this conditional update cannot race a stale
|
|
585
|
+
* attempt or overwrite a decision another actor already settled. A
|
|
586
|
+
* Recommended decision carries the exact analysis snapshot it classified;
|
|
587
|
+
* manual and automatic fix tasks never have to re-read mutable feed state.
|
|
588
|
+
*
|
|
589
|
+
* Best-effort like the event trail: transient database errors are retried,
|
|
590
|
+
* but recommendation persistence never turns a completed investigation
|
|
591
|
+
* into a failed run. A zero-row update is safe (the row was already settled
|
|
592
|
+
* or removed) and is logged rather than retried.
|
|
593
|
+
*/
|
|
594
|
+
private static async finalizeCodeFixRecommendation(
|
|
595
|
+
data:
|
|
596
|
+
| {
|
|
597
|
+
aiRunId: ObjectID;
|
|
598
|
+
recommendation: AIRunCodeFixRecommendation.Recommended;
|
|
599
|
+
investigationAnalysisMarkdown: string;
|
|
600
|
+
}
|
|
601
|
+
| {
|
|
602
|
+
aiRunId: ObjectID;
|
|
603
|
+
recommendation: AIRunCodeFixRecommendation.NotRecommended;
|
|
604
|
+
},
|
|
605
|
+
): Promise<boolean> {
|
|
606
|
+
for (
|
|
607
|
+
let attempt: number = 1;
|
|
608
|
+
attempt <= CODE_FIX_RECOMMENDATION_PERSIST_ATTEMPTS;
|
|
609
|
+
attempt++
|
|
610
|
+
) {
|
|
611
|
+
try {
|
|
612
|
+
const updatedCount: number =
|
|
613
|
+
await AIRunService.finalizeInvestigationCodeFixRecommendation(
|
|
614
|
+
data.recommendation === AIRunCodeFixRecommendation.Recommended
|
|
615
|
+
? {
|
|
616
|
+
aiRunId: data.aiRunId,
|
|
617
|
+
recommendation: data.recommendation,
|
|
618
|
+
taskContext: {
|
|
619
|
+
sourceInvestigationRunId: data.aiRunId.toString(),
|
|
620
|
+
sourceInvestigationAnalysisMarkdown:
|
|
621
|
+
data.investigationAnalysisMarkdown,
|
|
622
|
+
},
|
|
623
|
+
}
|
|
624
|
+
: {
|
|
625
|
+
aiRunId: data.aiRunId,
|
|
626
|
+
recommendation: data.recommendation,
|
|
627
|
+
},
|
|
628
|
+
);
|
|
629
|
+
|
|
630
|
+
if (updatedCount === 0) {
|
|
631
|
+
logger.warn(
|
|
632
|
+
`AI: code-fix recommendation for run ${data.aiRunId.toString()} was no longer Pending; leaving the existing decision unchanged.`,
|
|
633
|
+
);
|
|
634
|
+
return false;
|
|
635
|
+
}
|
|
636
|
+
return true;
|
|
637
|
+
} catch (error) {
|
|
638
|
+
if (attempt === CODE_FIX_RECOMMENDATION_PERSIST_ATTEMPTS) {
|
|
639
|
+
logger.error(
|
|
640
|
+
`AI: failed to persist code-fix recommendation for run ${data.aiRunId.toString()} after ${attempt} attempts: ${error}`,
|
|
641
|
+
);
|
|
642
|
+
return false;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
logger.warn(
|
|
646
|
+
`AI: failed to persist code-fix recommendation for run ${data.aiRunId.toString()} (attempt ${attempt}/${CODE_FIX_RECOMMENDATION_PERSIST_ATTEMPTS}); retrying: ${error}`,
|
|
647
|
+
);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
return false;
|
|
652
|
+
}
|
|
653
|
+
|
|
458
654
|
// Wrap the agent's analysis with AI branding + an evidence list.
|
|
459
655
|
private static buildBrandedMarkdown(
|
|
460
656
|
result: ObservabilityAssistantResult,
|
|
@@ -481,14 +677,19 @@ export default class AIInvestigationEngine {
|
|
|
481
677
|
}
|
|
482
678
|
|
|
483
679
|
// Refresh lastHeartbeatAt so a long-running investigation isn't swept as stale.
|
|
484
|
-
private static async touchHeartbeat(
|
|
680
|
+
private static async touchHeartbeat(
|
|
681
|
+
aiRunId: ObjectID,
|
|
682
|
+
attemptCount: number,
|
|
683
|
+
): Promise<void> {
|
|
485
684
|
try {
|
|
486
|
-
await AIRunService.
|
|
487
|
-
|
|
488
|
-
|
|
685
|
+
await AIRunService.attemptStatusTransition({
|
|
686
|
+
aiRunId,
|
|
687
|
+
fromStatus: AIRunStatus.Running,
|
|
688
|
+
expectedAttemptCount: attemptCount,
|
|
689
|
+
set: {
|
|
690
|
+
status: AIRunStatus.Running,
|
|
489
691
|
lastHeartbeatAt: OneUptimeDate.getCurrentDate(),
|
|
490
|
-
}
|
|
491
|
-
props: { isRoot: true },
|
|
692
|
+
},
|
|
492
693
|
});
|
|
493
694
|
} catch (error) {
|
|
494
695
|
logger.error(`AI: heartbeat update failed: ${error}`);
|
|
@@ -169,7 +169,9 @@ export default class AIAlertInvestigationRunner {
|
|
|
169
169
|
request: {
|
|
170
170
|
// Persisted LlmLog label — owned by AIService (G4 budget list).
|
|
171
171
|
feature: AI_ALERT_INVESTIGATION_FEATURE,
|
|
172
|
+
alertId,
|
|
172
173
|
contextSummary,
|
|
174
|
+
persistCodeFixRecommendation: true,
|
|
173
175
|
postAnalysis: async (postData: {
|
|
174
176
|
analysisMarkdown: string;
|
|
175
177
|
confidence: ConfidenceSignal;
|
|
@@ -178,6 +180,7 @@ export default class AIAlertInvestigationRunner {
|
|
|
178
180
|
await AlertFeedService.createAlertFeedItem({
|
|
179
181
|
alertId,
|
|
180
182
|
projectId,
|
|
183
|
+
aiRunId,
|
|
181
184
|
alertFeedEventType: AlertFeedEventType.RootCause,
|
|
182
185
|
displayColor: Blue500,
|
|
183
186
|
feedInfoInMarkdown: postData.analysisMarkdown,
|
|
@@ -197,7 +200,7 @@ export default class AIAlertInvestigationRunner {
|
|
|
197
200
|
|
|
198
201
|
/*
|
|
199
202
|
* Inconclusive means the telemetry was insufficient — for
|
|
200
|
-
* opted-in projects (
|
|
203
|
+
* opted-in projects (the alert instrumentation-fix setting,
|
|
201
204
|
* default false), queue an ImproveInstrumentation fix task that
|
|
202
205
|
* opens a PR adding the missing observability. Runs strictly
|
|
203
206
|
* AFTER the analysis is posted, and the trigger never throws, so
|
|
@@ -218,29 +221,25 @@ export default class AIAlertInvestigationRunner {
|
|
|
218
221
|
},
|
|
219
222
|
);
|
|
220
223
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
alertId,
|
|
241
|
-
},
|
|
242
|
-
);
|
|
243
|
-
}
|
|
224
|
+
},
|
|
225
|
+
/*
|
|
226
|
+
* The engine calls this only after it atomically persists Recommended
|
|
227
|
+
* with the exact posted analysis snapshot. That durable decision is
|
|
228
|
+
* the prerequisite for the optional automatic FixFromIncident task;
|
|
229
|
+
* the trigger then applies the alert lane's independent opt-in and
|
|
230
|
+
* remaining repository, budget and dedupe gates.
|
|
231
|
+
*/
|
|
232
|
+
onCodeFixRecommended: async (data: {
|
|
233
|
+
analysisMarkdown: string;
|
|
234
|
+
}): Promise<void> => {
|
|
235
|
+
await FixFromIncidentTaskTrigger.autoEnqueueFromRecommendedInvestigation(
|
|
236
|
+
{
|
|
237
|
+
projectId,
|
|
238
|
+
investigationRunId: aiRunId,
|
|
239
|
+
analysisMarkdown: data.analysisMarkdown,
|
|
240
|
+
alertId,
|
|
241
|
+
},
|
|
242
|
+
);
|
|
244
243
|
},
|
|
245
244
|
/*
|
|
246
245
|
* RCA-first ordering: auto-remediation for this alert was deferred
|
|
@@ -338,6 +337,8 @@ export default class AIAlertInvestigationRunner {
|
|
|
338
337
|
projectId,
|
|
339
338
|
monitorId: alert.monitorId,
|
|
340
339
|
runType: AIRunType.Investigation,
|
|
340
|
+
triggeredByIncidentId: QueryHelper.isNull(),
|
|
341
|
+
triggeredByAlertId: QueryHelper.notNull(),
|
|
341
342
|
createdAt: QueryHelper.greaterThan(windowStart),
|
|
342
343
|
},
|
|
343
344
|
props: { isRoot: true },
|