@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
|
@@ -6,7 +6,7 @@ import StatusPageResource from "../../Models/DatabaseModels/StatusPageResource";
|
|
|
6
6
|
import Dictionary from "../../Types/Dictionary";
|
|
7
7
|
import UptimePrecision from "../../Types/StatusPage/UptimePrecision";
|
|
8
8
|
import StatusPageGroup from "../../Models/DatabaseModels/StatusPageGroup";
|
|
9
|
-
import StatusPageGroupTreeUtil from "./GroupTree";
|
|
9
|
+
import StatusPageGroupTreeUtil, { StatusPageGroupTreeIndex } from "./GroupTree";
|
|
10
10
|
import UptimeUtil, { UptimeWindow } from "../Uptime/UptimeUtil";
|
|
11
11
|
|
|
12
12
|
export default class StatusPageResourceUptimeUtil {
|
|
@@ -81,6 +81,12 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
81
81
|
* (or pass only this group) to look at the group's own resources.
|
|
82
82
|
*/
|
|
83
83
|
allStatusPageGroups?: Array<StatusPageGroup> | undefined;
|
|
84
|
+
/*
|
|
85
|
+
* A prebuilt parent -> children index over allStatusPageGroups. Optional,
|
|
86
|
+
* and worth passing from any caller that asks this per group: without it
|
|
87
|
+
* every call re-buckets the whole group list.
|
|
88
|
+
*/
|
|
89
|
+
statusPageGroupTreeIndex?: StatusPageGroupTreeIndex | undefined;
|
|
84
90
|
}): MonitorStatus {
|
|
85
91
|
let currentStatus: MonitorStatus = new MonitorStatus();
|
|
86
92
|
currentStatus.name = "Operational";
|
|
@@ -91,6 +97,7 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
91
97
|
statusPageGroup: data.statusPageGroup,
|
|
92
98
|
statusPageResources: data.statusPageResources,
|
|
93
99
|
allStatusPageGroups: data.allStatusPageGroups,
|
|
100
|
+
statusPageGroupTreeIndex: data.statusPageGroupTreeIndex,
|
|
94
101
|
});
|
|
95
102
|
|
|
96
103
|
for (const resource of resourcesInGroup) {
|
|
@@ -187,6 +194,8 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
187
194
|
* makes each level of the hierarchy show a rolled up availability.
|
|
188
195
|
*/
|
|
189
196
|
allStatusPageGroups?: Array<StatusPageGroup> | undefined;
|
|
197
|
+
/* See getCurrentStatusPageGroupStatus. */
|
|
198
|
+
statusPageGroupTreeIndex?: StatusPageGroupTreeIndex | undefined;
|
|
190
199
|
}): number | null {
|
|
191
200
|
if (!data.statusPageGroup.showUptimePercent) {
|
|
192
201
|
return null;
|
|
@@ -197,6 +206,7 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
197
206
|
statusPageGroup: data.statusPageGroup,
|
|
198
207
|
statusPageResources: data.statusPageResources,
|
|
199
208
|
allStatusPageGroups: data.allStatusPageGroups,
|
|
209
|
+
statusPageGroupTreeIndex: data.statusPageGroupTreeIndex,
|
|
200
210
|
});
|
|
201
211
|
|
|
202
212
|
if (resourcesInGroup.length === 0) {
|
|
@@ -276,11 +286,24 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
276
286
|
statusPageGroup: StatusPageGroup;
|
|
277
287
|
statusPageResources: Array<StatusPageResource>;
|
|
278
288
|
allStatusPageGroups?: Array<StatusPageGroup> | undefined;
|
|
289
|
+
/* See getCurrentStatusPageGroupStatus. */
|
|
290
|
+
statusPageGroupTreeIndex?: StatusPageGroupTreeIndex | undefined;
|
|
279
291
|
}): Array<StatusPageResource> {
|
|
292
|
+
const statusPageGroups: Array<StatusPageGroup> =
|
|
293
|
+
data.allStatusPageGroups || [data.statusPageGroup];
|
|
294
|
+
|
|
280
295
|
const groupsToInclude: Array<StatusPageGroup> =
|
|
281
296
|
StatusPageGroupTreeUtil.getGroupAndDescendants({
|
|
282
297
|
statusPageGroup: data.statusPageGroup,
|
|
283
|
-
statusPageGroups:
|
|
298
|
+
statusPageGroups: statusPageGroups,
|
|
299
|
+
/*
|
|
300
|
+
* An index built over a different list than the one in play would
|
|
301
|
+
* answer for the wrong hierarchy, and allStatusPageGroups is what the
|
|
302
|
+
* caller's index is built from.
|
|
303
|
+
*/
|
|
304
|
+
index: data.allStatusPageGroups
|
|
305
|
+
? data.statusPageGroupTreeIndex
|
|
306
|
+
: undefined,
|
|
284
307
|
});
|
|
285
308
|
|
|
286
309
|
const groupIds: Set<string> = new Set<string>(
|
|
@@ -319,6 +342,15 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
319
342
|
|
|
320
343
|
const allUptimePercent: Array<number> = [];
|
|
321
344
|
|
|
345
|
+
/*
|
|
346
|
+
* One index for the whole descent below, rather than one re-bucketing of
|
|
347
|
+
* the group list per level and per reporting group.
|
|
348
|
+
*/
|
|
349
|
+
const groupTreeIndex: StatusPageGroupTreeIndex =
|
|
350
|
+
StatusPageGroupTreeUtil.buildIndex({
|
|
351
|
+
statusPageGroups: data.resourceGroups,
|
|
352
|
+
});
|
|
353
|
+
|
|
322
354
|
/*
|
|
323
355
|
* Calculate for groups first. Groups nest, and a group that reports uptime
|
|
324
356
|
* already averages its whole subtree - so descend only until the first
|
|
@@ -341,6 +373,7 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
341
373
|
monitorsInGroup: data.monitorsInGroup,
|
|
342
374
|
uptimeWindow: data.uptimeWindow,
|
|
343
375
|
allStatusPageGroups: data.resourceGroups,
|
|
376
|
+
statusPageGroupTreeIndex: groupTreeIndex,
|
|
344
377
|
});
|
|
345
378
|
|
|
346
379
|
if (groupUptimePercent !== null) {
|
|
@@ -354,6 +387,7 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
354
387
|
StatusPageGroupTreeUtil.getChildGroups({
|
|
355
388
|
statusPageGroupId: group._id?.toString() || "",
|
|
356
389
|
statusPageGroups: data.resourceGroups,
|
|
390
|
+
index: groupTreeIndex,
|
|
357
391
|
}),
|
|
358
392
|
);
|
|
359
393
|
}
|
|
@@ -362,6 +396,7 @@ export default class StatusPageResourceUptimeUtil {
|
|
|
362
396
|
collectGroupUptime(
|
|
363
397
|
StatusPageGroupTreeUtil.getRootGroups({
|
|
364
398
|
statusPageGroups: data.resourceGroups,
|
|
399
|
+
index: groupTreeIndex,
|
|
365
400
|
}),
|
|
366
401
|
);
|
|
367
402
|
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import InBetween from "../../Types/BaseDatabase/InBetween";
|
|
2
|
+
import { TelemetrySavedViewTimeRange } from "../../Types/Telemetry/TelemetrySavedViewState";
|
|
3
|
+
import RangeStartAndEndDateTime from "../../Types/Time/RangeStartAndEndDateTime";
|
|
4
|
+
import TimeRange from "../../Types/Time/TimeRange";
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* Saved views (logs, metrics, traces) must remember the time *selection*, not
|
|
8
|
+
* the window that selection happened to resolve to when the view was saved.
|
|
9
|
+
* "Past 1 Hour" saved today has to still mean the last hour next week, so only
|
|
10
|
+
* a Custom range carries absolute timestamps; every rolling range is stored as
|
|
11
|
+
* its token alone and re-resolved against the clock each time it is applied.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export const DEFAULT_SAVED_VIEW_TIME_RANGE: TimeRange = TimeRange.PAST_ONE_HOUR;
|
|
15
|
+
|
|
16
|
+
export function serializeSavedViewTimeRange(
|
|
17
|
+
timeRange: RangeStartAndEndDateTime,
|
|
18
|
+
): TelemetrySavedViewTimeRange {
|
|
19
|
+
const serialized: TelemetrySavedViewTimeRange = { range: timeRange.range };
|
|
20
|
+
|
|
21
|
+
if (timeRange.range === TimeRange.CUSTOM && timeRange.startAndEndDate) {
|
|
22
|
+
serialized.startValue = toIsoString(timeRange.startAndEndDate.startValue);
|
|
23
|
+
serialized.endValue = toIsoString(timeRange.startAndEndDate.endValue);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return serialized;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* Read a stored time selection, or undefined when there is nothing usable
|
|
31
|
+
* there. The input is whatever came back out of a JSON column, so nothing
|
|
32
|
+
* about its shape is guaranteed. Callers that have another source to fall
|
|
33
|
+
* back on (e.g. a legacy absolute window) use this; callers that do not use
|
|
34
|
+
* deserializeSavedViewTimeRange below, which substitutes the default.
|
|
35
|
+
*/
|
|
36
|
+
export function readSavedViewTimeRange(
|
|
37
|
+
saved: TelemetrySavedViewTimeRange | unknown,
|
|
38
|
+
): RangeStartAndEndDateTime | undefined {
|
|
39
|
+
if (!saved || typeof saved !== "object") {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const rawRange: unknown = (saved as Record<string, unknown>)["range"];
|
|
44
|
+
|
|
45
|
+
if (typeof rawRange !== "string") {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const knownRanges: Array<string> = Object.values(TimeRange);
|
|
50
|
+
|
|
51
|
+
if (!knownRanges.includes(rawRange)) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const range: TimeRange = rawRange as TimeRange;
|
|
56
|
+
|
|
57
|
+
if (range !== TimeRange.CUSTOM) {
|
|
58
|
+
return { range: range };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const start: Date | null = toDate(
|
|
62
|
+
(saved as Record<string, unknown>)["startValue"],
|
|
63
|
+
);
|
|
64
|
+
const end: Date | null = toDate(
|
|
65
|
+
(saved as Record<string, unknown>)["endValue"],
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
if (!start || !end) {
|
|
69
|
+
// A Custom range without a usable window says nothing about when to look.
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
range: TimeRange.CUSTOM,
|
|
75
|
+
startAndEndDate: new InBetween<Date>(start, end),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/*
|
|
80
|
+
* Rebuild a RangeStartAndEndDateTime from saved state. Unknown or malformed
|
|
81
|
+
* values fall back to the default (past one hour) rather than throwing or
|
|
82
|
+
* producing a nonsensical window.
|
|
83
|
+
*/
|
|
84
|
+
export function deserializeSavedViewTimeRange(
|
|
85
|
+
saved: TelemetrySavedViewTimeRange | unknown,
|
|
86
|
+
): RangeStartAndEndDateTime {
|
|
87
|
+
return (
|
|
88
|
+
readSavedViewTimeRange(saved) || { range: DEFAULT_SAVED_VIEW_TIME_RANGE }
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function toIsoString(value: Date | string): string {
|
|
93
|
+
if (value instanceof Date) {
|
|
94
|
+
return value.toISOString();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Dates round-tripped through JSON come back as strings.
|
|
98
|
+
const parsed: Date = new Date(value);
|
|
99
|
+
return isNaN(parsed.getTime()) ? String(value) : parsed.toISOString();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function toDate(value: unknown): Date | null {
|
|
103
|
+
if (value instanceof Date) {
|
|
104
|
+
return isNaN(value.getTime()) ? null : value;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const parsed: Date = new Date(value);
|
|
112
|
+
|
|
113
|
+
return isNaN(parsed.getTime()) ? null : parsed;
|
|
114
|
+
}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import InBetween from "../../Types/BaseDatabase/InBetween";
|
|
2
|
+
import Query from "../../Types/BaseDatabase/Query";
|
|
3
|
+
import { JSONObject, ObjectType } from "../../Types/JSON";
|
|
4
|
+
import MetricViewData from "../../Types/Metrics/MetricViewData";
|
|
5
|
+
import { TelemetryQuery } from "../../Types/Telemetry/TelemetryQuery";
|
|
6
|
+
import TelemetryType from "../../Types/Telemetry/TelemetryType";
|
|
7
|
+
import RangeStartAndEndDateTime from "../../Types/Time/RangeStartAndEndDateTime";
|
|
8
|
+
import TimeRange from "../../Types/Time/TimeRange";
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* The snapshot window that a telemetry monitor evaluated over is stamped onto
|
|
12
|
+
* the query it stores on the Incident / Alert row: logs and exceptions carry
|
|
13
|
+
* it as `time`, spans as `startTime`, metrics as `metricViewData.startAndEndDate`.
|
|
14
|
+
*
|
|
15
|
+
* Two things make that window awkward to consume on the client.
|
|
16
|
+
*
|
|
17
|
+
* 1. It does not survive the store/load round trip as Dates. The blob is
|
|
18
|
+
* persisted through `JSON.stringify`, which calls `InBetween.toJSON()` and
|
|
19
|
+
* then flattens each bound to an ISO string. On the way back
|
|
20
|
+
* `InBetween.fromJSON()` reconstructs the operator but hands those strings
|
|
21
|
+
* to the constructor untouched, so `startValue` is a `string` even though
|
|
22
|
+
* the static type says `Date`. Anything guarding on `instanceof Date`
|
|
23
|
+
* silently no-ops on an incident page.
|
|
24
|
+
*
|
|
25
|
+
* 2. Viewers that own a time-range picker (the logs viewer) need the window as
|
|
26
|
+
* a `RangeStartAndEndDateTime`, not as a query filter, because the picker
|
|
27
|
+
* state — not the query — is what drives the histogram and facet requests.
|
|
28
|
+
*
|
|
29
|
+
* These helpers are the single place that knows both shapes. They are pure so
|
|
30
|
+
* they can be unit tested without mounting a viewer.
|
|
31
|
+
*/
|
|
32
|
+
export default class TelemetryQueryTimeRange {
|
|
33
|
+
/*
|
|
34
|
+
* Field on the telemetry query that carries the snapshot window, per type.
|
|
35
|
+
* Metrics keep theirs on metricViewData instead, and profiles do not store a
|
|
36
|
+
* query at all, so both return null.
|
|
37
|
+
*/
|
|
38
|
+
public static getWindowFieldName(
|
|
39
|
+
telemetryType: TelemetryType | undefined | null,
|
|
40
|
+
): string | null {
|
|
41
|
+
if (telemetryType === TelemetryType.Log) {
|
|
42
|
+
return "time";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (telemetryType === TelemetryType.Exception) {
|
|
46
|
+
return "time";
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (telemetryType === TelemetryType.Trace) {
|
|
50
|
+
return "startTime";
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/*
|
|
57
|
+
* Coerce a stored window into an InBetween whose bounds are real Dates.
|
|
58
|
+
*
|
|
59
|
+
* Accepts an `InBetween` instance (bounds may be Dates, ISO strings or epoch
|
|
60
|
+
* numbers, depending on whether the value was just built or came back from
|
|
61
|
+
* storage) and the plain `{ _type: "InBetween", startValue, endValue }`
|
|
62
|
+
* object that a caller sees when it skipped `JSONFunctions.deserialize`.
|
|
63
|
+
*
|
|
64
|
+
* Returns null for anything unparseable so callers can fall back to their own
|
|
65
|
+
* default. An inverted window (start after end) is returned as-is rather than
|
|
66
|
+
* rejected: it renders as a visibly odd range the user can see and report,
|
|
67
|
+
* which beats silently swapping back to a rolling default that shows
|
|
68
|
+
* unrelated data under an incident's heading.
|
|
69
|
+
*/
|
|
70
|
+
public static toDateWindow(value: unknown): InBetween<Date> | null {
|
|
71
|
+
if (!value || typeof value !== "object") {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let rawStart: unknown = undefined;
|
|
76
|
+
let rawEnd: unknown = undefined;
|
|
77
|
+
|
|
78
|
+
if (value instanceof InBetween) {
|
|
79
|
+
/*
|
|
80
|
+
* Already in the target shape — hand back the same instance rather than
|
|
81
|
+
* an equal copy. Callers use identity to decide whether anything changed,
|
|
82
|
+
* and a fresh-but-equal object would churn React state on every load.
|
|
83
|
+
*/
|
|
84
|
+
if (
|
|
85
|
+
this.toDate(value.startValue) === value.startValue &&
|
|
86
|
+
this.toDate(value.endValue) === value.endValue
|
|
87
|
+
) {
|
|
88
|
+
return value as InBetween<Date>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
rawStart = value.startValue;
|
|
92
|
+
rawEnd = value.endValue;
|
|
93
|
+
} else if ((value as JSONObject)["_type"] === ObjectType.InBetween) {
|
|
94
|
+
rawStart = (value as JSONObject)["startValue"];
|
|
95
|
+
rawEnd = (value as JSONObject)["endValue"];
|
|
96
|
+
} else {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const startDate: Date | null = this.toDate(rawStart);
|
|
101
|
+
const endDate: Date | null = this.toDate(rawEnd);
|
|
102
|
+
|
|
103
|
+
if (!startDate || !endDate) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return new InBetween<Date>(startDate, endDate);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
private static toDate(value: unknown): Date | null {
|
|
111
|
+
if (value === null || value === undefined) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (value instanceof Date) {
|
|
116
|
+
return Number.isNaN(value.getTime()) ? null : value;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (typeof value !== "string" && typeof value !== "number") {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/*
|
|
124
|
+
* `new Date("")` is the current time, not an Invalid Date, so an empty
|
|
125
|
+
* bound would silently become "now" and quietly widen the window instead
|
|
126
|
+
* of being reported as missing.
|
|
127
|
+
*/
|
|
128
|
+
if (typeof value === "string" && value.trim() === "") {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const parsed: Date = new Date(value);
|
|
133
|
+
|
|
134
|
+
return Number.isNaN(parsed.getTime()) ? null : parsed;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/*
|
|
138
|
+
* Pull the snapshot window out of a telemetry query record, whatever its
|
|
139
|
+
* telemetry type. Returns null when the monitor stored no window (older
|
|
140
|
+
* incidents, or a log monitor configured with no lastXSecondsOfLogs).
|
|
141
|
+
*/
|
|
142
|
+
public static getSnapshotWindow(
|
|
143
|
+
telemetryQuery: TelemetryQuery | null | undefined,
|
|
144
|
+
): InBetween<Date> | null {
|
|
145
|
+
if (!telemetryQuery) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (telemetryQuery.metricViewData) {
|
|
150
|
+
const metricWindow: InBetween<Date> | null = this.toDateWindow(
|
|
151
|
+
telemetryQuery.metricViewData.startAndEndDate,
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
if (metricWindow) {
|
|
155
|
+
return metricWindow;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return this.getQueryWindow(
|
|
160
|
+
telemetryQuery.telemetryQuery,
|
|
161
|
+
telemetryQuery.telemetryType,
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/*
|
|
166
|
+
* Same, for a bare query. `telemetryType` picks the field to read; when it is
|
|
167
|
+
* unknown both known field names are tried so a caller holding only a query
|
|
168
|
+
* (e.g. the logs viewer, which is handed a Query<Log> and nothing else) still
|
|
169
|
+
* finds the window.
|
|
170
|
+
*/
|
|
171
|
+
public static getQueryWindow(
|
|
172
|
+
query: Query<Record<string, unknown>> | JSONObject | null | undefined,
|
|
173
|
+
telemetryType?: TelemetryType | undefined,
|
|
174
|
+
): InBetween<Date> | null {
|
|
175
|
+
if (!query) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const fieldName: string | null = this.getWindowFieldName(telemetryType);
|
|
180
|
+
const fieldNames: Array<string> = fieldName
|
|
181
|
+
? [fieldName]
|
|
182
|
+
: ["time", "startTime"];
|
|
183
|
+
|
|
184
|
+
for (const candidate of fieldNames) {
|
|
185
|
+
const window: InBetween<Date> | null = this.toDateWindow(
|
|
186
|
+
(query as JSONObject)[candidate],
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
if (window) {
|
|
190
|
+
return window;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/*
|
|
198
|
+
* Present a snapshot window as a picker value. Always CUSTOM: the window is
|
|
199
|
+
* an absolute instant in the past, so it must never re-anchor to "now" the
|
|
200
|
+
* way a relative range like "Past 1 Hour" does.
|
|
201
|
+
*/
|
|
202
|
+
public static toRangeStartAndEndDateTime(
|
|
203
|
+
window: InBetween<Date> | null | undefined,
|
|
204
|
+
): RangeStartAndEndDateTime | null {
|
|
205
|
+
if (!window) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return {
|
|
210
|
+
range: TimeRange.CUSTOM,
|
|
211
|
+
startAndEndDate: window,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/*
|
|
216
|
+
* Convenience for viewers: resolve the pinned picker value for a query, or
|
|
217
|
+
* null when the query carries no window and the viewer should keep its own
|
|
218
|
+
* rolling default.
|
|
219
|
+
*/
|
|
220
|
+
public static getPinnedRangeForQuery(
|
|
221
|
+
query: Query<Record<string, unknown>> | JSONObject | null | undefined,
|
|
222
|
+
telemetryType?: TelemetryType | undefined,
|
|
223
|
+
): RangeStartAndEndDateTime | null {
|
|
224
|
+
return this.toRangeStartAndEndDateTime(
|
|
225
|
+
this.getQueryWindow(query, telemetryType),
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/*
|
|
230
|
+
* Value equality for two picker values. Hosts that rebuild their query on
|
|
231
|
+
* every render produce an equal-but-new window each time, so state updates
|
|
232
|
+
* have to be gated on the value rather than on object identity or a
|
|
233
|
+
* re-render loop follows.
|
|
234
|
+
*/
|
|
235
|
+
public static isSameRange(
|
|
236
|
+
a: RangeStartAndEndDateTime | null | undefined,
|
|
237
|
+
b: RangeStartAndEndDateTime | null | undefined,
|
|
238
|
+
): boolean {
|
|
239
|
+
if (!a || !b) {
|
|
240
|
+
return !a && !b;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (a.range !== b.range) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const aWindow: InBetween<Date> | null = this.toDateWindow(
|
|
248
|
+
a.startAndEndDate,
|
|
249
|
+
);
|
|
250
|
+
const bWindow: InBetween<Date> | null = this.toDateWindow(
|
|
251
|
+
b.startAndEndDate,
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
if (!aWindow || !bWindow) {
|
|
255
|
+
return !aWindow && !bWindow;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return (
|
|
259
|
+
aWindow.startValue.getTime() === bWindow.startValue.getTime() &&
|
|
260
|
+
aWindow.endValue.getTime() === bWindow.endValue.getTime()
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/*
|
|
265
|
+
* Rewrite a stored telemetry query so every window bound is a real Date.
|
|
266
|
+
*
|
|
267
|
+
* Consumers downstream gate real behaviour on `instanceof Date` — the metric
|
|
268
|
+
* chart skips aggregation-bucket alignment and never fetches exemplars when
|
|
269
|
+
* the bounds are strings — so hydrating once at the page's deserialize
|
|
270
|
+
* boundary is what makes those paths work on an incident.
|
|
271
|
+
*
|
|
272
|
+
* Returns the input unchanged (same reference) when there is nothing to fix,
|
|
273
|
+
* so callers can hydrate unconditionally without churning React state.
|
|
274
|
+
*/
|
|
275
|
+
public static hydrate(
|
|
276
|
+
telemetryQuery: TelemetryQuery | null | undefined,
|
|
277
|
+
): TelemetryQuery | null {
|
|
278
|
+
if (!telemetryQuery) {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
let didChange: boolean = false;
|
|
283
|
+
|
|
284
|
+
let metricViewData: MetricViewData | null =
|
|
285
|
+
telemetryQuery.metricViewData || null;
|
|
286
|
+
|
|
287
|
+
if (metricViewData) {
|
|
288
|
+
const metricWindow: InBetween<Date> | null = this.toDateWindow(
|
|
289
|
+
metricViewData.startAndEndDate,
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
if (metricWindow && metricWindow !== metricViewData.startAndEndDate) {
|
|
293
|
+
metricViewData = {
|
|
294
|
+
...metricViewData,
|
|
295
|
+
startAndEndDate: metricWindow,
|
|
296
|
+
};
|
|
297
|
+
didChange = true;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
let query: TelemetryQuery["telemetryQuery"] =
|
|
302
|
+
telemetryQuery.telemetryQuery || null;
|
|
303
|
+
|
|
304
|
+
if (query) {
|
|
305
|
+
const fieldName: string | null = this.getWindowFieldName(
|
|
306
|
+
telemetryQuery.telemetryType,
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
if (fieldName) {
|
|
310
|
+
const window: InBetween<Date> | null = this.toDateWindow(
|
|
311
|
+
(query as JSONObject)[fieldName],
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
if (window && window !== (query as JSONObject)[fieldName]) {
|
|
315
|
+
query = {
|
|
316
|
+
...(query as JSONObject),
|
|
317
|
+
[fieldName]: window,
|
|
318
|
+
} as TelemetryQuery["telemetryQuery"];
|
|
319
|
+
didChange = true;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (!didChange) {
|
|
325
|
+
return telemetryQuery;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return {
|
|
329
|
+
...telemetryQuery,
|
|
330
|
+
telemetryQuery: query,
|
|
331
|
+
metricViewData: metricViewData,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
}
|
|
@@ -30,6 +30,7 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
|
|
30
30
|
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
|
|
31
31
|
import AIRunType from "../../Types/AI/AIRunType";
|
|
32
32
|
import AIRunStatus from "../../Types/AI/AIRunStatus";
|
|
33
|
+
import AIRunCodeFixRecommendation from "../../Types/AI/AIRunCodeFixRecommendation";
|
|
33
34
|
import AIRunHumanVerdict from "../../Types/AI/AIRunHumanVerdict";
|
|
34
35
|
import AIRunAutoGrade from "../../Types/AI/AIRunAutoGrade";
|
|
35
36
|
import CodeFixTaskType from "../../Types/AI/CodeFixTaskType";
|
|
@@ -57,6 +58,15 @@ let AIRun = class AIRun extends BaseModel {
|
|
|
57
58
|
*/
|
|
58
59
|
this.taskNumber = undefined;
|
|
59
60
|
this.status = undefined;
|
|
61
|
+
/*
|
|
62
|
+
* The server-authored decision that controls whether an incident/alert
|
|
63
|
+
* investigation may be turned into a FixFromIncident task. New subject
|
|
64
|
+
* investigations move to Pending in the atomic Completed transition; the
|
|
65
|
+
* investigation engine settles the value after its structured
|
|
66
|
+
* classification and analysis post. Other lifecycle paths and legacy rows
|
|
67
|
+
* default to NotRecommended so a missing decision never creates a PR.
|
|
68
|
+
*/
|
|
69
|
+
this.codeFixRecommendation = undefined;
|
|
60
70
|
this.user = undefined;
|
|
61
71
|
this.userId = undefined;
|
|
62
72
|
this.conversation = undefined;
|
|
@@ -294,6 +304,34 @@ __decorate([
|
|
|
294
304
|
}),
|
|
295
305
|
__metadata("design:type", String)
|
|
296
306
|
], AIRun.prototype, "status", void 0);
|
|
307
|
+
__decorate([
|
|
308
|
+
ColumnAccessControl({
|
|
309
|
+
create: [],
|
|
310
|
+
read: [
|
|
311
|
+
Permission.ProjectOwner,
|
|
312
|
+
Permission.ProjectAdmin,
|
|
313
|
+
Permission.ProjectMember,
|
|
314
|
+
Permission.Viewer,
|
|
315
|
+
],
|
|
316
|
+
update: [],
|
|
317
|
+
}),
|
|
318
|
+
TableColumn({
|
|
319
|
+
required: true,
|
|
320
|
+
type: TableColumnType.ShortText,
|
|
321
|
+
title: "Code Fix Recommendation",
|
|
322
|
+
description: "For incident/alert investigations: whether the structured investigation outcome recommends opening a code-fix pull request.",
|
|
323
|
+
defaultValue: AIRunCodeFixRecommendation.NotRecommended,
|
|
324
|
+
isDefaultValueColumn: true,
|
|
325
|
+
canReadOnRelationQuery: true,
|
|
326
|
+
}),
|
|
327
|
+
Column({
|
|
328
|
+
nullable: false,
|
|
329
|
+
type: ColumnType.ShortText,
|
|
330
|
+
length: ColumnLength.ShortText,
|
|
331
|
+
default: AIRunCodeFixRecommendation.NotRecommended,
|
|
332
|
+
}),
|
|
333
|
+
__metadata("design:type", String)
|
|
334
|
+
], AIRun.prototype, "codeFixRecommendation", void 0);
|
|
297
335
|
__decorate([
|
|
298
336
|
ColumnAccessControl({
|
|
299
337
|
create: [],
|
|
@@ -832,7 +870,7 @@ __decorate([
|
|
|
832
870
|
required: false,
|
|
833
871
|
type: TableColumnType.JSON,
|
|
834
872
|
title: "Task Context",
|
|
835
|
-
description: "Internal: trigger-time context for code-fix recipes
|
|
873
|
+
description: "Internal: immutable trigger-time context for code-fix recipes, including pinned investigation analyses and FixPerformance trace evidence.",
|
|
836
874
|
}),
|
|
837
875
|
Column({
|
|
838
876
|
nullable: true,
|