@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
|
@@ -1183,6 +1183,7 @@ export default class StatusPage extends BaseModel {
|
|
|
1183
1183
|
description:
|
|
1184
1184
|
"Password required to unlock a private status page. This value is stored as a secure hash.",
|
|
1185
1185
|
hashed: true,
|
|
1186
|
+
hashSaltColumn: "masterPasswordSalt",
|
|
1186
1187
|
type: TableColumnType.HashedString,
|
|
1187
1188
|
placeholder: "Enter a new master password",
|
|
1188
1189
|
})
|
|
@@ -1194,6 +1195,33 @@ export default class StatusPage extends BaseModel {
|
|
|
1194
1195
|
})
|
|
1195
1196
|
public masterPassword?: HashedString = undefined;
|
|
1196
1197
|
|
|
1198
|
+
/*
|
|
1199
|
+
* Per-status-page salt mixed into `masterPassword`. Written by the database
|
|
1200
|
+
* write path on every master-password write and never exposed to API
|
|
1201
|
+
* callers. Nullable so existing unsalted hashes can be verified and
|
|
1202
|
+
* upgraded after a successful unlock.
|
|
1203
|
+
*/
|
|
1204
|
+
@ColumnAccessControl({
|
|
1205
|
+
create: [],
|
|
1206
|
+
read: [],
|
|
1207
|
+
update: [],
|
|
1208
|
+
})
|
|
1209
|
+
@TableColumn({
|
|
1210
|
+
title: "Master Password Salt",
|
|
1211
|
+
description:
|
|
1212
|
+
"Per-status-page random salt mixed into this status page's master password hash.",
|
|
1213
|
+
computed: true,
|
|
1214
|
+
type: TableColumnType.ShortText,
|
|
1215
|
+
hideColumnInDocumentation: true,
|
|
1216
|
+
})
|
|
1217
|
+
@Column({
|
|
1218
|
+
type: ColumnType.ShortText,
|
|
1219
|
+
length: ColumnLength.ShortText,
|
|
1220
|
+
unique: false,
|
|
1221
|
+
nullable: true,
|
|
1222
|
+
})
|
|
1223
|
+
public masterPasswordSalt?: string = undefined;
|
|
1224
|
+
|
|
1197
1225
|
@ColumnAccessControl({
|
|
1198
1226
|
create: [
|
|
1199
1227
|
Permission.ProjectOwner,
|
|
@@ -7,8 +7,7 @@ import AIRunService from "../Services/AIRunService";
|
|
|
7
7
|
import AIRunEventService from "../Services/AIRunEventService";
|
|
8
8
|
import IncidentService from "../Services/IncidentService";
|
|
9
9
|
import AlertService from "../Services/AlertService";
|
|
10
|
-
import
|
|
11
|
-
import AlertFeedService from "../Services/AlertFeedService";
|
|
10
|
+
import PostedRootCause from "../Utils/AI/SRE/PostedRootCause";
|
|
12
11
|
import Express, {
|
|
13
12
|
ExpressRequest,
|
|
14
13
|
ExpressResponse,
|
|
@@ -27,12 +26,6 @@ import AIAgentTaskPullRequest from "../../Models/DatabaseModels/AIAgentTaskPullR
|
|
|
27
26
|
import AIRun from "../../Models/DatabaseModels/AIRun";
|
|
28
27
|
import Incident from "../../Models/DatabaseModels/Incident";
|
|
29
28
|
import Alert from "../../Models/DatabaseModels/Alert";
|
|
30
|
-
import IncidentFeed, {
|
|
31
|
-
IncidentFeedEventType,
|
|
32
|
-
} from "../../Models/DatabaseModels/IncidentFeed";
|
|
33
|
-
import AlertFeed, {
|
|
34
|
-
AlertFeedEventType,
|
|
35
|
-
} from "../../Models/DatabaseModels/AlertFeed";
|
|
36
29
|
import AIRunEventType from "../../Types/AI/AIRunEventType";
|
|
37
30
|
import AIRunType from "../../Types/AI/AIRunType";
|
|
38
31
|
import FixVerificationStatus from "../../Types/AI/FixVerificationStatus";
|
|
@@ -41,7 +34,9 @@ import CodeFixTaskType, {
|
|
|
41
34
|
CodeFixTaskTypeHelper,
|
|
42
35
|
} from "../../Types/AI/CodeFixTaskType";
|
|
43
36
|
import CodeFixTaskContext, {
|
|
37
|
+
getInvestigationCodeFixTaskSnapshot,
|
|
44
38
|
ImplicatedSpan,
|
|
39
|
+
InvestigationCodeFixTaskSnapshot,
|
|
45
40
|
PerformanceCodeLocation,
|
|
46
41
|
PerformanceFinding,
|
|
47
42
|
} from "../../Types/AI/CodeFixTaskContext";
|
|
@@ -62,7 +57,6 @@ import {
|
|
|
62
57
|
LLMToolCall,
|
|
63
58
|
LLMToolDefinition,
|
|
64
59
|
} from "../Utils/LLM/LLMService";
|
|
65
|
-
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
66
60
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
67
61
|
import { JSONObject } from "../../Types/JSON";
|
|
68
62
|
import ObjectID from "../../Types/ObjectID";
|
|
@@ -496,14 +490,12 @@ export default class AIAgentDataAPI {
|
|
|
496
490
|
* The route name predates the newer recipes and is kept for agent
|
|
497
491
|
* compatibility. Two context kinds are served:
|
|
498
492
|
*
|
|
499
|
-
* - Incident/alert-subject recipes
|
|
500
|
-
*
|
|
501
|
-
*
|
|
502
|
-
*
|
|
503
|
-
*
|
|
504
|
-
*
|
|
505
|
-
* outcomes (quiet mode only mutes the workspace ping), so the feed
|
|
506
|
-
* item IS the investigation run's persisted output.
|
|
493
|
+
* - Incident/alert-subject recipes: subject metadata + the repository
|
|
494
|
+
* resolved without a stack trace. ImproveInstrumentation reads the
|
|
495
|
+
* subject's latest RootCause feed item. FixFromIncident instead reads
|
|
496
|
+
* the immutable investigation snapshot captured in AIRun.taskContext;
|
|
497
|
+
* a later re-investigation must never replace the Recommended analysis
|
|
498
|
+
* that authorized a code-fix task.
|
|
507
499
|
*
|
|
508
500
|
* - Trace-evidence recipes (FixPerformance): the deterministic
|
|
509
501
|
* span-tree findings stored on AIRun.taskContext at trigger time
|
|
@@ -581,6 +573,10 @@ export default class AIAgentDataAPI {
|
|
|
581
573
|
CodeFixTaskTypeHelper.fromDatabaseValue(run.codeFixTaskType);
|
|
582
574
|
const contextKind: CodeFixContextKind =
|
|
583
575
|
CodeFixTaskTypeHelper.getContextKind(taskType);
|
|
576
|
+
const investigationSnapshot: InvestigationCodeFixTaskSnapshot | null =
|
|
577
|
+
taskType === CodeFixTaskType.FixFromIncident
|
|
578
|
+
? getInvestigationCodeFixTaskSnapshot(run.taskContext)
|
|
579
|
+
: null;
|
|
584
580
|
|
|
585
581
|
if (
|
|
586
582
|
run.runType !== AIRunType.CodeFix ||
|
|
@@ -595,6 +591,25 @@ export default class AIAgentDataAPI {
|
|
|
595
591
|
);
|
|
596
592
|
}
|
|
597
593
|
|
|
594
|
+
/*
|
|
595
|
+
* FixFromIncident authorization covered one exact Recommended
|
|
596
|
+
* investigation. Never substitute the subject's current RootCause:
|
|
597
|
+
* a re-investigation may have posted a different, non-code analysis
|
|
598
|
+
* while this task waited in the queue.
|
|
599
|
+
*/
|
|
600
|
+
if (
|
|
601
|
+
taskType === CodeFixTaskType.FixFromIncident &&
|
|
602
|
+
!investigationSnapshot
|
|
603
|
+
) {
|
|
604
|
+
return Response.sendErrorResponse(
|
|
605
|
+
req,
|
|
606
|
+
res,
|
|
607
|
+
new BadDataException(
|
|
608
|
+
"This fix-from-incident task has no complete pinned investigation analysis snapshot — it cannot be executed safely.",
|
|
609
|
+
),
|
|
610
|
+
);
|
|
611
|
+
}
|
|
612
|
+
|
|
598
613
|
/*
|
|
599
614
|
* Service-scoped instrumentation recipes (ImproveLogging /
|
|
600
615
|
* ImproveTracing): the context is just the service — resolve the
|
|
@@ -864,7 +879,8 @@ export default class AIAgentDataAPI {
|
|
|
864
879
|
* fine when the subject has no monitor.
|
|
865
880
|
*/
|
|
866
881
|
let serviceName: string | null = null;
|
|
867
|
-
let analysisMarkdown: string | null =
|
|
882
|
+
let analysisMarkdown: string | null =
|
|
883
|
+
investigationSnapshot?.investigationAnalysisMarkdown || null;
|
|
868
884
|
|
|
869
885
|
if (run.triggeredByIncidentId) {
|
|
870
886
|
const incident: Incident | null = await IncidentService.findOneById(
|
|
@@ -900,24 +916,11 @@ export default class AIAgentDataAPI {
|
|
|
900
916
|
})
|
|
901
917
|
.filter(Boolean)[0] || null;
|
|
902
918
|
|
|
903
|
-
|
|
904
|
-
await
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
},
|
|
909
|
-
select: {
|
|
910
|
-
feedInfoInMarkdown: true,
|
|
911
|
-
},
|
|
912
|
-
sort: {
|
|
913
|
-
createdAt: SortOrder.Descending,
|
|
914
|
-
},
|
|
915
|
-
props: {
|
|
916
|
-
isRoot: true,
|
|
917
|
-
},
|
|
918
|
-
});
|
|
919
|
-
|
|
920
|
-
analysisMarkdown = feedItem?.feedInfoInMarkdown || null;
|
|
919
|
+
if (taskType !== CodeFixTaskType.FixFromIncident) {
|
|
920
|
+
analysisMarkdown = await PostedRootCause.getForIncident(
|
|
921
|
+
run.triggeredByIncidentId,
|
|
922
|
+
);
|
|
923
|
+
}
|
|
921
924
|
} else {
|
|
922
925
|
const alert: Alert | null = await AlertService.findOneById({
|
|
923
926
|
id: run.triggeredByAlertId!,
|
|
@@ -945,25 +948,11 @@ export default class AIAgentDataAPI {
|
|
|
945
948
|
subjectTitle = alert.title || "Untitled alert";
|
|
946
949
|
serviceName = alert.monitor?.name || null;
|
|
947
950
|
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
},
|
|
954
|
-
select: {
|
|
955
|
-
feedInfoInMarkdown: true,
|
|
956
|
-
},
|
|
957
|
-
sort: {
|
|
958
|
-
createdAt: SortOrder.Descending,
|
|
959
|
-
},
|
|
960
|
-
props: {
|
|
961
|
-
isRoot: true,
|
|
962
|
-
},
|
|
963
|
-
},
|
|
964
|
-
);
|
|
965
|
-
|
|
966
|
-
analysisMarkdown = feedItem?.feedInfoInMarkdown || null;
|
|
951
|
+
if (taskType !== CodeFixTaskType.FixFromIncident) {
|
|
952
|
+
analysisMarkdown = await PostedRootCause.getForAlert(
|
|
953
|
+
run.triggeredByAlertId!,
|
|
954
|
+
);
|
|
955
|
+
}
|
|
967
956
|
}
|
|
968
957
|
|
|
969
958
|
if (!analysisMarkdown) {
|
|
@@ -16,6 +16,8 @@ import Query from "../../Types/BaseDatabase/Query";
|
|
|
16
16
|
import { JSONArray, JSONObject } from "../../Types/JSON";
|
|
17
17
|
import AIRunType from "../../Types/AI/AIRunType";
|
|
18
18
|
import AIRunHumanVerdict from "../../Types/AI/AIRunHumanVerdict";
|
|
19
|
+
import AIRunStatus from "../../Types/AI/AIRunStatus";
|
|
20
|
+
import AIRunEventType from "../../Types/AI/AIRunEventType";
|
|
19
21
|
import AIRun from "../../Models/DatabaseModels/AIRun";
|
|
20
22
|
import AIRunEvent from "../../Models/DatabaseModels/AIRunEvent";
|
|
21
23
|
import Incident from "../../Models/DatabaseModels/Incident";
|
|
@@ -32,6 +34,7 @@ import SpanService from "../Services/SpanService";
|
|
|
32
34
|
import FixFromIncidentTaskTrigger from "../Utils/AI/SRE/FixFromIncidentTaskTrigger";
|
|
33
35
|
import FixPerformanceTaskTrigger from "../Utils/AI/SRE/FixPerformanceTaskTrigger";
|
|
34
36
|
import TelemetryImprovementTaskTrigger from "../Utils/AI/SRE/TelemetryImprovementTaskTrigger";
|
|
37
|
+
import PostedRootCause from "../Utils/AI/SRE/PostedRootCause";
|
|
35
38
|
import CodeFixTaskType from "../../Types/AI/CodeFixTaskType";
|
|
36
39
|
import { AnalyzableSpan } from "../Utils/AI/PerfEvidence/SpanTreeAnalyzer";
|
|
37
40
|
|
|
@@ -47,6 +50,100 @@ const MAX_ANALYZED_TRACE_SPANS: number = 500;
|
|
|
47
50
|
|
|
48
51
|
const MAX_EVENTS: number = 500;
|
|
49
52
|
|
|
53
|
+
/*
|
|
54
|
+
* `aiRunId` is the established dashboard API field. The investigation panel
|
|
55
|
+
* introduced the more explicit `investigationRunId` name while this feature
|
|
56
|
+
* was in flight, so accept either spelling without ever allowing two
|
|
57
|
+
* different ids in one request. Both names identify the exact displayed run.
|
|
58
|
+
*/
|
|
59
|
+
function getDisplayedInvestigationRunId(req: ExpressRequest): ObjectID {
|
|
60
|
+
const aiRunId: string =
|
|
61
|
+
typeof req.body["aiRunId"] === "string"
|
|
62
|
+
? (req.body["aiRunId"] as string).trim()
|
|
63
|
+
: "";
|
|
64
|
+
const investigationRunId: string =
|
|
65
|
+
typeof req.body["investigationRunId"] === "string"
|
|
66
|
+
? (req.body["investigationRunId"] as string).trim()
|
|
67
|
+
: "";
|
|
68
|
+
|
|
69
|
+
if (!aiRunId && !investigationRunId) {
|
|
70
|
+
throw new BadDataException("investigationRunId (or aiRunId) is required.");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (aiRunId && investigationRunId && aiRunId !== investigationRunId) {
|
|
74
|
+
throw new BadDataException(
|
|
75
|
+
"aiRunId and investigationRunId must identify the same displayed investigation.",
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const selectedRunId: string = investigationRunId || aiRunId;
|
|
80
|
+
ObjectID.validateUUID(selectedRunId);
|
|
81
|
+
return new ObjectID(selectedRunId);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/*
|
|
85
|
+
* The run wins its Running -> Completed transition before it performs the
|
|
86
|
+
* confidence check and posts the RootCause feed item. A final RunCompleted or
|
|
87
|
+
* RunFailed event is emitted when that finalization settles; failures from
|
|
88
|
+
* retried attempts precede a later RunStarted. This upper bound is a crash
|
|
89
|
+
* failsafe and deliberately leaves ample margin above the bounded confidence
|
|
90
|
+
* classification deadline plus feed publication.
|
|
91
|
+
*/
|
|
92
|
+
export const ANALYSIS_FINALIZATION_TIMEOUT_MS: number = 10 * 60 * 1000;
|
|
93
|
+
// Database/application clocks can differ briefly around the Completed write.
|
|
94
|
+
export const ANALYSIS_COMPLETION_CLOCK_SKEW_MS: number = 60 * 1000;
|
|
95
|
+
|
|
96
|
+
export function isAnalysisPendingForRun(data: {
|
|
97
|
+
run: AIRun;
|
|
98
|
+
events: Array<AIRunEvent>;
|
|
99
|
+
analysisMarkdown: string | null;
|
|
100
|
+
currentDate?: Date | undefined;
|
|
101
|
+
}): boolean {
|
|
102
|
+
if (
|
|
103
|
+
data.run.status !== AIRunStatus.Completed ||
|
|
104
|
+
data.analysisMarkdown ||
|
|
105
|
+
!data.run.completedAt
|
|
106
|
+
) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/*
|
|
111
|
+
* A retried run retains RunFailed from earlier attempts. Only a settlement
|
|
112
|
+
* event emitted after the latest RunStarted belongs to the attempt that won
|
|
113
|
+
* the Completed transition; an older failure must not stop report polling.
|
|
114
|
+
* sendLatestInvestigation supplies events in sequence order.
|
|
115
|
+
*/
|
|
116
|
+
let latestRunStartedIndex: number = -1;
|
|
117
|
+
data.events.forEach((event: AIRunEvent, index: number): void => {
|
|
118
|
+
if (event.eventType === AIRunEventType.RunStarted) {
|
|
119
|
+
latestRunStartedIndex = index;
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const hasFinalizationEvent: boolean = data.events.some(
|
|
124
|
+
(event: AIRunEvent, index: number): boolean => {
|
|
125
|
+
return (
|
|
126
|
+
index > latestRunStartedIndex &&
|
|
127
|
+
(event.eventType === AIRunEventType.RunCompleted ||
|
|
128
|
+
event.eventType === AIRunEventType.RunFailed)
|
|
129
|
+
);
|
|
130
|
+
},
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
if (hasFinalizationEvent) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const currentDate: Date = data.currentDate || new Date();
|
|
138
|
+
const millisecondsSinceCompletion: number =
|
|
139
|
+
currentDate.getTime() - data.run.completedAt.getTime();
|
|
140
|
+
|
|
141
|
+
return (
|
|
142
|
+
millisecondsSinceCompletion >= -ANALYSIS_COMPLETION_CLOCK_SKEW_MS &&
|
|
143
|
+
millisecondsSinceCompletion < ANALYSIS_FINALIZATION_TIMEOUT_MS
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
50
147
|
/*
|
|
51
148
|
* Returns the latest AI investigation (the AIRun + its ordered
|
|
52
149
|
* AIRunEvents) for an incident or alert, so the dashboard can render a live
|
|
@@ -80,6 +177,10 @@ async function sendLatestInvestigation(
|
|
|
80
177
|
req: ExpressRequest,
|
|
81
178
|
res: ExpressResponse,
|
|
82
179
|
runQuery: Query<AIRun>,
|
|
180
|
+
subject: {
|
|
181
|
+
incidentId?: ObjectID | undefined;
|
|
182
|
+
alertId?: ObjectID | undefined;
|
|
183
|
+
},
|
|
83
184
|
): Promise<void> {
|
|
84
185
|
const runs: Array<AIRun> = await AIRunService.findBy({
|
|
85
186
|
query: runQuery,
|
|
@@ -93,6 +194,7 @@ async function sendLatestInvestigation(
|
|
|
93
194
|
toolCallCount: true,
|
|
94
195
|
totalTokens: true,
|
|
95
196
|
createdAt: true,
|
|
197
|
+
codeFixRecommendation: true,
|
|
96
198
|
// Measurement layer: the panel renders verdict/grade state from these.
|
|
97
199
|
humanVerdict: true,
|
|
98
200
|
humanVerdictAt: true,
|
|
@@ -111,6 +213,8 @@ async function sendLatestInvestigation(
|
|
|
111
213
|
Response.sendJsonObjectResponse(req, res, {
|
|
112
214
|
run: null,
|
|
113
215
|
events: [],
|
|
216
|
+
analysisMarkdown: null,
|
|
217
|
+
isAnalysisPending: false,
|
|
114
218
|
});
|
|
115
219
|
return;
|
|
116
220
|
}
|
|
@@ -138,9 +242,32 @@ async function sendLatestInvestigation(
|
|
|
138
242
|
|
|
139
243
|
const eventsJson: JSONArray = BaseModel.toJSONArray(events, AIRunEvent);
|
|
140
244
|
|
|
245
|
+
/*
|
|
246
|
+
* RootCause is the canonical persisted investigation result. The explicit
|
|
247
|
+
* aiRunId association is immune to application/database clock skew and to
|
|
248
|
+
* overlapping investigations posting out of order.
|
|
249
|
+
*/
|
|
250
|
+
let analysisMarkdown: string | null = null;
|
|
251
|
+
|
|
252
|
+
if (run.status === AIRunStatus.Completed && run.completedAt) {
|
|
253
|
+
analysisMarkdown = await PostedRootCause.getForInvestigation({
|
|
254
|
+
...subject,
|
|
255
|
+
aiRunId: run.id!,
|
|
256
|
+
runCompletedAt: run.completedAt,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const isAnalysisPending: boolean = isAnalysisPendingForRun({
|
|
261
|
+
run,
|
|
262
|
+
events,
|
|
263
|
+
analysisMarkdown,
|
|
264
|
+
});
|
|
265
|
+
|
|
141
266
|
Response.sendJsonObjectResponse(req, res, {
|
|
142
267
|
run: runJson || null,
|
|
143
268
|
events: eventsJson,
|
|
269
|
+
analysisMarkdown,
|
|
270
|
+
isAnalysisPending,
|
|
144
271
|
});
|
|
145
272
|
}
|
|
146
273
|
|
|
@@ -178,10 +305,17 @@ router.post(
|
|
|
178
305
|
);
|
|
179
306
|
}
|
|
180
307
|
|
|
181
|
-
await sendLatestInvestigation(
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
308
|
+
await sendLatestInvestigation(
|
|
309
|
+
req,
|
|
310
|
+
res,
|
|
311
|
+
{
|
|
312
|
+
triggeredByIncidentId: incidentId,
|
|
313
|
+
runType: AIRunType.Investigation,
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
incidentId,
|
|
317
|
+
},
|
|
318
|
+
);
|
|
185
319
|
return;
|
|
186
320
|
} catch (err) {
|
|
187
321
|
next(err);
|
|
@@ -224,10 +358,17 @@ router.post(
|
|
|
224
358
|
);
|
|
225
359
|
}
|
|
226
360
|
|
|
227
|
-
await sendLatestInvestigation(
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
361
|
+
await sendLatestInvestigation(
|
|
362
|
+
req,
|
|
363
|
+
res,
|
|
364
|
+
{
|
|
365
|
+
triggeredByAlertId: alertId,
|
|
366
|
+
runType: AIRunType.Investigation,
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
alertId,
|
|
370
|
+
},
|
|
371
|
+
);
|
|
231
372
|
return;
|
|
232
373
|
} catch (err) {
|
|
233
374
|
next(err);
|
|
@@ -238,14 +379,16 @@ router.post(
|
|
|
238
379
|
|
|
239
380
|
/*
|
|
240
381
|
* Human verdict capture (Phase 2 measurement layer): one-click Confirm /
|
|
241
|
-
* Reject on the investigation panel. Applies to the
|
|
242
|
-
* investigation run
|
|
382
|
+
* Reject on the investigation panel. Applies to the exact COMPLETED
|
|
383
|
+
* investigation run displayed to the user; overwriting is allowed (a user may
|
|
243
384
|
* change their mind), and the request is rejected when no completed
|
|
244
385
|
* investigation exists. The subject is access-checked under the USER's
|
|
245
386
|
* permissions first (same idiom as the read routes above); the run itself is
|
|
246
387
|
* written as root because investigation runs are system-authored.
|
|
247
388
|
* Body: { subjectType: "incident" | "alert", subjectId,
|
|
248
|
-
* verdict: "Confirmed" |
|
|
389
|
+
* aiRunId (or its investigationRunId alias), verdict: "Confirmed" |
|
|
390
|
+
* "Rejected" }. The run id binds the mutation to the analysis currently
|
|
391
|
+
* displayed. Response: { runId, verdict }.
|
|
249
392
|
*/
|
|
250
393
|
router.post(
|
|
251
394
|
"/ai-investigation/verdict",
|
|
@@ -278,6 +421,8 @@ router.post(
|
|
|
278
421
|
|
|
279
422
|
const subjectId: ObjectID = new ObjectID(subjectIdString);
|
|
280
423
|
|
|
424
|
+
const investigationRunId: ObjectID = getDisplayedInvestigationRunId(req);
|
|
425
|
+
|
|
281
426
|
const verdict: string | undefined = req.body["verdict"] as
|
|
282
427
|
| string
|
|
283
428
|
| undefined;
|
|
@@ -292,34 +437,42 @@ router.post(
|
|
|
292
437
|
}
|
|
293
438
|
|
|
294
439
|
// Access check under the USER's permissions (null when not allowed).
|
|
440
|
+
let projectId: ObjectID | undefined = undefined;
|
|
441
|
+
|
|
295
442
|
if (subjectType === "incident") {
|
|
296
443
|
const incident: Incident | null = await IncidentService.findOneById({
|
|
297
444
|
id: subjectId,
|
|
298
|
-
select: { _id: true },
|
|
445
|
+
select: { _id: true, projectId: true },
|
|
299
446
|
props,
|
|
300
447
|
});
|
|
301
448
|
|
|
302
|
-
if (!incident) {
|
|
449
|
+
if (!incident || !incident.projectId) {
|
|
303
450
|
throw new BadDataException(
|
|
304
451
|
"Incident not found (or you do not have access to it).",
|
|
305
452
|
);
|
|
306
453
|
}
|
|
454
|
+
|
|
455
|
+
projectId = incident.projectId;
|
|
307
456
|
} else {
|
|
308
457
|
const alert: Alert | null = await AlertService.findOneById({
|
|
309
458
|
id: subjectId,
|
|
310
|
-
select: { _id: true },
|
|
459
|
+
select: { _id: true, projectId: true },
|
|
311
460
|
props,
|
|
312
461
|
});
|
|
313
462
|
|
|
314
|
-
if (!alert) {
|
|
463
|
+
if (!alert || !alert.projectId) {
|
|
315
464
|
throw new BadDataException(
|
|
316
465
|
"Alert not found (or you do not have access to it).",
|
|
317
466
|
);
|
|
318
467
|
}
|
|
468
|
+
|
|
469
|
+
projectId = alert.projectId;
|
|
319
470
|
}
|
|
320
471
|
|
|
321
472
|
const result: { runId: ObjectID; verdict: AIRunHumanVerdict } =
|
|
322
|
-
await AIRunService.
|
|
473
|
+
await AIRunService.applyHumanVerdictToInvestigation({
|
|
474
|
+
aiRunId: investigationRunId,
|
|
475
|
+
projectId,
|
|
323
476
|
...(subjectType === "incident"
|
|
324
477
|
? { incidentId: subjectId }
|
|
325
478
|
: { alertId: subjectId }),
|
|
@@ -346,7 +499,9 @@ router.post(
|
|
|
346
499
|
* access-checked under the USER's permissions first (same idiom as the read
|
|
347
500
|
* routes above); the trigger's gates (completed investigation, GitHub-App
|
|
348
501
|
* repository, per-subject dedupe) fail early with a clear message.
|
|
349
|
-
* Body: { subjectType: "incident" | "alert", subjectId
|
|
502
|
+
* Body: { subjectType: "incident" | "alert", subjectId,
|
|
503
|
+
* aiRunId (or its investigationRunId alias) }. The run id rejects stale
|
|
504
|
+
* clicks instead of silently switching to a newer analysis. Response:
|
|
350
505
|
* { aiRunId } — the Queued CodeFix run the agent worker will claim.
|
|
351
506
|
*/
|
|
352
507
|
router.post(
|
|
@@ -380,6 +535,8 @@ router.post(
|
|
|
380
535
|
|
|
381
536
|
const subjectId: ObjectID = new ObjectID(subjectIdString);
|
|
382
537
|
|
|
538
|
+
const investigationRunId: ObjectID = getDisplayedInvestigationRunId(req);
|
|
539
|
+
|
|
383
540
|
// Access check under the USER's permissions (null when not allowed).
|
|
384
541
|
let projectId: ObjectID | undefined = undefined;
|
|
385
542
|
|
|
@@ -419,6 +576,7 @@ router.post(
|
|
|
419
576
|
...(subjectType === "incident"
|
|
420
577
|
? { incidentId: subjectId }
|
|
421
578
|
: { alertId: subjectId }),
|
|
579
|
+
investigationRunId,
|
|
422
580
|
userId: props.userId!,
|
|
423
581
|
});
|
|
424
582
|
|
|
@@ -15,11 +15,9 @@ import Response from "../Utils/Response";
|
|
|
15
15
|
import BaseAPI from "./BaseAPI";
|
|
16
16
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
17
17
|
import NotFoundException from "../../Types/Exception/NotFoundException";
|
|
18
|
-
import HashedString from "../../Types/HashedString";
|
|
19
18
|
import ObjectID from "../../Types/ObjectID";
|
|
20
19
|
import Dashboard from "../../Models/DatabaseModels/Dashboard";
|
|
21
20
|
import DashboardDomain from "../../Models/DatabaseModels/DashboardDomain";
|
|
22
|
-
import { EncryptionSecret } from "../EnvironmentConfig";
|
|
23
21
|
import { DASHBOARD_MASTER_PASSWORD_INVALID_MESSAGE } from "../../Types/Dashboard/MasterPassword";
|
|
24
22
|
import NotAuthenticatedException from "../../Types/Exception/NotAuthenticatedException";
|
|
25
23
|
import ForbiddenException from "../../Types/Exception/ForbiddenException";
|
|
@@ -1541,10 +1539,9 @@ export default class DashboardAPI extends BaseAPI<
|
|
|
1541
1539
|
req.params["dashboardId"] as string,
|
|
1542
1540
|
);
|
|
1543
1541
|
|
|
1544
|
-
const password:
|
|
1545
|
-
req.body && (req.body["password"] as string);
|
|
1542
|
+
const password: unknown = req.body && req.body["password"];
|
|
1546
1543
|
|
|
1547
|
-
if (!password) {
|
|
1544
|
+
if (typeof password !== "string" || !password) {
|
|
1548
1545
|
throw new BadDataException("Master password is required.");
|
|
1549
1546
|
}
|
|
1550
1547
|
|
|
@@ -1556,6 +1553,7 @@ export default class DashboardAPI extends BaseAPI<
|
|
|
1556
1553
|
projectId: true,
|
|
1557
1554
|
enableMasterPassword: true,
|
|
1558
1555
|
masterPassword: true,
|
|
1556
|
+
masterPasswordSalt: true,
|
|
1559
1557
|
isPublicDashboard: true,
|
|
1560
1558
|
},
|
|
1561
1559
|
props: {
|
|
@@ -1579,12 +1577,14 @@ export default class DashboardAPI extends BaseAPI<
|
|
|
1579
1577
|
);
|
|
1580
1578
|
}
|
|
1581
1579
|
|
|
1582
|
-
const
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1580
|
+
const isMasterPasswordValid: boolean =
|
|
1581
|
+
await DashboardService.verifyHashedColumnValue({
|
|
1582
|
+
item: dashboard,
|
|
1583
|
+
columnName: "masterPassword",
|
|
1584
|
+
plainValue: password,
|
|
1585
|
+
});
|
|
1586
1586
|
|
|
1587
|
-
if (
|
|
1587
|
+
if (!isMasterPasswordValid) {
|
|
1588
1588
|
throw new BadDataException(
|
|
1589
1589
|
DASHBOARD_MASTER_PASSWORD_INVALID_MESSAGE,
|
|
1590
1590
|
);
|