@oneuptime/common 12.0.3 → 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/CephCluster.ts +14 -0
- package/Models/DatabaseModels/CodeRepository.ts +14 -6
- package/Models/DatabaseModels/Dashboard.ts +28 -0
- package/Models/DatabaseModels/DockerHost.ts +14 -0
- package/Models/DatabaseModels/GlobalOidcProject.ts +18 -0
- package/Models/DatabaseModels/GlobalSsoProject.ts +18 -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/IoTFleet.ts +14 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +14 -0
- package/Models/DatabaseModels/LogSavedView.ts +33 -0
- package/Models/DatabaseModels/NetworkDevice.ts +14 -0
- package/Models/DatabaseModels/NetworkInterface.ts +18 -0
- package/Models/DatabaseModels/Project.ts +247 -11
- package/Models/DatabaseModels/ProxmoxCluster.ts +14 -0
- 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/Service.ts +30 -0
- package/Models/DatabaseModels/StatusPage.ts +28 -0
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
- package/Models/DatabaseModels/StatusPagePrivateUser.ts +30 -0
- package/Models/DatabaseModels/User.ts +30 -0
- package/Server/API/AIAgentDataAPI.ts +75 -55
- package/Server/API/AIInvestigationAPI.ts +175 -17
- package/Server/API/DashboardAPI.ts +429 -22
- package/Server/API/GitHubAPI.ts +119 -283
- package/Server/API/StatusPageAPI.ts +38 -19
- package/Server/API/UserAPI.ts +263 -1
- package/Server/EnvironmentConfig.ts +23 -3
- package/Server/Infrastructure/ClickhouseConfig.ts +15 -1
- package/Server/Infrastructure/ClickhouseDatabase.ts +1 -1
- package/Server/Infrastructure/GlobalCache.ts +37 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.ts +21 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.ts +68 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +100 -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/1786200000000-RestoreDroppedUniqueIndexes.ts +214 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.ts +69 -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 +20 -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 +101 -1
- package/Server/Services/CodeRepositoryService.ts +105 -2
- package/Server/Services/DatabaseService.ts +227 -3
- package/Server/Services/IncidentFeedService.ts +5 -0
- package/Server/Services/LlmLogService.ts +46 -2
- package/Server/Services/OpenTelemetryIngestService.ts +230 -26
- package/Server/Services/UserService.ts +184 -0
- 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/AI/Toolbox/CodeTools.ts +45 -4
- package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +24 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -0
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +157 -4
- package/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.ts +130 -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 +330 -0
- 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/OverviewCustomFields.test.tsx +333 -0
- package/Tests/App/Dashboard/PortMonitorCriteriaFilter.test.ts +93 -0
- package/Tests/App/Dashboard/UserCustomFields.test.tsx +392 -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/AIAgentDataRepositoryToken.test.ts +381 -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/DashboardPublicAttributeValuesAPI.test.ts +943 -0
- package/Tests/Server/API/DashboardPublicMetricsAggregateAPI.test.ts +1296 -0
- package/Tests/Server/API/DashboardPublicTemplatePayloads.test.ts +598 -0
- package/Tests/Server/API/GitHubAppInstallationBindingAPI.test.ts +539 -0
- package/Tests/Server/API/Helpers.ts +6 -1
- package/Tests/Server/API/StatusPageMasterPasswordAPI.test.ts +335 -0
- package/Tests/Server/API/UserProjectsAPI.test.ts +852 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +128 -0
- package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +215 -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/AddPerUserPasswordSaltMigration.test.ts +178 -0
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +582 -0
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +30 -1
- package/Tests/Server/Services/CodeRepositoryInstallationBinding.test.ts +305 -0
- package/Tests/Server/Services/CodeRepositoryResolutionBinding.test.ts +147 -0
- package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +880 -0
- 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/OpenTelemetryServiceResolutionCache.test.ts +568 -0
- package/Tests/Server/Services/RestoreDroppedUniqueIndexesMigration.test.ts +386 -0
- package/Tests/Server/Services/RestoreServiceLowerNameIndexMigration.test.ts +240 -0
- package/Tests/Server/Services/SeparateIncidentAlertAiSettingsMigration.test.ts +194 -0
- package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +885 -0
- package/Tests/Server/Services/WidenHashedStringColumnsForScryptMigration.test.ts +220 -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/CodeTools.test.ts +47 -1
- package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +10 -0
- 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/AnalyticsDatabase/StatementGenerator.test.ts +120 -0
- package/Tests/Server/Utils/CodeRepository/GitHubInstallationBinding.test.ts +292 -0
- package/Tests/Server/Utils/GitHubInstallationOwnershipVerification.test.ts +340 -0
- package/Tests/Server/Utils/GitHubWebhookAndTreeCacheIsolation.test.ts +250 -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 +585 -0
- package/Tests/Types/Dashboard/DashboardTemplates.test.ts +111 -0
- package/Tests/Types/Database/ColumnLength.test.ts +7 -1
- package/Tests/Types/HashedStringPerUserSalt.test.ts +476 -0
- package/Tests/Types/Monitor/CephMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/CriteriaFilter.test.ts +4 -0
- package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +293 -0
- package/Tests/Types/Monitor/DockerMetricCatalog.test.ts +109 -0
- package/Tests/Types/Monitor/DockerSwarmMetricCatalog.test.ts +118 -0
- package/Tests/Types/Monitor/HostAlertTemplates.test.ts +249 -0
- package/Tests/Types/Monitor/HostMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/IotAlertTemplates.test.ts +320 -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/PodmanAlertTemplates.test.ts +271 -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/CustomFields/CustomFieldsDetail.test.tsx +696 -0
- 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/UI/Utils/UserProjectsModelAPI.test.ts +714 -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/TeamMembersByProject.test.ts +655 -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/Database/ColumnLength.ts +9 -1
- package/Types/Database/TableColumn.ts +11 -0
- package/Types/Database/UnsynchronizedIndex.ts +48 -0
- package/Types/HashedString.ts +140 -4
- 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/CustomFields/CustomFieldsDetail.tsx +85 -11
- 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/Components/Navbar/NavBar.tsx +12 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +19 -7
- 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/ModelAPI/UserProjectsModelAPI.ts +257 -0
- 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/TeamMembersByProject.ts +237 -0
- 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/CephCluster.js +16 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +14 -6
- package/build/dist/Models/DatabaseModels/CodeRepository.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/DockerHost.js +16 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +16 -1
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +16 -1
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.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/IoTFleet.js +16 -1
- package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +16 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.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/NetworkDevice.js +16 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkInterface.js +16 -1
- package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +257 -13
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +16 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.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/Service.js +28 -1
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- 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/Models/DatabaseModels/StatusPagePrivateUser.js +32 -0
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +32 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +49 -48
- 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 +312 -15
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GitHubAPI.js +94 -167
- package/build/dist/Server/API/GitHubAPI.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/API/UserAPI.js +187 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +21 -3
- 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/GlobalCache.js +29 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js +59 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js.map +1 -0
- 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/1786100000000-RestoreServiceLowerNameIndex.js +93 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.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/1786200000000-RestoreDroppedUniqueIndexes.js +101 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js +66 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.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 +20 -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 +86 -2
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/CodeRepositoryService.js +90 -2
- package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +180 -3
- 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/Services/OpenTelemetryIngestService.js +155 -25
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +165 -0
- package/build/dist/Server/Services/UserService.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/AI/Toolbox/CodeTools.js +31 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeTools.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/AnalyticsDatabase/StatementGenerator.js +13 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +126 -4
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js +136 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js.map +1 -0
- 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 +258 -0
- package/build/dist/Server/Utils/PasswordHash.js.map +1 -0
- 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/Database/ColumnLength.js +9 -1
- package/build/dist/Types/Database/ColumnLength.js.map +1 -1
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Database/UnsynchronizedIndex.js +46 -0
- package/build/dist/Types/Database/UnsynchronizedIndex.js.map +1 -0
- package/build/dist/Types/HashedString.js +96 -5
- 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/CustomFields/CustomFieldsDetail.js +51 -10
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.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/Components/Navbar/NavBar.js +3 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +19 -7
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.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/ModelAPI/UserProjectsModelAPI.js +156 -0
- package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js.map +1 -0
- 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/TeamMembersByProject.js +145 -0
- package/build/dist/Utils/TeamMembersByProject.js.map +1 -0
- 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
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
export class MigrationName1786101798351 implements MigrationInterface {
|
|
4
|
+
public name = "MigrationName1786101798351";
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(
|
|
8
|
+
`ALTER TABLE "Project" ADD "enableIncidentInstrumentationFixTasks" boolean NOT NULL DEFAULT false`,
|
|
9
|
+
);
|
|
10
|
+
await queryRunner.query(
|
|
11
|
+
`ALTER TABLE "Project" ADD "enableAlertInstrumentationFixTasks" boolean NOT NULL DEFAULT false`,
|
|
12
|
+
);
|
|
13
|
+
await queryRunner.query(
|
|
14
|
+
`ALTER TABLE "Project" ADD "enableAutomaticIncidentCodeFixes" boolean NOT NULL DEFAULT false`,
|
|
15
|
+
);
|
|
16
|
+
await queryRunner.query(
|
|
17
|
+
`ALTER TABLE "Project" ADD "enableAutomaticAlertCodeFixes" boolean NOT NULL DEFAULT false`,
|
|
18
|
+
);
|
|
19
|
+
await queryRunner.query(
|
|
20
|
+
`ALTER TABLE "Project" ADD "incidentAiDailyAutonomousTokenLimit" integer`,
|
|
21
|
+
);
|
|
22
|
+
await queryRunner.query(
|
|
23
|
+
`ALTER TABLE "Project" ADD "alertAiDailyAutonomousTokenLimit" integer`,
|
|
24
|
+
);
|
|
25
|
+
await queryRunner.query(
|
|
26
|
+
`ALTER TABLE "Project" ADD "incidentAiDailyFixTaskLimit" integer`,
|
|
27
|
+
);
|
|
28
|
+
await queryRunner.query(
|
|
29
|
+
`ALTER TABLE "Project" ADD "alertAiDailyFixTaskLimit" integer`,
|
|
30
|
+
);
|
|
31
|
+
await queryRunner.query(
|
|
32
|
+
`ALTER TABLE "Project" ADD "incidentAiMaxConcurrentInvestigations" integer`,
|
|
33
|
+
);
|
|
34
|
+
await queryRunner.query(
|
|
35
|
+
`ALTER TABLE "Project" ADD "alertAiMaxConcurrentInvestigations" integer`,
|
|
36
|
+
);
|
|
37
|
+
await queryRunner.query(
|
|
38
|
+
`UPDATE "Project" SET "enableIncidentInstrumentationFixTasks" = "enableInstrumentationFixTasks", "enableAlertInstrumentationFixTasks" = "enableInstrumentationFixTasks", "enableAutomaticIncidentCodeFixes" = "enableAutomaticCodeFixes", "enableAutomaticAlertCodeFixes" = "enableAutomaticCodeFixes", "incidentAiDailyAutonomousTokenLimit" = "aiDailyAutonomousTokenLimit", "alertAiDailyAutonomousTokenLimit" = "aiDailyAutonomousTokenLimit", "incidentAiDailyFixTaskLimit" = "aiDailyFixTaskLimit", "alertAiDailyFixTaskLimit" = "aiDailyFixTaskLimit", "incidentAiMaxConcurrentInvestigations" = "aiMaxConcurrentInvestigations", "alertAiMaxConcurrentInvestigations" = "aiMaxConcurrentInvestigations"`,
|
|
39
|
+
);
|
|
40
|
+
await queryRunner.query(
|
|
41
|
+
`ALTER TABLE "Project" DROP COLUMN "enableInstrumentationFixTasks"`,
|
|
42
|
+
);
|
|
43
|
+
await queryRunner.query(
|
|
44
|
+
`ALTER TABLE "Project" DROP COLUMN "enableAutomaticCodeFixes"`,
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
49
|
+
await queryRunner.query(
|
|
50
|
+
`ALTER TABLE "Project" ADD "enableAutomaticCodeFixes" boolean NOT NULL DEFAULT false`,
|
|
51
|
+
);
|
|
52
|
+
await queryRunner.query(
|
|
53
|
+
`ALTER TABLE "Project" ADD "enableInstrumentationFixTasks" boolean NOT NULL DEFAULT false`,
|
|
54
|
+
);
|
|
55
|
+
await queryRunner.query(
|
|
56
|
+
`UPDATE "Project" SET "enableInstrumentationFixTasks" = "enableIncidentInstrumentationFixTasks" OR "enableAlertInstrumentationFixTasks", "enableAutomaticCodeFixes" = "enableAutomaticIncidentCodeFixes" OR "enableAutomaticAlertCodeFixes"`,
|
|
57
|
+
);
|
|
58
|
+
await queryRunner.query(
|
|
59
|
+
`ALTER TABLE "Project" DROP COLUMN "alertAiMaxConcurrentInvestigations"`,
|
|
60
|
+
);
|
|
61
|
+
await queryRunner.query(
|
|
62
|
+
`ALTER TABLE "Project" DROP COLUMN "incidentAiMaxConcurrentInvestigations"`,
|
|
63
|
+
);
|
|
64
|
+
await queryRunner.query(
|
|
65
|
+
`ALTER TABLE "Project" DROP COLUMN "alertAiDailyFixTaskLimit"`,
|
|
66
|
+
);
|
|
67
|
+
await queryRunner.query(
|
|
68
|
+
`ALTER TABLE "Project" DROP COLUMN "incidentAiDailyFixTaskLimit"`,
|
|
69
|
+
);
|
|
70
|
+
await queryRunner.query(
|
|
71
|
+
`ALTER TABLE "Project" DROP COLUMN "alertAiDailyAutonomousTokenLimit"`,
|
|
72
|
+
);
|
|
73
|
+
await queryRunner.query(
|
|
74
|
+
`ALTER TABLE "Project" DROP COLUMN "incidentAiDailyAutonomousTokenLimit"`,
|
|
75
|
+
);
|
|
76
|
+
await queryRunner.query(
|
|
77
|
+
`ALTER TABLE "Project" DROP COLUMN "enableAutomaticAlertCodeFixes"`,
|
|
78
|
+
);
|
|
79
|
+
await queryRunner.query(
|
|
80
|
+
`ALTER TABLE "Project" DROP COLUMN "enableAutomaticIncidentCodeFixes"`,
|
|
81
|
+
);
|
|
82
|
+
await queryRunner.query(
|
|
83
|
+
`ALTER TABLE "Project" DROP COLUMN "enableAlertInstrumentationFixTasks"`,
|
|
84
|
+
);
|
|
85
|
+
await queryRunner.query(
|
|
86
|
+
`ALTER TABLE "Project" DROP COLUMN "enableIncidentInstrumentationFixTasks"`,
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
export class MigrationName1786105470826 implements MigrationInterface {
|
|
4
|
+
public name = "MigrationName1786105470826";
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(`ALTER TABLE "IncidentFeed" ADD "aiRunId" uuid`);
|
|
8
|
+
await queryRunner.query(`ALTER TABLE "AlertFeed" ADD "aiRunId" uuid`);
|
|
9
|
+
await queryRunner.query(
|
|
10
|
+
`CREATE INDEX "IDX_bae064a2cf9282fc2cca934d78" ON "IncidentFeed" ("incidentId", "aiRunId") `,
|
|
11
|
+
);
|
|
12
|
+
await queryRunner.query(
|
|
13
|
+
`CREATE INDEX "IDX_7da528b06c0ae8b2f1b6c9c848" ON "AlertFeed" ("alertId", "aiRunId") `,
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
18
|
+
await queryRunner.query(
|
|
19
|
+
`DROP INDEX "public"."IDX_7da528b06c0ae8b2f1b6c9c848"`,
|
|
20
|
+
);
|
|
21
|
+
await queryRunner.query(
|
|
22
|
+
`DROP INDEX "public"."IDX_bae064a2cf9282fc2cca934d78"`,
|
|
23
|
+
);
|
|
24
|
+
await queryRunner.query(`ALTER TABLE "AlertFeed" DROP COLUMN "aiRunId"`);
|
|
25
|
+
await queryRunner.query(`ALTER TABLE "IncidentFeed" DROP COLUMN "aiRunId"`);
|
|
26
|
+
}
|
|
27
|
+
}
|
package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Restores nine UNIQUE indexes that autogenerated migrations deleted, and that
|
|
5
|
+
* no migration ever put back.
|
|
6
|
+
*
|
|
7
|
+
* HOW THEY WENT MISSING
|
|
8
|
+
*
|
|
9
|
+
* TypeORM's schema builder matches database indexes to entity metadata BY NAME
|
|
10
|
+
* (RdbmsSchemaBuilder.dropOldIndices) and drops every index it cannot find a
|
|
11
|
+
* match for. A hand-named index created only in a migration is invisible to
|
|
12
|
+
* entity metadata, so the next `migration:generate` emits a DROP for it, mixed
|
|
13
|
+
* in with whatever change was actually intended.
|
|
14
|
+
*
|
|
15
|
+
* Found by auditing every hand-named index ever created in a migration up()
|
|
16
|
+
* against a database with all 504 registered migrations applied. 308 such
|
|
17
|
+
* indexes exist; 302 are absent from the migrated schema. Almost all of those
|
|
18
|
+
* are benign — TypeORM re-created an equivalent plain index under its own
|
|
19
|
+
* canonical IDX_<hash> name. The ten that were NOT benign carried a UNIQUE,
|
|
20
|
+
* partial, or expression definition that TypeORM cannot express and therefore
|
|
21
|
+
* never re-created. One of the ten (the Service LOWER(name) index) was restored
|
|
22
|
+
* separately in migration 1786100000000. This handles the other nine.
|
|
23
|
+
*
|
|
24
|
+
* Each one is a lost integrity guarantee, not just a lost index:
|
|
25
|
+
*
|
|
26
|
+
* slug uniqueness CephCluster, DockerHost, IoTFleet, KubernetesCluster,
|
|
27
|
+
* NetworkDevice, ProxmoxCluster — the slug is the public URL
|
|
28
|
+
* identifier for the resource. These six tables currently
|
|
29
|
+
* have NO index on slug at all, so slug lookups are also
|
|
30
|
+
* sequential scans.
|
|
31
|
+
* SSO/OIDC binding GlobalOIDCProject, GlobalSSOProject — one mapping row per
|
|
32
|
+
* (provider, project). Duplicates make a project's identity
|
|
33
|
+
* binding ambiguous.
|
|
34
|
+
* interface ids NetworkInterface — a device cannot have two live
|
|
35
|
+
* interfaces at the same SNMP ifIndex. App-level
|
|
36
|
+
* @UniqueColumnBy does a find-then-insert, which races under
|
|
37
|
+
* concurrency exactly as it did for Service before migration
|
|
38
|
+
* 1778100000000 added a DB constraint.
|
|
39
|
+
*
|
|
40
|
+
* PARTIAL, WHERE THE ORIGINALS MOSTLY WERE NOT
|
|
41
|
+
*
|
|
42
|
+
* Only IDX_network_interface_device_ifindex was originally partial. The other
|
|
43
|
+
* eight were unqualified UNIQUE indexes, and they are restored here as partial
|
|
44
|
+
* on `deletedAt IS NULL`. This is a deliberate change, for three reasons:
|
|
45
|
+
*
|
|
46
|
+
* 1. It matches how the data is actually read. Every query the app issues
|
|
47
|
+
* carries `deletedAt IS NULL` (DatabaseService adds it to every read that
|
|
48
|
+
* is not explicitly withDeleted), so nothing loses index coverage.
|
|
49
|
+
* 2. An unqualified unique index lets a soft-deleted row hold a slug
|
|
50
|
+
* hostage forever — delete a cluster and you can never create another one
|
|
51
|
+
* that slugifies the same way. That is a bug, and restoring it verbatim
|
|
52
|
+
* would restore the bug with it.
|
|
53
|
+
* 3. It makes the repair below non-destructive: a duplicate can be taken out
|
|
54
|
+
* of the index by soft-deleting it rather than by hard-deleting a row.
|
|
55
|
+
*
|
|
56
|
+
* REPAIR BEFORE CREATE
|
|
57
|
+
*
|
|
58
|
+
* A UNIQUE index cannot be created over existing duplicates, and a migration
|
|
59
|
+
* that can fail on real data is a migration that blocks a deploy. Each index is
|
|
60
|
+
* therefore preceded by a repair step that is deterministic (oldest row always
|
|
61
|
+
* wins: createdAt, then _id) and non-destructive:
|
|
62
|
+
*
|
|
63
|
+
* - slugs are RENAMED, not deleted. The losing row keeps all its data and
|
|
64
|
+
* gets a discriminator appended. Slugs already end in a random 10-digit
|
|
65
|
+
* suffix (see Common/Utils/Slug.ts), so collisions should not exist at all;
|
|
66
|
+
* this is a guard, not an expected path.
|
|
67
|
+
* - duplicate mapping / interface rows are SOFT-deleted, which removes them
|
|
68
|
+
* from a partial index without destroying anything. Nothing is hard-deleted
|
|
69
|
+
* and no foreign key is touched, so no cascade can fire.
|
|
70
|
+
*
|
|
71
|
+
* Every statement is idempotent: the repairs are no-ops when there are no
|
|
72
|
+
* duplicates, and each CREATE uses IF NOT EXISTS so an index built by hand
|
|
73
|
+
* ahead of the deploy does not fail the migration.
|
|
74
|
+
*
|
|
75
|
+
* NOT CONCURRENT
|
|
76
|
+
*
|
|
77
|
+
* DataSourceOptions sets no `migrationsTransactionMode`, so TypeORM defaults to
|
|
78
|
+
* "all" and runs every migration inside one transaction. CREATE INDEX
|
|
79
|
+
* CONCURRENTLY cannot run inside a transaction block and would abort the run.
|
|
80
|
+
* These tables are small (infrastructure inventory, not telemetry), so the
|
|
81
|
+
* brief SHARE lock is not a concern.
|
|
82
|
+
*
|
|
83
|
+
* HAND-WRITTEN
|
|
84
|
+
*
|
|
85
|
+
* AGENTS.md requires migrations to come from generate-postgres-migration. It
|
|
86
|
+
* cannot produce this one: @Index() can express neither a partial index nor the
|
|
87
|
+
* repair steps. The entities declare each index with `synchronize: false` so
|
|
88
|
+
* the generator leaves them alone from here on.
|
|
89
|
+
*/
|
|
90
|
+
|
|
91
|
+
interface SlugTable {
|
|
92
|
+
table: string;
|
|
93
|
+
indexName: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const SLUG_TABLES: Array<SlugTable> = [
|
|
97
|
+
{ table: "CephCluster", indexName: "IDX_ceph_cluster_slug" },
|
|
98
|
+
{ table: "DockerHost", indexName: "IDX_docker_host_slug" },
|
|
99
|
+
{ table: "IoTFleet", indexName: "IDX_iot_fleet_slug" },
|
|
100
|
+
{ table: "KubernetesCluster", indexName: "IDX_kubernetes_cluster_slug" },
|
|
101
|
+
{ table: "NetworkDevice", indexName: "IDX_network_device_slug" },
|
|
102
|
+
{ table: "ProxmoxCluster", indexName: "IDX_proxmox_cluster_slug" },
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
interface PairIndex {
|
|
106
|
+
table: string;
|
|
107
|
+
indexName: string;
|
|
108
|
+
columns: Array<string>;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const PAIR_INDEXES: Array<PairIndex> = [
|
|
112
|
+
{
|
|
113
|
+
table: "GlobalOIDCProject",
|
|
114
|
+
indexName: "IDX_GlobalOIDCProject_globalOidcId_projectId",
|
|
115
|
+
columns: ["globalOidcId", "projectId"],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
table: "GlobalSSOProject",
|
|
119
|
+
indexName: "IDX_GlobalSSOProject_globalSsoId_projectId",
|
|
120
|
+
columns: ["globalSsoId", "projectId"],
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
table: "NetworkInterface",
|
|
124
|
+
indexName: "IDX_network_interface_device_ifindex",
|
|
125
|
+
columns: ["networkDeviceId", "interfaceIndex"],
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
export class RestoreDroppedUniqueIndexes1786200000000
|
|
130
|
+
implements MigrationInterface
|
|
131
|
+
{
|
|
132
|
+
public name: string = "RestoreDroppedUniqueIndexes1786200000000";
|
|
133
|
+
|
|
134
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
135
|
+
/*
|
|
136
|
+
* Slug tables: rename the losers rather than removing them. Oldest row
|
|
137
|
+
* keeps the slug; every other live row with the same slug gets the first
|
|
138
|
+
* eight characters of its own _id appended, which is unique by
|
|
139
|
+
* construction and keeps the slug URL-safe.
|
|
140
|
+
*/
|
|
141
|
+
for (const { table, indexName } of SLUG_TABLES) {
|
|
142
|
+
await queryRunner.query(`
|
|
143
|
+
WITH ranked AS (
|
|
144
|
+
SELECT _id,
|
|
145
|
+
ROW_NUMBER() OVER (
|
|
146
|
+
PARTITION BY "slug"
|
|
147
|
+
ORDER BY "createdAt" ASC, _id ASC
|
|
148
|
+
) AS rn
|
|
149
|
+
FROM "${table}"
|
|
150
|
+
WHERE "deletedAt" IS NULL AND "slug" IS NOT NULL
|
|
151
|
+
)
|
|
152
|
+
UPDATE "${table}" t
|
|
153
|
+
SET "slug" = t."slug" || '-' || LEFT(t._id::text, 8)
|
|
154
|
+
FROM ranked r
|
|
155
|
+
WHERE t._id = r._id AND r.rn > 1;
|
|
156
|
+
`);
|
|
157
|
+
|
|
158
|
+
await queryRunner.query(
|
|
159
|
+
`CREATE UNIQUE INDEX IF NOT EXISTS "${indexName}" ON "${table}" ("slug") WHERE "deletedAt" IS NULL`,
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/*
|
|
164
|
+
* Composite tables: soft-delete the losers. The index is partial on
|
|
165
|
+
* `deletedAt IS NULL`, so stamping deletedAt removes the row from the
|
|
166
|
+
* index while leaving every column intact and every foreign key valid.
|
|
167
|
+
*/
|
|
168
|
+
for (const { table, indexName, columns } of PAIR_INDEXES) {
|
|
169
|
+
const partitionBy: string = columns
|
|
170
|
+
.map((column: string): string => {
|
|
171
|
+
return `"${column}"`;
|
|
172
|
+
})
|
|
173
|
+
.join(", ");
|
|
174
|
+
|
|
175
|
+
const notNull: string = columns
|
|
176
|
+
.map((column: string): string => {
|
|
177
|
+
return `"${column}" IS NOT NULL`;
|
|
178
|
+
})
|
|
179
|
+
.join(" AND ");
|
|
180
|
+
|
|
181
|
+
await queryRunner.query(`
|
|
182
|
+
WITH ranked AS (
|
|
183
|
+
SELECT _id,
|
|
184
|
+
ROW_NUMBER() OVER (
|
|
185
|
+
PARTITION BY ${partitionBy}
|
|
186
|
+
ORDER BY "createdAt" ASC, _id ASC
|
|
187
|
+
) AS rn
|
|
188
|
+
FROM "${table}"
|
|
189
|
+
WHERE "deletedAt" IS NULL AND ${notNull}
|
|
190
|
+
)
|
|
191
|
+
UPDATE "${table}" t
|
|
192
|
+
SET "deletedAt" = CURRENT_TIMESTAMP
|
|
193
|
+
FROM ranked r
|
|
194
|
+
WHERE t._id = r._id AND r.rn > 1;
|
|
195
|
+
`);
|
|
196
|
+
|
|
197
|
+
await queryRunner.query(
|
|
198
|
+
`CREATE UNIQUE INDEX IF NOT EXISTS "${indexName}" ON "${table}" (${partitionBy}) WHERE "deletedAt" IS NULL`,
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
204
|
+
/*
|
|
205
|
+
* Only the indexes are reversible. The repair is not: a renamed slug and a
|
|
206
|
+
* soft-deleted duplicate cannot be distinguished afterwards from one the
|
|
207
|
+
* application produced, and guessing would corrupt live data. Dropping the
|
|
208
|
+
* indexes is enough to restore the previous schema shape.
|
|
209
|
+
*/
|
|
210
|
+
for (const { indexName } of [...SLUG_TABLES, ...PAIR_INDEXES]) {
|
|
211
|
+
await queryRunner.query(`DROP INDEX IF EXISTS "public"."${indexName}"`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* GHSA-xx95-gmcf-7q86 — data-side remediation.
|
|
5
|
+
*
|
|
6
|
+
* The code fix closes every way to write an installation ID that a project
|
|
7
|
+
* does not own, and re-derives the binding from Project.gitHubAppInstallationId
|
|
8
|
+
* before minting a token. Neither reaches rows that are ALREADY in the
|
|
9
|
+
* database. Before the fix a caller could put any installation ID on a
|
|
10
|
+
* CodeRepository row in a project they owned, and several code paths (the AI
|
|
11
|
+
* chat read/write tools, the pull-request sync worker) mint from that column
|
|
12
|
+
* directly. So any such row left in place stays a live cross-tenant token.
|
|
13
|
+
*
|
|
14
|
+
* This migration NULLs the installation ID on every repository row that
|
|
15
|
+
* contradicts its own project. That is decidable and safe: the project's own
|
|
16
|
+
* binding is the authority, so a row disagreeing with it was either poisoned
|
|
17
|
+
* or is stale after a reinstall. Nothing is deleted — the repository row keeps
|
|
18
|
+
* its name, commands and history, and reconnecting the GitHub App repopulates
|
|
19
|
+
* the ID through the verified callback.
|
|
20
|
+
*
|
|
21
|
+
* Hand-written on purpose: this changes no schema, so the entity-diff
|
|
22
|
+
* generator (npm run generate-postgres-migration) produces nothing for it, and
|
|
23
|
+
* the schema-drift check is unaffected.
|
|
24
|
+
*
|
|
25
|
+
* WHAT THIS MIGRATION DELIBERATELY DOES NOT DO
|
|
26
|
+
*
|
|
27
|
+
* It does not clear Project.gitHubAppInstallationId. Every one of those was
|
|
28
|
+
* written by the old, unverified callback, but they are overwhelmingly
|
|
29
|
+
* legitimate and nulling them would disconnect every existing GitHub
|
|
30
|
+
* integration. There is also no way in SQL to tell a forged binding from a
|
|
31
|
+
* real one.
|
|
32
|
+
*
|
|
33
|
+
* Operators who want to audit for the callback-forgery path should look for
|
|
34
|
+
* one installation bound to several projects, which is the fingerprint (it is
|
|
35
|
+
* legal — an org can connect one installation to several projects — so review
|
|
36
|
+
* the results, do not delete them):
|
|
37
|
+
*
|
|
38
|
+
* SELECT "gitHubAppInstallationId", count(*), array_agg("_id")
|
|
39
|
+
* FROM "Project"
|
|
40
|
+
* WHERE "gitHubAppInstallationId" IS NOT NULL AND "deletedAt" IS NULL
|
|
41
|
+
* GROUP BY "gitHubAppInstallationId" HAVING count(*) > 1;
|
|
42
|
+
*/
|
|
43
|
+
export class QuarantineUnboundGitHubInstallations1786300000000
|
|
44
|
+
implements MigrationInterface
|
|
45
|
+
{
|
|
46
|
+
public name = "QuarantineUnboundGitHubInstallations1786300000000";
|
|
47
|
+
|
|
48
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
49
|
+
await queryRunner.query(`
|
|
50
|
+
UPDATE "CodeRepository" AS cr
|
|
51
|
+
SET "gitHubAppInstallationId" = NULL
|
|
52
|
+
FROM "Project" AS p
|
|
53
|
+
WHERE cr."projectId" = p."_id"
|
|
54
|
+
AND cr."gitHubAppInstallationId" IS NOT NULL
|
|
55
|
+
AND (
|
|
56
|
+
p."gitHubAppInstallationId" IS NULL
|
|
57
|
+
OR p."gitHubAppInstallationId" <> cr."gitHubAppInstallationId"
|
|
58
|
+
)
|
|
59
|
+
`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public async down(): Promise<void> {
|
|
63
|
+
/*
|
|
64
|
+
* Not reversible, and must not be. The quarantined values are exactly the
|
|
65
|
+
* bindings that could not be justified; restoring them would restore the
|
|
66
|
+
* vulnerability, and the rows carry no record of what was cleared.
|
|
67
|
+
*/
|
|
68
|
+
}
|
|
69
|
+
}
|
package/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
type ScryptHashExistsResult = {
|
|
4
|
+
exists: boolean;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export class AddMasterPasswordSalt1786400000000 implements MigrationInterface {
|
|
8
|
+
public name = "AddMasterPasswordSalt1786400000000";
|
|
9
|
+
|
|
10
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
11
|
+
await queryRunner.query(
|
|
12
|
+
`ALTER TABLE "StatusPage" ADD "masterPasswordSalt" character varying(100)`,
|
|
13
|
+
);
|
|
14
|
+
await queryRunner.query(
|
|
15
|
+
`ALTER TABLE "Dashboard" ADD "masterPasswordSalt" character varying(100)`,
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
20
|
+
const [dashboardResult] = (await queryRunner.query(
|
|
21
|
+
`SELECT EXISTS (SELECT 1 FROM "Dashboard" WHERE "masterPassword" LIKE 'scrypt$%') AS "exists"`,
|
|
22
|
+
)) as Array<ScryptHashExistsResult>;
|
|
23
|
+
const [statusPageResult] = (await queryRunner.query(
|
|
24
|
+
`SELECT EXISTS (SELECT 1 FROM "StatusPage" WHERE "masterPassword" LIKE 'scrypt$%') AS "exists"`,
|
|
25
|
+
)) as Array<ScryptHashExistsResult>;
|
|
26
|
+
|
|
27
|
+
if (dashboardResult?.exists || statusPageResult?.exists) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
"Cannot remove master-password salt columns while scrypt master-password hashes exist.",
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
await queryRunner.query(
|
|
34
|
+
`ALTER TABLE "Dashboard" DROP COLUMN "masterPasswordSalt"`,
|
|
35
|
+
);
|
|
36
|
+
await queryRunner.query(
|
|
37
|
+
`ALTER TABLE "StatusPage" DROP COLUMN "masterPasswordSalt"`,
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Generated with `npm run generate-postgres-migration` after adding
|
|
5
|
+
* AIRun.codeFixRecommendation. Existing rows fail closed as NotRecommended;
|
|
6
|
+
* incident/alert investigations move to Pending only in their atomic
|
|
7
|
+
* Completed transition, then settle through structured post-analysis
|
|
8
|
+
* classification.
|
|
9
|
+
*/
|
|
10
|
+
export class AddInvestigationCodeFixRecommendation1786500000000
|
|
11
|
+
implements MigrationInterface
|
|
12
|
+
{
|
|
13
|
+
public name = "AddInvestigationCodeFixRecommendation1786500000000";
|
|
14
|
+
|
|
15
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
16
|
+
await queryRunner.query(
|
|
17
|
+
`ALTER TABLE "AIRun" ADD "codeFixRecommendation" character varying(100) NOT NULL DEFAULT 'NotRecommended'`,
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
22
|
+
await queryRunner.query(
|
|
23
|
+
`ALTER TABLE "AIRun" DROP COLUMN "codeFixRecommendation"`,
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -499,6 +499,16 @@ import { AddStatusPageReportPeriod1785930709405 } from "./1785930709405-AddStatu
|
|
|
499
499
|
import { AddIncidentInvestigationGating1785790000000 } from "./1785790000000-AddIncidentInvestigationGating";
|
|
500
500
|
import { AddRemediationVerification1785768089408 } from "./1785768089408-AddRemediationVerification";
|
|
501
501
|
import { AddStatusPageMonitorRule1786005052769 } from "./1786005052769-AddStatusPageMonitorRule";
|
|
502
|
+
import { AddPerUserPasswordSalt1786018109307 } from "./1786018109307-AddPerUserPasswordSalt";
|
|
503
|
+
import { WidenHashedStringColumnsForScrypt1786023262402 } from "./1786023262402-WidenHashedStringColumnsForScrypt";
|
|
504
|
+
import { AddTimeRangeToLogSavedView1786096660558 } from "./1786096660558-AddTimeRangeToLogSavedView";
|
|
505
|
+
import { RestoreServiceLowerNameIndex1786100000000 } from "./1786100000000-RestoreServiceLowerNameIndex";
|
|
506
|
+
import { MigrationName1786101798351 } from "./1786101798351-MigrationName";
|
|
507
|
+
import { MigrationName1786105470826 } from "./1786105470826-MigrationName";
|
|
508
|
+
import { RestoreDroppedUniqueIndexes1786200000000 } from "./1786200000000-RestoreDroppedUniqueIndexes";
|
|
509
|
+
import { QuarantineUnboundGitHubInstallations1786300000000 } from "./1786300000000-QuarantineUnboundGitHubInstallations";
|
|
510
|
+
import { AddMasterPasswordSalt1786400000000 } from "./1786400000000-AddMasterPasswordSalt";
|
|
511
|
+
import { AddInvestigationCodeFixRecommendation1786500000000 } from "./1786500000000-AddInvestigationCodeFixRecommendation";
|
|
502
512
|
|
|
503
513
|
export default [
|
|
504
514
|
InitialMigration,
|
|
@@ -1002,4 +1012,14 @@ export default [
|
|
|
1002
1012
|
WidenInventoryResourceNameColumns1785930000000,
|
|
1003
1013
|
AddStatusPageReportPeriod1785930709405,
|
|
1004
1014
|
AddStatusPageMonitorRule1786005052769,
|
|
1015
|
+
AddPerUserPasswordSalt1786018109307,
|
|
1016
|
+
WidenHashedStringColumnsForScrypt1786023262402,
|
|
1017
|
+
AddTimeRangeToLogSavedView1786096660558,
|
|
1018
|
+
RestoreServiceLowerNameIndex1786100000000,
|
|
1019
|
+
RestoreDroppedUniqueIndexes1786200000000,
|
|
1020
|
+
QuarantineUnboundGitHubInstallations1786300000000,
|
|
1021
|
+
MigrationName1786101798351,
|
|
1022
|
+
AddMasterPasswordSalt1786400000000,
|
|
1023
|
+
MigrationName1786105470826,
|
|
1024
|
+
AddInvestigationCodeFixRecommendation1786500000000,
|
|
1005
1025
|
];
|
|
@@ -3,12 +3,17 @@ import ObjectID from "../../Types/ObjectID";
|
|
|
3
3
|
import OneUptimeDate from "../../Types/Date";
|
|
4
4
|
import AIRunStatus from "../../Types/AI/AIRunStatus";
|
|
5
5
|
import AIRunType from "../../Types/AI/AIRunType";
|
|
6
|
+
import AIRunCodeFixRecommendation from "../../Types/AI/AIRunCodeFixRecommendation";
|
|
6
7
|
import AIRunHumanVerdict from "../../Types/AI/AIRunHumanVerdict";
|
|
7
8
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
8
9
|
import CodeFixTaskType, {
|
|
9
10
|
CodeFixContextKind,
|
|
10
11
|
CodeFixTaskTypeHelper,
|
|
11
12
|
} from "../../Types/AI/CodeFixTaskType";
|
|
13
|
+
import {
|
|
14
|
+
getInvestigationCodeFixTaskSnapshot,
|
|
15
|
+
InvestigationCodeFixTaskContext,
|
|
16
|
+
} from "../../Types/AI/CodeFixTaskContext";
|
|
12
17
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
13
18
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
14
19
|
import CountBy from "../Types/Database/CountBy";
|
|
@@ -40,6 +45,7 @@ export interface AIRunTransitionSet {
|
|
|
40
45
|
llmCallCount?: number | undefined;
|
|
41
46
|
toolCallCount?: number | undefined;
|
|
42
47
|
totalTokens?: number | undefined;
|
|
48
|
+
codeFixRecommendation?: AIRunCodeFixRecommendation | undefined;
|
|
43
49
|
// The claiming agent's id as a string (ObjectID.toString()) — see above.
|
|
44
50
|
aiAgentId?: string | undefined;
|
|
45
51
|
}
|
|
@@ -52,8 +58,8 @@ export class Service extends DatabaseService<Model> {
|
|
|
52
58
|
/*
|
|
53
59
|
* A genuinely atomic status transition: one conditional UPDATE whose WHERE
|
|
54
60
|
* carries the expected current status (and optionally the expected
|
|
55
|
-
* attemptCount). Returns the number of rows changed —
|
|
56
|
-
* actor won the race.
|
|
61
|
+
* attemptCount / heartbeat snapshot). Returns the number of rows changed —
|
|
62
|
+
* 0 means another actor won the race or refreshed the heartbeat.
|
|
57
63
|
*
|
|
58
64
|
* This exists because updateOneBy is SELECT-then-save: two concurrent
|
|
59
65
|
* callers can both observe the precondition and both write, so it cannot
|
|
@@ -65,6 +71,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
65
71
|
aiRunId: ObjectID;
|
|
66
72
|
fromStatus: AIRunStatus;
|
|
67
73
|
expectedAttemptCount?: number | undefined;
|
|
74
|
+
expectedLastHeartbeatAt?: Date | undefined;
|
|
68
75
|
set: AIRunTransitionSet;
|
|
69
76
|
}): Promise<number> {
|
|
70
77
|
const queryBuilder: UpdateQueryBuilder<Model> = this.getRepository()
|
|
@@ -81,11 +88,57 @@ export class Service extends DatabaseService<Model> {
|
|
|
81
88
|
});
|
|
82
89
|
}
|
|
83
90
|
|
|
91
|
+
if (data.expectedLastHeartbeatAt !== undefined) {
|
|
92
|
+
queryBuilder.andWhere('"lastHeartbeatAt" = :expectedLastHeartbeatAt', {
|
|
93
|
+
expectedLastHeartbeatAt: data.expectedLastHeartbeatAt,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
84
97
|
const result: UpdateResult = await queryBuilder.execute();
|
|
85
98
|
|
|
86
99
|
return result.affected || 0;
|
|
87
100
|
}
|
|
88
101
|
|
|
102
|
+
/*
|
|
103
|
+
* Atomically settle the code-fix decision written as Pending by the
|
|
104
|
+
* winning investigation completion transition. The recommendation and
|
|
105
|
+
* immutable analysis snapshot are one database UPDATE guarded by both the
|
|
106
|
+
* run id and Pending state; a stale writer can never overwrite a decision
|
|
107
|
+
* another actor already settled.
|
|
108
|
+
*/
|
|
109
|
+
@CaptureSpan()
|
|
110
|
+
public async finalizeInvestigationCodeFixRecommendation(
|
|
111
|
+
data:
|
|
112
|
+
| {
|
|
113
|
+
aiRunId: ObjectID;
|
|
114
|
+
recommendation: AIRunCodeFixRecommendation.Recommended;
|
|
115
|
+
taskContext: InvestigationCodeFixTaskContext;
|
|
116
|
+
}
|
|
117
|
+
| {
|
|
118
|
+
aiRunId: ObjectID;
|
|
119
|
+
recommendation: AIRunCodeFixRecommendation.NotRecommended;
|
|
120
|
+
},
|
|
121
|
+
): Promise<number> {
|
|
122
|
+
const result: UpdateResult = await this.getRepository()
|
|
123
|
+
.createQueryBuilder()
|
|
124
|
+
.update(Model)
|
|
125
|
+
.set({
|
|
126
|
+
codeFixRecommendation: data.recommendation,
|
|
127
|
+
...(data.recommendation === AIRunCodeFixRecommendation.Recommended
|
|
128
|
+
? { taskContext: data.taskContext }
|
|
129
|
+
: {}),
|
|
130
|
+
} as QueryDeepPartialEntity<Model>)
|
|
131
|
+
.where('"_id" = :id', { id: data.aiRunId.toString() })
|
|
132
|
+
.andWhere('"status" = :status', { status: AIRunStatus.Completed })
|
|
133
|
+
.andWhere('"codeFixRecommendation" = :pending', {
|
|
134
|
+
pending: AIRunCodeFixRecommendation.Pending,
|
|
135
|
+
})
|
|
136
|
+
.andWhere('"deletedAt" IS NULL')
|
|
137
|
+
.execute();
|
|
138
|
+
|
|
139
|
+
return result.affected || 0;
|
|
140
|
+
}
|
|
141
|
+
|
|
89
142
|
/*
|
|
90
143
|
* Atomically claim the oldest Queued code-fix run for an external agent
|
|
91
144
|
* worker (the /ai-agent-task/get-pending-task route). The Queued -> Running
|
|
@@ -193,10 +246,22 @@ export class Service extends DatabaseService<Model> {
|
|
|
193
246
|
? null
|
|
194
247
|
: "Queued code-fix run has no telemetry exception to fix.";
|
|
195
248
|
} else if (contextKind === CodeFixContextKind.IncidentOrAlertSubject) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
249
|
+
if (!run.triggeredByIncidentId && !run.triggeredByAlertId) {
|
|
250
|
+
missingContextMessage =
|
|
251
|
+
"Queued code-fix run has no incident or alert subject.";
|
|
252
|
+
} else if (
|
|
253
|
+
run.codeFixTaskType === CodeFixTaskType.FixFromIncident &&
|
|
254
|
+
!getInvestigationCodeFixTaskSnapshot(run.taskContext)
|
|
255
|
+
) {
|
|
256
|
+
/*
|
|
257
|
+
* A subject alone is mutable context: a later investigation can post
|
|
258
|
+
* another RootCause before the worker starts. FixFromIncident must
|
|
259
|
+
* therefore carry the exact Recommended run + analysis it was
|
|
260
|
+
* authorized from. Contextless legacy rows fail closed.
|
|
261
|
+
*/
|
|
262
|
+
missingContextMessage =
|
|
263
|
+
"Queued FixFromIncident run has no complete pinned investigation analysis snapshot.";
|
|
264
|
+
}
|
|
200
265
|
} else if (
|
|
201
266
|
run.codeFixTaskType === CodeFixTaskType.ImproveLogging ||
|
|
202
267
|
run.codeFixTaskType === CodeFixTaskType.ImproveTracing
|
|
@@ -296,7 +361,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
296
361
|
|
|
297
362
|
/*
|
|
298
363
|
* Measurement layer (Phase 2): record a human's one-click verdict
|
|
299
|
-
* (Confirmed / Rejected) on
|
|
364
|
+
* (Confirmed / Rejected) on one exact COMPLETED investigation run for an
|
|
300
365
|
* incident or alert. Overwriting an existing verdict is deliberate — a
|
|
301
366
|
* user may change their mind; the verdict is per-run state, not an audit
|
|
302
367
|
* trail. Throws when no completed investigation exists for the subject.
|
|
@@ -305,7 +370,9 @@ export class Service extends DatabaseService<Model> {
|
|
|
305
370
|
* are system-authored, so the per-user privacy pin would hide them).
|
|
306
371
|
*/
|
|
307
372
|
@CaptureSpan()
|
|
308
|
-
public async
|
|
373
|
+
public async applyHumanVerdictToInvestigation(data: {
|
|
374
|
+
aiRunId: ObjectID;
|
|
375
|
+
projectId: ObjectID;
|
|
309
376
|
incidentId?: ObjectID | undefined;
|
|
310
377
|
alertId?: ObjectID | undefined;
|
|
311
378
|
verdict: AIRunHumanVerdict;
|
|
@@ -319,6 +386,8 @@ export class Service extends DatabaseService<Model> {
|
|
|
319
386
|
|
|
320
387
|
const run: Model | null = await this.findOneBy({
|
|
321
388
|
query: {
|
|
389
|
+
_id: data.aiRunId,
|
|
390
|
+
projectId: data.projectId,
|
|
322
391
|
runType: AIRunType.Investigation,
|
|
323
392
|
status: AIRunStatus.Completed,
|
|
324
393
|
...(data.incidentId
|
|
@@ -326,13 +395,12 @@ export class Service extends DatabaseService<Model> {
|
|
|
326
395
|
: { triggeredByAlertId: data.alertId! }),
|
|
327
396
|
},
|
|
328
397
|
select: { _id: true },
|
|
329
|
-
sort: { createdAt: SortOrder.Descending },
|
|
330
398
|
props: { isRoot: true },
|
|
331
399
|
});
|
|
332
400
|
|
|
333
401
|
if (!run || !run.id) {
|
|
334
402
|
throw new BadDataException(
|
|
335
|
-
"
|
|
403
|
+
"The selected completed AI investigation does not exist for this subject — refresh the page before recording a verdict.",
|
|
336
404
|
);
|
|
337
405
|
}
|
|
338
406
|
|