@oneuptime/common 13.0.6 → 13.0.7
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/AIAgentOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/AIAgentOwnerUser.ts +6 -0
- package/Models/DatabaseModels/Alert.ts +12 -0
- package/Models/DatabaseModels/AlertEpisodeOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/AlertEpisodeOwnerUser.ts +6 -1
- package/Models/DatabaseModels/AlertOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/AlertOwnerUser.ts +6 -1
- package/Models/DatabaseModels/CephClusterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/CephClusterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/CloudResourceOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/CloudResourceOwnerUser.ts +6 -0
- package/Models/DatabaseModels/DashboardOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/DashboardOwnerUser.ts +6 -1
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +8 -0
- package/Models/DatabaseModels/DockerHostOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/DockerHostOwnerUser.ts +6 -0
- package/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/DockerSwarmClusterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/HostOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/HostOwnerUser.ts +6 -0
- package/Models/DatabaseModels/Incident.ts +12 -0
- package/Models/DatabaseModels/IncidentEpisodeOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/IncidentEpisodeOwnerUser.ts +6 -1
- package/Models/DatabaseModels/IncidentOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/IncidentOwnerUser.ts +6 -1
- package/Models/DatabaseModels/IncidentTemplateOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/IncidentTemplateOwnerUser.ts +6 -0
- package/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/IncomingCallPolicyOwnerUser.ts +6 -1
- package/Models/DatabaseModels/IoTFleetOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/IoTFleetOwnerUser.ts +6 -0
- package/Models/DatabaseModels/KubernetesClusterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/KubernetesClusterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/Monitor.ts +2 -3
- package/Models/DatabaseModels/MonitorGroupOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/MonitorGroupOwnerUser.ts +6 -0
- package/Models/DatabaseModels/MonitorOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/MonitorOwnerUser.ts +6 -1
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -3
- package/Models/DatabaseModels/NetworkDeviceOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/NetworkDeviceOwnerUser.ts +6 -0
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.ts +6 -1
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.ts +6 -1
- package/Models/DatabaseModels/PodmanHostOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/PodmanHostOwnerUser.ts +6 -0
- package/Models/DatabaseModels/ProbeOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/ProbeOwnerUser.ts +6 -0
- package/Models/DatabaseModels/ProxmoxClusterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/ProxmoxClusterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/RumApplicationOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/RumApplicationOwnerUser.ts +6 -0
- package/Models/DatabaseModels/RunbookOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/RunbookOwnerUser.ts +6 -1
- package/Models/DatabaseModels/RunnerOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/RunnerOwnerUser.ts +6 -1
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.ts +6 -1
- package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.ts +8 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +8 -0
- package/Models/DatabaseModels/ServerlessFunctionOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/ServerlessFunctionOwnerUser.ts +6 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +6 -1
- package/Models/DatabaseModels/ServiceOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/ServiceOwnerUser.ts +6 -0
- package/Models/DatabaseModels/StatusPageOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/StatusPageOwnerUser.ts +6 -1
- package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/WorkflowOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/WorkflowOwnerUser.ts +6 -1
- package/Scripts/benchmark-fanin-capacity.js +2 -2
- package/Server/API/AIAgentDataAPI.ts +1 -1
- package/Server/API/AIChatAPI.ts +6 -4
- package/Server/API/AIInvestigationAPI.ts +7 -0
- package/Server/API/StatusPageAPI.ts +13 -0
- package/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.ts +1057 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Readme.md +6 -4
- package/Server/Middleware/IdentityRateLimit.ts +34 -1
- package/Server/Middleware/PublicDashboardRateLimit.ts +169 -39
- package/Server/Services/AlertEpisodeService.ts +13 -34
- package/Server/Services/AlertGroupingEngineService.ts +7 -4
- package/Server/Services/AlertService.ts +13 -32
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +18 -10
- package/Server/Services/DashboardOwnerRuleEngineService.ts +18 -10
- package/Server/Services/DatabaseService.ts +101 -1
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +18 -10
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/HostOwnerRuleEngineService.ts +18 -10
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +6 -4
- package/Server/Services/IncidentEpisodeService.ts +15 -75
- package/Server/Services/IncidentGroupingEngineService.ts +7 -4
- package/Server/Services/IncidentService.ts +13 -32
- package/Server/Services/IncidentTemplateService.ts +13 -36
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +18 -10
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +18 -10
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/MonitorService.ts +13 -32
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +18 -10
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +18 -10
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +18 -10
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +18 -10
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +18 -10
- package/Server/Services/RunbookOwnerRuleEngineService.ts +18 -10
- package/Server/Services/ScheduledMaintenanceService.ts +13 -34
- package/Server/Services/ScheduledMaintenanceTemplateService.ts +12 -34
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +18 -10
- package/Server/Services/ServiceOwnerRuleEngineService.ts +18 -10
- package/Server/Services/StatusPagePrivateUserService.ts +38 -29
- package/Server/Services/StatusPagePrivateUserSessionService.ts +49 -1
- package/Server/Services/StatusPageService.ts +59 -36
- package/Server/Services/UserSessionService.ts +6 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +18 -10
- package/Server/Static/Brand/README.md +7 -7
- package/Server/Static/Vendor/README.md +7 -7
- package/Server/Types/Database/Permissions/OwnedScopePermission.ts +18 -9
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +82 -0
- package/Server/Utils/AI/Chat/ChatAgentRunner.ts +21 -8
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +41 -4
- package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +1 -1
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +1 -1
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +13 -5
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +53 -13
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +51 -14
- package/Server/Utils/AI/SRE/InvestigationEligibility.ts +292 -0
- package/Server/Utils/AI/SRE/InvestigationQueue.ts +25 -0
- package/Server/Utils/AI/Toolbox/Index.ts +43 -13
- package/Server/Utils/AI/Toolbox/ResourceTools.ts +952 -0
- package/Server/Utils/AI/Toolbox/RumTools.ts +424 -0
- package/Server/Utils/AI/Toolbox/ToolTypes.ts +10 -0
- package/Server/Utils/AI/Toolbox/TraceTools.ts +2 -1
- package/Server/Utils/Database/PostgresErrorTranslator.ts +14 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +137 -126
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +4 -1
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +157 -6
- package/Server/Utils/Telemetry/TelemetryEntity.ts +205 -6
- package/SslCertificates/GlobalSign.crt +26 -0
- package/SslCertificates/Readme.md +3 -0
- package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +451 -0
- package/Tests/App/Dashboard/AIInsightsChatPanel.test.tsx +881 -0
- package/Tests/App/Dashboard/AIInsightsPageContext.test.ts +458 -0
- package/Tests/App/Dashboard/AIInsightsResourceCitations.test.ts +124 -0
- package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +798 -0
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +7 -0
- package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +104 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +156 -64
- package/Tests/App/Dashboard/DiscoveryScanStatusMessage.test.tsx +970 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +406 -12
- package/Tests/App/Dashboard/EmbeddedMetricEventScope.test.tsx +358 -0
- package/Tests/App/Dashboard/ErrorPatternEventScope.test.tsx +148 -0
- package/Tests/App/Dashboard/EventOverlayAdditionalResourceScope.test.ts +255 -0
- package/Tests/App/Dashboard/EventOverlayScope.test.ts +845 -0
- package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +903 -0
- package/Tests/App/Dashboard/ExternalStatusPageCriteriaFilter.test.ts +3 -3
- package/Tests/App/Dashboard/InvestigationDrawer.test.tsx +21 -0
- package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +761 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +7 -4
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +15 -7
- package/Tests/App/Dashboard/MetricsViewerEventScopeNavigation.test.tsx +264 -0
- package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +342 -0
- package/Tests/App/Dashboard/MonitorTestForm.test.tsx +612 -0
- package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +301 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +74 -2
- package/Tests/App/Dashboard/TextClampLayoutHarness.ts +224 -0
- package/Tests/Models/InventoryItemNaming.test.ts +54 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +161 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +14 -0
- package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +260 -0
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +133 -0
- package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +482 -0
- package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +1 -1
- package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +1 -1
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +38 -16
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +106 -31
- package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +46 -12
- package/Tests/Server/Infrastructure/Postgres/MonitorDescriptionMigration.test.ts +422 -0
- package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +1 -1
- package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +25 -4
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +72 -0
- package/Tests/Server/Middleware/PublicDashboardRateLimit.test.ts +12 -12
- package/Tests/Server/Middleware/PublicDashboardRateLimitStatusPage.test.ts +800 -0
- package/Tests/Server/Services/AIInvestigationDecisionPostgres.test.ts +346 -0
- package/Tests/Server/Services/AddOwnersIdempotency.test.ts +471 -0
- package/Tests/Server/Services/DatabaseServiceAutoOwnerOnCreate.test.ts +250 -0
- package/Tests/Server/Services/DatabaseServiceUniqueColumnsTogether.test.ts +622 -0
- package/Tests/Server/Services/MonitorDescriptionValidation.test.ts +211 -0
- package/Tests/Server/Services/MonitorTemplateDescriptionPropagation.test.ts +269 -0
- package/Tests/Server/Services/OwnerRowUniqueness.test.ts +504 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +43 -0
- package/Tests/Server/Services/SessionRetention.test.ts +334 -0
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +172 -0
- package/Tests/Server/Services/StatusPagePrivateUserReadAccess.test.ts +178 -0
- package/Tests/Server/Services/StatusPagePrivateUserReadAccessPostgres.test.ts +311 -0
- package/Tests/Server/Services/StatusPagePrivateUserSessionService.test.ts +216 -1
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +1 -1
- package/Tests/Server/Services/UserOnCallLogNoNotificationRules.test.ts +1 -1
- package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +626 -0
- package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +668 -0
- package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +1 -0
- package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +1 -1
- package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +16 -9
- package/Tests/Server/Utils/AI/ChatAgentRunner.test.ts +137 -1
- package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +697 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +105 -0
- package/Tests/Server/Utils/AI/RemediationHandoff.test.ts +16 -5
- package/Tests/Server/Utils/AI/ResourceTools.test.ts +1304 -0
- package/Tests/Server/Utils/AI/RumTools.test.ts +769 -0
- package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +63 -0
- package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaEvaluateOverTime.test.ts +11 -9
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +62 -45
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +25 -24
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaHumanMessages.test.ts +513 -0
- package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +2 -2
- package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +1 -1
- package/Tests/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.test.ts +9 -9
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +7 -5
- package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +2 -2
- package/Tests/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.test.ts +4 -3
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +2 -2
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +3 -2
- package/Tests/Server/Utils/Monitor/MonitorCriteriaHumanMessages.test.ts +529 -0
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +412 -4
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts +1 -1
- package/Tests/Server/Utils/TailwindBuildCopy.test.ts +14 -2
- package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +235 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +385 -2
- package/Tests/Server/Utils/VendorAssets.test.ts +17 -3
- package/Tests/Types/AI/AIChatPageContext.test.ts +0 -0
- package/Tests/Types/AI/AIResourceContext.test.ts +312 -0
- package/Tests/Types/Database/UniqueColumnsTogether.test.ts +100 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +4 -4
- package/Tests/Types/Monitor/MonitorStepRetryPersistence.test.ts +125 -0
- package/Tests/Types/WebsiteRequest.test.ts +44 -0
- package/Tests/UI/Components/Forms/MonitorDescriptionForm.test.tsx +410 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableReadPermissions.test.tsx +439 -0
- package/Tests/UI/Components/NavBarMenuSearch.test.tsx +372 -0
- package/Tests/UI/EsbuildConfig.test.ts +1 -1
- package/Tests/UI/Monitor/MonitorStepRetrySettings.test.tsx +616 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +4 -2
- package/Tests/UI/Rum/ReplayEngine.test.ts +179 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +23 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +88 -0
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +83 -0
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +33 -0
- package/Tests/Utils/API.test.ts +96 -0
- package/Tests/Utils/HTTPResponseBodyReader.test.ts +188 -1
- package/Tests/Utils/Metrics/MetricEventScopeUrl.test.ts +101 -0
- package/Tests/Utils/Monitor/MonitorTestAvailabilityUtil.test.ts +256 -0
- package/Tests/Utils/Telemetry/HostIpAddresses.test.ts +105 -0
- package/Types/AI/AIChatPageContext.ts +87 -2
- package/Types/AI/AIChatTypes.ts +4 -0
- package/Types/AI/AIResourceContext.ts +198 -0
- package/Types/AI/InvestigationNotStartedReason.ts +30 -0
- package/Types/Database/UniqueColumnsTogether.ts +55 -0
- package/Types/Metrics/MetricQueryConfigData.ts +8 -0
- package/Types/Rum/WebVitals.ts +71 -0
- package/Types/WebsiteRequest.ts +2 -0
- package/UI/Components/EditionLabel/EditionLabel.tsx +7 -5
- package/UI/Components/KeyboardShortcut/Screenshots/README.md +1 -1
- package/UI/Components/ModelTable/BaseModelTable.tsx +8 -0
- package/UI/Components/Navbar/NavBar.tsx +2 -0
- package/UI/Components/Navbar/NavBarMenuModal.tsx +6 -2
- package/UI/esbuild-config.js +4 -4
- package/Utils/API.ts +10 -1
- package/Utils/Dashboard/HtmlWidgetDocument.ts +1 -1
- package/Utils/HTTPResponseBodyReader.ts +64 -8
- package/Utils/Metrics/MetricExplorerUrl.ts +19 -0
- package/Utils/Monitor/MonitorTestAvailabilityUtil.ts +92 -0
- package/Utils/Telemetry/HostIpAddresses.ts +46 -2
- package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Alert.js +12 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +3 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/HostOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/HostOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +12 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +2 -3
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorGroupOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/MonitorGroupOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorGroupOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/MonitorGroupOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -3
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProbeOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/ProbeOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProbeOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/ProbeOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.js +6 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +6 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerUser.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +1 -1
- package/build/dist/Server/API/AIChatAPI.js +3 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +3 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +9 -1
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.js +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.js +602 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +22 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Middleware/PublicDashboardRateLimit.js +117 -36
- package/build/dist/Server/Middleware/PublicDashboardRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +13 -31
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +7 -4
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +13 -31
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +71 -1
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +6 -4
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +15 -68
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +7 -4
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +13 -31
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +13 -31
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +13 -31
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +13 -31
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +12 -29
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +33 -25
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js +36 -1
- package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +50 -35
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/UserSessionService.js +5 -0
- package/build/dist/Server/Services/UserSessionService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js +15 -10
- package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +82 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +12 -3
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +32 -4
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +8 -5
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +33 -13
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +31 -10
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +205 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +13 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +30 -6
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +721 -0
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/RumTools.js +330 -0
- package/build/dist/Server/Utils/AI/Toolbox/RumTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/ToolTypes.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js.map +1 -1
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +11 -0
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +106 -101
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +4 -2
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +94 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +171 -6
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Types/AI/AIChatPageContext.js +68 -2
- package/build/dist/Types/AI/AIChatPageContext.js.map +1 -1
- package/build/dist/Types/AI/AIChatTypes.js +4 -0
- package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
- package/build/dist/Types/AI/AIResourceContext.js +162 -0
- package/build/dist/Types/AI/AIResourceContext.js.map +1 -0
- package/build/dist/Types/AI/InvestigationNotStartedReason.js +2 -0
- package/build/dist/Types/AI/InvestigationNotStartedReason.js.map +1 -0
- package/build/dist/Types/Database/UniqueColumnsTogether.js +19 -0
- package/build/dist/Types/Database/UniqueColumnsTogether.js.map +1 -0
- package/build/dist/Types/Metrics/MetricQueryConfigData.js.map +1 -1
- package/build/dist/Types/Rum/WebVitals.js +64 -0
- package/build/dist/Types/Rum/WebVitals.js.map +1 -0
- package/build/dist/Types/WebsiteRequest.js +2 -0
- package/build/dist/Types/WebsiteRequest.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +7 -5
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +7 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +4 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/Utils/API.js +8 -4
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/HTTPResponseBodyReader.js +50 -6
- package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -1
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js +14 -3
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorTestAvailabilityUtil.js +68 -0
- package/build/dist/Utils/Monitor/MonitorTestAvailabilityUtil.js.map +1 -0
- package/build/dist/Utils/Telemetry/HostIpAddresses.js +42 -3
- package/build/dist/Utils/Telemetry/HostIpAddresses.js.map +1 -1
- package/package.json +5 -5
- package/test-setup.sh +2 -2
package/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
export class AddAIInvestigationDecision1793700000000
|
|
4
|
+
implements MigrationInterface
|
|
5
|
+
{
|
|
6
|
+
public name: string = "AddAIInvestigationDecision1793700000000";
|
|
7
|
+
|
|
8
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
9
|
+
await queryRunner.query(
|
|
10
|
+
`ALTER TABLE "Incident" ADD "aiInvestigationDecision" jsonb`,
|
|
11
|
+
);
|
|
12
|
+
await queryRunner.query(
|
|
13
|
+
`ALTER TABLE "Alert" ADD "aiInvestigationDecision" jsonb`,
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
18
|
+
await queryRunner.query(
|
|
19
|
+
`ALTER TABLE "Alert" DROP COLUMN "aiInvestigationDecision"`,
|
|
20
|
+
);
|
|
21
|
+
await queryRunner.query(
|
|
22
|
+
`ALTER TABLE "Incident" DROP COLUMN "aiInvestigationDecision"`,
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Generated with npm run generate-postgres-migration. Replace TypeORM's
|
|
5
|
+
* DROP/ADD pairs with equivalent in-place type changes to preserve existing
|
|
6
|
+
* descriptions. Rollback refuses values over 500 characters instead of
|
|
7
|
+
* silently truncating them.
|
|
8
|
+
*/
|
|
9
|
+
export class RemoveMonitorDescriptionLengthLimit1793800000000
|
|
10
|
+
implements MigrationInterface
|
|
11
|
+
{
|
|
12
|
+
public name: string = "RemoveMonitorDescriptionLengthLimit1793800000000";
|
|
13
|
+
|
|
14
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
15
|
+
await queryRunner.query(
|
|
16
|
+
`ALTER TABLE "MonitorTemplate" ALTER COLUMN "monitorDescription" TYPE text`,
|
|
17
|
+
);
|
|
18
|
+
await queryRunner.query(
|
|
19
|
+
`ALTER TABLE "Monitor" ALTER COLUMN "description" TYPE text`,
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
24
|
+
await queryRunner.query(
|
|
25
|
+
`ALTER TABLE "Monitor" ALTER COLUMN "description" TYPE character varying(500)`,
|
|
26
|
+
);
|
|
27
|
+
await queryRunner.query(
|
|
28
|
+
`ALTER TABLE "MonitorTemplate" ALTER COLUMN "monitorDescription" TYPE character varying(500)`,
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { AddAIInvestigationDecision1793700000000 } from "./1793700000000-AddAIInvestigationDecision";
|
|
2
|
+
import { RemoveMonitorDescriptionLengthLimit1793800000000 } from "./1793800000000-RemoveMonitorDescriptionLengthLimit";
|
|
1
3
|
import { AddConfigurableRuleCriteria1792500000000 } from "./1792500000000-AddConfigurableRuleCriteria";
|
|
2
4
|
import { AddGoogleSecOpsDiagnostics1792300000000 } from "./1792300000000-AddGoogleSecOpsDiagnostics";
|
|
3
5
|
import { AddIncomingCallPolicyPhoneNumbers1792600000000 } from "./1792600000000-AddIncomingCallPolicyPhoneNumbers";
|
|
@@ -9,6 +11,7 @@ import { SloProductOverhaul1793100000000 } from "./1793100000000-SloProductOverh
|
|
|
9
11
|
import { BackfillSloMonitorRulesAndAffectedResources1793200000000 } from "./1793200000000-BackfillSloMonitorRulesAndAffectedResources";
|
|
10
12
|
import { AddDataResidencyToProject1793300000000 } from "./1793300000000-AddDataResidencyToProject";
|
|
11
13
|
import { AddSubscriberUpdateNotificationStatus1793400000000 } from "./1793400000000-AddSubscriberUpdateNotificationStatus";
|
|
14
|
+
import { MakeOwnerRowsUnique1793500000000 } from "./1793500000000-MakeOwnerRowsUnique";
|
|
12
15
|
import { AddSloBurnRateRuleIncidents1792400000000 } from "./1792400000000-AddSloBurnRateRuleIncidents";
|
|
13
16
|
import { AddUserWebAuthnPurpose1792200000000 } from "./1792200000000-AddUserWebAuthnPurpose";
|
|
14
17
|
import InitialMigration from "./1717605043663-InitialMigration";
|
|
@@ -1194,4 +1197,7 @@ export default [
|
|
|
1194
1197
|
BackfillSloMonitorRulesAndAffectedResources1793200000000,
|
|
1195
1198
|
AddDataResidencyToProject1793300000000,
|
|
1196
1199
|
AddSubscriberUpdateNotificationStatus1793400000000,
|
|
1200
|
+
MakeOwnerRowsUnique1793500000000,
|
|
1201
|
+
AddAIInvestigationDecision1793700000000,
|
|
1202
|
+
RemoveMonitorDescriptionLengthLimit1793800000000,
|
|
1197
1203
|
];
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
To create a new migration
|
|
1
|
+
To create a new migration, run this from the repository root and then register
|
|
2
|
+
the generated class in `Index.ts` (import it and append it to the exported array):
|
|
2
3
|
|
|
3
4
|
```
|
|
4
|
-
|
|
5
|
+
npm run generate-postgres-migration
|
|
5
6
|
```
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
Registered migrations run when the app starts. To check that the registered
|
|
9
|
+
migrations match the models:
|
|
8
10
|
|
|
9
11
|
```
|
|
10
|
-
|
|
12
|
+
npm run check-postgres-schema-drift
|
|
11
13
|
```
|
|
@@ -14,7 +14,9 @@ import TooManyRequestsException from "../../Types/Exception/TooManyRequestsExcep
|
|
|
14
14
|
* Attempt limiting for the anonymous identity routes that accept a
|
|
15
15
|
* credential: POST /login, POST /verify-totp-auth, POST /verify-webauthn-auth
|
|
16
16
|
* and POST /verify-totp-enrolment
|
|
17
|
-
* (App/FeatureSet/Identity/API/Authentication.ts)
|
|
17
|
+
* (App/FeatureSet/Identity/API/Authentication.ts), and the status page
|
|
18
|
+
* private user POST /login
|
|
19
|
+
* (App/FeatureSet/Identity/API/StatusPageAuthentication.ts).
|
|
18
20
|
*
|
|
19
21
|
* WHY THESE ROUTES NEED IT
|
|
20
22
|
*
|
|
@@ -111,6 +113,14 @@ export enum IdentityRateLimitBucket {
|
|
|
111
113
|
/* POST /login. Password guessing. */
|
|
112
114
|
Login = "login",
|
|
113
115
|
|
|
116
|
+
/*
|
|
117
|
+
* POST /status-page/login -- a status page private user's password. The
|
|
118
|
+
* same guessing as /login against a different set of accounts, so its own
|
|
119
|
+
* counter: attempts against a status page login must not refuse dashboard
|
|
120
|
+
* sign-ins from the same address, or the other way round.
|
|
121
|
+
*/
|
|
122
|
+
StatusPageLogin = "status-page-login",
|
|
123
|
+
|
|
114
124
|
/*
|
|
115
125
|
* POST /verify-totp-auth, POST /verify-webauthn-auth and
|
|
116
126
|
* POST /verify-totp-enrolment -- the second step, reached with a valid
|
|
@@ -227,6 +237,25 @@ const LOGIN_BUCKET: BucketConfig = {
|
|
|
227
237
|
),
|
|
228
238
|
};
|
|
229
239
|
|
|
240
|
+
/*
|
|
241
|
+
* Status page private user password budget. The same numbers as the dashboard
|
|
242
|
+
* login for the same reasons, with its own settings.
|
|
243
|
+
*/
|
|
244
|
+
const STATUS_PAGE_LOGIN_BUCKET: BucketConfig = {
|
|
245
|
+
windowSeconds: parsePositiveIntFromEnv(
|
|
246
|
+
"IDENTITY_STATUS_PAGE_LOGIN_RATE_LIMIT_WINDOW_SECONDS",
|
|
247
|
+
15 * 60,
|
|
248
|
+
),
|
|
249
|
+
perAccountLimit: parsePositiveIntFromEnv(
|
|
250
|
+
"IDENTITY_STATUS_PAGE_LOGIN_RATE_LIMIT_PER_ACCOUNT_PER_WINDOW",
|
|
251
|
+
10,
|
|
252
|
+
),
|
|
253
|
+
perIpLimit: parsePositiveIntFromEnv(
|
|
254
|
+
"IDENTITY_STATUS_PAGE_LOGIN_RATE_LIMIT_PER_IP_PER_WINDOW",
|
|
255
|
+
150,
|
|
256
|
+
),
|
|
257
|
+
};
|
|
258
|
+
|
|
230
259
|
/*
|
|
231
260
|
* Second step budget.
|
|
232
261
|
*
|
|
@@ -541,6 +570,10 @@ export default class IdentityRateLimit {
|
|
|
541
570
|
return WEBAUTHN_CHALLENGE_BUCKET;
|
|
542
571
|
}
|
|
543
572
|
|
|
573
|
+
if (bucket === IdentityRateLimitBucket.StatusPageLogin) {
|
|
574
|
+
return STATUS_PAGE_LOGIN_BUCKET;
|
|
575
|
+
}
|
|
576
|
+
|
|
544
577
|
return LOGIN_BUCKET;
|
|
545
578
|
}
|
|
546
579
|
|
|
@@ -21,15 +21,23 @@ import TooManyRequestsException from "../../Types/Exception/TooManyRequestsExcep
|
|
|
21
21
|
* Why this exists: holding a public dashboard id was previously enough to
|
|
22
22
|
* drive unbounded ClickHouse and Postgres work — a 400-day SLO-style
|
|
23
23
|
* aggregation, or a metrics aggregation at the finest bucket interval,
|
|
24
|
-
* issued in a loop. /master-password was worse still: it verifies a
|
|
24
|
+
* issued in a loop. /master-password was worse still: it verifies a scrypt
|
|
25
25
|
* hash per request, so with no attempt limit it is an online
|
|
26
|
-
* password-guessing oracle that also burns a CPU-bound hash per
|
|
26
|
+
* password-guessing oracle that also burns a CPU- and memory-bound hash per
|
|
27
|
+
* guess.
|
|
27
28
|
*
|
|
28
29
|
* One limiter covers the whole surface rather than per-route budgets. The
|
|
29
30
|
* routes differ enormously in cost, but the thing being bounded is request
|
|
30
31
|
* volume from a single origin, and a uniform ceiling is the one an operator
|
|
31
32
|
* can reason about. Only /master-password gets its own, much tighter bucket,
|
|
32
33
|
* because it is the one route where the abuse is guessing rather than load.
|
|
34
|
+
*
|
|
35
|
+
* The status page master password route (/status-page-api/master-password,
|
|
36
|
+
* rewritten to /api/status-page) is the same oracle on a different surface,
|
|
37
|
+
* so it is served by this limiter too, on a bucket of its own. It shares the
|
|
38
|
+
* mechanics — two counters, trusted client address, fail closed — but not the
|
|
39
|
+
* counters themselves: its keys live under a separate prefix, so guesses
|
|
40
|
+
* against a status page neither spend nor draw on a dashboard's allowance.
|
|
33
41
|
*/
|
|
34
42
|
|
|
35
43
|
/*
|
|
@@ -50,6 +58,10 @@ import TooManyRequestsException from "../../Types/Exception/TooManyRequestsExcep
|
|
|
50
58
|
* allowance for free.
|
|
51
59
|
*/
|
|
52
60
|
export enum PublicDashboardRateLimitScope {
|
|
61
|
+
/*
|
|
62
|
+
* The per-resource counter: the dashboard, or the status page for the
|
|
63
|
+
* status page bucket.
|
|
64
|
+
*/
|
|
53
65
|
Dashboard = "dashboard",
|
|
54
66
|
Ip = "ip",
|
|
55
67
|
}
|
|
@@ -58,8 +70,14 @@ export enum PublicDashboardRateLimitBucket {
|
|
|
58
70
|
/* Every public dashboard read route. */
|
|
59
71
|
Read = "read",
|
|
60
72
|
|
|
61
|
-
/*
|
|
73
|
+
/*
|
|
74
|
+
* Dashboard /master-password only. Tighter, because each request costs a
|
|
75
|
+
* password hash.
|
|
76
|
+
*/
|
|
62
77
|
MasterPassword = "master-password",
|
|
78
|
+
|
|
79
|
+
/* Status page /master-password. Same budget shape, separate counters. */
|
|
80
|
+
StatusPageMasterPassword = "status-page-master-password",
|
|
63
81
|
}
|
|
64
82
|
|
|
65
83
|
export enum PublicDashboardRateLimitOutcome {
|
|
@@ -107,12 +125,59 @@ const parsePositiveIntFromEnv: (envKey: string, fallback: number) => number = (
|
|
|
107
125
|
return parsedValue;
|
|
108
126
|
};
|
|
109
127
|
|
|
128
|
+
/*
|
|
129
|
+
* A public surface the limiter serves. Everything that differs between the
|
|
130
|
+
* dashboard and status page routes lives here, so the counting and decision
|
|
131
|
+
* logic below stays one implementation.
|
|
132
|
+
*/
|
|
133
|
+
interface RateLimitedSurface {
|
|
134
|
+
/*
|
|
135
|
+
* Redis namespace. One per surface, so the two never share a counter and a
|
|
136
|
+
* SCAN for one surface's keys never shows the other's.
|
|
137
|
+
*/
|
|
138
|
+
keyPrefix: string;
|
|
139
|
+
|
|
140
|
+
/* Marks the per-resource counter in the key. */
|
|
141
|
+
resourceKeyTag: string;
|
|
142
|
+
|
|
143
|
+
/* What the per-resource counter is called in log lines. */
|
|
144
|
+
resourceLabel: string;
|
|
145
|
+
|
|
146
|
+
/* The resource this request is about, as a bounded key segment. */
|
|
147
|
+
resolveResourceKey: (req: ExpressRequest) => string;
|
|
148
|
+
}
|
|
149
|
+
|
|
110
150
|
interface BucketConfig {
|
|
111
151
|
windowSeconds: number;
|
|
112
|
-
|
|
152
|
+
perResourceLimit: number;
|
|
113
153
|
perIpLimit: number;
|
|
154
|
+
surface: RateLimitedSurface;
|
|
155
|
+
|
|
156
|
+
/*
|
|
157
|
+
* An authentication attempt counter rather than a load control: refuses
|
|
158
|
+
* when the counter is unavailable, and says "password" when it rejects.
|
|
159
|
+
*/
|
|
160
|
+
isPasswordAttempt: boolean;
|
|
114
161
|
}
|
|
115
162
|
|
|
163
|
+
const DASHBOARD_SURFACE: RateLimitedSurface = {
|
|
164
|
+
keyPrefix: "pdash:rl:",
|
|
165
|
+
resourceKeyTag: "d",
|
|
166
|
+
resourceLabel: "dashboard",
|
|
167
|
+
resolveResourceKey: (req: ExpressRequest): string => {
|
|
168
|
+
return PublicDashboardRateLimit.resolveDashboardKey(req);
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
const STATUS_PAGE_SURFACE: RateLimitedSurface = {
|
|
173
|
+
keyPrefix: "pspage:rl:",
|
|
174
|
+
resourceKeyTag: "s",
|
|
175
|
+
resourceLabel: "status page",
|
|
176
|
+
resolveResourceKey: (req: ExpressRequest): string => {
|
|
177
|
+
return PublicDashboardRateLimit.resolveStatusPageKey(req);
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
|
|
116
181
|
/*
|
|
117
182
|
* Read budget.
|
|
118
183
|
*
|
|
@@ -135,7 +200,7 @@ const READ_BUCKET: BucketConfig = {
|
|
|
135
200
|
"PUBLIC_DASHBOARD_RATE_LIMIT_WINDOW_SECONDS",
|
|
136
201
|
60,
|
|
137
202
|
),
|
|
138
|
-
|
|
203
|
+
perResourceLimit: parsePositiveIntFromEnv(
|
|
139
204
|
"PUBLIC_DASHBOARD_RATE_LIMIT_PER_DASHBOARD_PER_WINDOW",
|
|
140
205
|
600,
|
|
141
206
|
),
|
|
@@ -143,21 +208,23 @@ const READ_BUCKET: BucketConfig = {
|
|
|
143
208
|
"PUBLIC_DASHBOARD_RATE_LIMIT_PER_IP_PER_WINDOW",
|
|
144
209
|
1800,
|
|
145
210
|
),
|
|
211
|
+
surface: DASHBOARD_SURFACE,
|
|
212
|
+
isPasswordAttempt: false,
|
|
146
213
|
};
|
|
147
214
|
|
|
148
215
|
/*
|
|
149
216
|
* Master password budget. This is an authentication attempt counter, not a
|
|
150
217
|
* load control, so it is sized for humans rather than for load: 15 tries per
|
|
151
218
|
* 15 minutes covers a team behind one office address each mistyping a shared
|
|
152
|
-
* password, and still takes guessing from
|
|
153
|
-
*
|
|
219
|
+
* password, and still takes guessing from as fast as the process can hash
|
|
220
|
+
* down to one a minute.
|
|
154
221
|
*/
|
|
155
222
|
const MASTER_PASSWORD_BUCKET: BucketConfig = {
|
|
156
223
|
windowSeconds: parsePositiveIntFromEnv(
|
|
157
224
|
"PUBLIC_DASHBOARD_MASTER_PASSWORD_RATE_LIMIT_WINDOW_SECONDS",
|
|
158
225
|
15 * 60,
|
|
159
226
|
),
|
|
160
|
-
|
|
227
|
+
perResourceLimit: parsePositiveIntFromEnv(
|
|
161
228
|
"PUBLIC_DASHBOARD_MASTER_PASSWORD_RATE_LIMIT_PER_DASHBOARD_PER_WINDOW",
|
|
162
229
|
15,
|
|
163
230
|
),
|
|
@@ -165,9 +232,31 @@ const MASTER_PASSWORD_BUCKET: BucketConfig = {
|
|
|
165
232
|
"PUBLIC_DASHBOARD_MASTER_PASSWORD_RATE_LIMIT_PER_IP_PER_WINDOW",
|
|
166
233
|
45,
|
|
167
234
|
),
|
|
235
|
+
surface: DASHBOARD_SURFACE,
|
|
236
|
+
isPasswordAttempt: true,
|
|
168
237
|
};
|
|
169
238
|
|
|
170
|
-
|
|
239
|
+
/*
|
|
240
|
+
* Status page master password budget. Same reasoning and the same defaults as
|
|
241
|
+
* the dashboard one, with its own settings so an operator can tune one
|
|
242
|
+
* surface without touching the other.
|
|
243
|
+
*/
|
|
244
|
+
const STATUS_PAGE_MASTER_PASSWORD_BUCKET: BucketConfig = {
|
|
245
|
+
windowSeconds: parsePositiveIntFromEnv(
|
|
246
|
+
"STATUS_PAGE_MASTER_PASSWORD_RATE_LIMIT_WINDOW_SECONDS",
|
|
247
|
+
15 * 60,
|
|
248
|
+
),
|
|
249
|
+
perResourceLimit: parsePositiveIntFromEnv(
|
|
250
|
+
"STATUS_PAGE_MASTER_PASSWORD_RATE_LIMIT_PER_STATUS_PAGE_PER_WINDOW",
|
|
251
|
+
15,
|
|
252
|
+
),
|
|
253
|
+
perIpLimit: parsePositiveIntFromEnv(
|
|
254
|
+
"STATUS_PAGE_MASTER_PASSWORD_RATE_LIMIT_PER_IP_PER_WINDOW",
|
|
255
|
+
45,
|
|
256
|
+
),
|
|
257
|
+
surface: STATUS_PAGE_SURFACE,
|
|
258
|
+
isPasswordAttempt: true,
|
|
259
|
+
};
|
|
171
260
|
|
|
172
261
|
/*
|
|
173
262
|
* Counter keys outlive their window by one full window, so a request landing
|
|
@@ -276,6 +365,30 @@ export default class PublicDashboardRateLimit {
|
|
|
276
365
|
return "invalid";
|
|
277
366
|
}
|
|
278
367
|
|
|
368
|
+
/*
|
|
369
|
+
* The status page this request is about, as a key segment.
|
|
370
|
+
*
|
|
371
|
+
* The status page master password route names it only by :statusPageId,
|
|
372
|
+
* and a value that is not an id cannot match a status page, so there is no
|
|
373
|
+
* domain form here: everything else shares the one "invalid" bucket, which
|
|
374
|
+
* bounds Redis memory against junk path segments.
|
|
375
|
+
*/
|
|
376
|
+
public static resolveStatusPageKey(req: ExpressRequest): string {
|
|
377
|
+
const raw: unknown = req.params?.["statusPageId"];
|
|
378
|
+
|
|
379
|
+
if (typeof raw !== "string" || raw.trim().length === 0) {
|
|
380
|
+
return "none";
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
const value: string = raw.trim();
|
|
384
|
+
|
|
385
|
+
if (ObjectID.isValidUUID(value)) {
|
|
386
|
+
return `id:${value.toLowerCase()}`;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
return "invalid";
|
|
390
|
+
}
|
|
391
|
+
|
|
279
392
|
private static sanitizeKeySegment(value: string): string {
|
|
280
393
|
return (
|
|
281
394
|
value
|
|
@@ -291,9 +404,14 @@ export default class PublicDashboardRateLimit {
|
|
|
291
404
|
private static getBucketConfig(
|
|
292
405
|
bucket: PublicDashboardRateLimitBucket,
|
|
293
406
|
): BucketConfig {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
407
|
+
switch (bucket) {
|
|
408
|
+
case PublicDashboardRateLimitBucket.MasterPassword:
|
|
409
|
+
return MASTER_PASSWORD_BUCKET;
|
|
410
|
+
case PublicDashboardRateLimitBucket.StatusPageMasterPassword:
|
|
411
|
+
return STATUS_PAGE_MASTER_PASSWORD_BUCKET;
|
|
412
|
+
default:
|
|
413
|
+
return READ_BUCKET;
|
|
414
|
+
}
|
|
297
415
|
}
|
|
298
416
|
|
|
299
417
|
/*
|
|
@@ -304,7 +422,8 @@ export default class PublicDashboardRateLimit {
|
|
|
304
422
|
* created a key.
|
|
305
423
|
*/
|
|
306
424
|
public static async consume(data: {
|
|
307
|
-
|
|
425
|
+
/* From resolveDashboardKey or resolveStatusPageKey, to match the bucket. */
|
|
426
|
+
resourceKey: string;
|
|
308
427
|
clientIp: string;
|
|
309
428
|
bucket: PublicDashboardRateLimitBucket;
|
|
310
429
|
}): Promise<PublicDashboardRateLimitDecision> {
|
|
@@ -321,14 +440,16 @@ export default class PublicDashboardRateLimit {
|
|
|
321
440
|
const windowMs: number = config.windowSeconds * 1000;
|
|
322
441
|
const windowIndex: number = Math.floor(Date.now() / windowMs);
|
|
323
442
|
|
|
324
|
-
const
|
|
325
|
-
|
|
443
|
+
const surface: RateLimitedSurface = config.surface;
|
|
444
|
+
|
|
445
|
+
const resourceCounterKey: string = `${surface.keyPrefix}${data.bucket}:${surface.resourceKeyTag}:${data.resourceKey}:${data.clientIp}:${windowIndex}`;
|
|
446
|
+
const ipCounterKey: string = `${surface.keyPrefix}${data.bucket}:i:${data.clientIp}:${windowIndex}`;
|
|
326
447
|
|
|
327
448
|
try {
|
|
328
449
|
const pipelineResults: Array<[Error | null, unknown]> | null =
|
|
329
450
|
(await client
|
|
330
451
|
.pipeline()
|
|
331
|
-
.incr(
|
|
452
|
+
.incr(resourceCounterKey)
|
|
332
453
|
.incr(ipCounterKey)
|
|
333
454
|
.exec()) as Array<[Error | null, unknown]> | null;
|
|
334
455
|
|
|
@@ -336,7 +457,7 @@ export default class PublicDashboardRateLimit {
|
|
|
336
457
|
throw new Error("Rate limit pipeline returned no result");
|
|
337
458
|
}
|
|
338
459
|
|
|
339
|
-
const
|
|
460
|
+
const resourceCount: number = PublicDashboardRateLimit.readCounterResult(
|
|
340
461
|
pipelineResults[0],
|
|
341
462
|
);
|
|
342
463
|
const ipCount: number = PublicDashboardRateLimit.readCounterResult(
|
|
@@ -352,8 +473,8 @@ export default class PublicDashboardRateLimit {
|
|
|
352
473
|
const ttlSeconds: number = config.windowSeconds * TTL_MULTIPLIER;
|
|
353
474
|
const keysToExpire: Array<string> = [];
|
|
354
475
|
|
|
355
|
-
if (
|
|
356
|
-
keysToExpire.push(
|
|
476
|
+
if (resourceCount === 1) {
|
|
477
|
+
keysToExpire.push(resourceCounterKey);
|
|
357
478
|
}
|
|
358
479
|
|
|
359
480
|
if (ipCount === 1) {
|
|
@@ -375,17 +496,17 @@ export default class PublicDashboardRateLimit {
|
|
|
375
496
|
PublicDashboardRateLimit.getSecondsUntilWindowEnd(config.windowSeconds);
|
|
376
497
|
|
|
377
498
|
/*
|
|
378
|
-
*
|
|
379
|
-
* the more specific of the two and the more useful thing
|
|
380
|
-
* line.
|
|
499
|
+
* The per-resource counter is reported first when both are over,
|
|
500
|
+
* because it is the more specific of the two and the more useful thing
|
|
501
|
+
* to see in a log line.
|
|
381
502
|
*/
|
|
382
|
-
if (
|
|
503
|
+
if (resourceCount > config.perResourceLimit) {
|
|
383
504
|
return {
|
|
384
505
|
outcome: PublicDashboardRateLimitOutcome.RateLimited,
|
|
385
506
|
retryAfterSeconds,
|
|
386
507
|
scope: PublicDashboardRateLimitScope.Dashboard,
|
|
387
508
|
isFirstRejectionInWindow:
|
|
388
|
-
|
|
509
|
+
resourceCount === config.perResourceLimit + 1,
|
|
389
510
|
};
|
|
390
511
|
}
|
|
391
512
|
|
|
@@ -407,7 +528,7 @@ export default class PublicDashboardRateLimit {
|
|
|
407
528
|
*/
|
|
408
529
|
if (PublicDashboardRateLimit.shouldLogCounterUnavailable(data.bucket)) {
|
|
409
530
|
logger.warn(
|
|
410
|
-
`PublicDashboardRateLimit: counter failed for ${data.
|
|
531
|
+
`PublicDashboardRateLimit: counter failed for ${config.surface.resourceLabel} ${data.resourceKey}`,
|
|
411
532
|
);
|
|
412
533
|
logger.warn(err);
|
|
413
534
|
}
|
|
@@ -450,8 +571,9 @@ export default class PublicDashboardRateLimit {
|
|
|
450
571
|
|
|
451
572
|
/*
|
|
452
573
|
* Express middleware. Registered ahead of UserMiddleware on every public
|
|
453
|
-
* dashboard route
|
|
454
|
-
* let alone a database
|
|
574
|
+
* dashboard route, and on the status page master password route, so a
|
|
575
|
+
* flood is rejected before it costs a session lookup, let alone a database
|
|
576
|
+
* read or a password hash.
|
|
455
577
|
*/
|
|
456
578
|
public static getMiddleware(
|
|
457
579
|
bucket: PublicDashboardRateLimitBucket = PublicDashboardRateLimitBucket.Read,
|
|
@@ -465,13 +587,14 @@ export default class PublicDashboardRateLimit {
|
|
|
465
587
|
res: ExpressResponse,
|
|
466
588
|
next: NextFunction,
|
|
467
589
|
): Promise<void> => {
|
|
468
|
-
const
|
|
469
|
-
PublicDashboardRateLimit.
|
|
590
|
+
const config: BucketConfig =
|
|
591
|
+
PublicDashboardRateLimit.getBucketConfig(bucket);
|
|
592
|
+
const resourceKey: string = config.surface.resolveResourceKey(req);
|
|
470
593
|
const clientIp: string = PublicDashboardRateLimit.resolveClientIp(req);
|
|
471
594
|
|
|
472
595
|
const decision: PublicDashboardRateLimitDecision =
|
|
473
596
|
await PublicDashboardRateLimit.consume({
|
|
474
|
-
|
|
597
|
+
resourceKey,
|
|
475
598
|
clientIp,
|
|
476
599
|
bucket,
|
|
477
600
|
});
|
|
@@ -485,8 +608,13 @@ export default class PublicDashboardRateLimit {
|
|
|
485
608
|
}
|
|
486
609
|
|
|
487
610
|
if (decision.isFirstRejectionInWindow) {
|
|
611
|
+
const scopeLabel: string =
|
|
612
|
+
decision.scope === PublicDashboardRateLimitScope.Ip
|
|
613
|
+
? "ip"
|
|
614
|
+
: config.surface.resourceLabel;
|
|
615
|
+
|
|
488
616
|
logger.warn(
|
|
489
|
-
`PublicDashboardRateLimit: rejected ${bucket} request for ${
|
|
617
|
+
`PublicDashboardRateLimit: rejected ${bucket} request for ${config.surface.resourceLabel} ${resourceKey} from ${clientIp} (${scopeLabel} limit)`,
|
|
490
618
|
);
|
|
491
619
|
}
|
|
492
620
|
|
|
@@ -494,7 +622,7 @@ export default class PublicDashboardRateLimit {
|
|
|
494
622
|
req,
|
|
495
623
|
res,
|
|
496
624
|
new TooManyRequestsException(
|
|
497
|
-
|
|
625
|
+
config.isPasswordAttempt
|
|
498
626
|
? "Too many password attempts. Please try again later."
|
|
499
627
|
: "Too many requests. Please try again later.",
|
|
500
628
|
),
|
|
@@ -505,7 +633,8 @@ export default class PublicDashboardRateLimit {
|
|
|
505
633
|
decision.outcome === PublicDashboardRateLimitOutcome.CounterUnavailable
|
|
506
634
|
) {
|
|
507
635
|
/*
|
|
508
|
-
* The
|
|
636
|
+
* The read and password buckets fail in opposite directions, on
|
|
637
|
+
* purpose.
|
|
509
638
|
*
|
|
510
639
|
* Reads fail OPEN. These are unauthenticated read-only endpoints and
|
|
511
640
|
* the counter is a load control; blacking out every customer's public
|
|
@@ -513,15 +642,16 @@ export default class PublicDashboardRateLimit {
|
|
|
513
642
|
* unbounded window for the duration of that blip, which is itself
|
|
514
643
|
* alarmed on.
|
|
515
644
|
*
|
|
516
|
-
* /master-password
|
|
517
|
-
* control, it is the only thing
|
|
518
|
-
* the endpoint without it means
|
|
519
|
-
* so we answer 503 and let the
|
|
645
|
+
* /master-password (dashboard and status page alike) fails CLOSED.
|
|
646
|
+
* There the counter is not a load control, it is the only thing
|
|
647
|
+
* bounding password guesses. Serving the endpoint without it means
|
|
648
|
+
* serving an unlimited guessing oracle, so we answer 503 and let the
|
|
649
|
+
* viewer retry when Redis is back.
|
|
520
650
|
*/
|
|
521
|
-
if (
|
|
651
|
+
if (config.isPasswordAttempt) {
|
|
522
652
|
if (PublicDashboardRateLimit.shouldLogCounterUnavailable(bucket)) {
|
|
523
653
|
logger.error(
|
|
524
|
-
`PublicDashboardRateLimit: rate limit counter unavailable, refusing master password attempts for ${
|
|
654
|
+
`PublicDashboardRateLimit: rate limit counter unavailable, refusing master password attempts for ${config.surface.resourceLabel} ${resourceKey}`,
|
|
525
655
|
);
|
|
526
656
|
}
|
|
527
657
|
|
|
@@ -47,8 +47,8 @@ import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
|
47
47
|
import NotificationRuleWorkspaceChannel from "../../Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel";
|
|
48
48
|
import WorkspaceType from "../../Types/Workspace/WorkspaceType";
|
|
49
49
|
import AlertEpisodeWorkspaceMessages from "../Utils/Workspace/WorkspaceMessages/AlertEpisode";
|
|
50
|
+
import OwnerRuleAssignment from "../Utils/Rules/OwnerRuleAssignment";
|
|
50
51
|
import { MessageBlocksByWorkspaceType } from "./WorkspaceNotificationRuleService";
|
|
51
|
-
import Typeof from "../../Types/Typeof";
|
|
52
52
|
import AlertService from "./AlertService";
|
|
53
53
|
import OnCallDutyPolicyService from "./OnCallDutyPolicyService";
|
|
54
54
|
import AlertEpisodeLabelRuleEngineService from "./AlertEpisodeLabelRuleEngineService";
|
|
@@ -1277,39 +1277,18 @@ export class Service extends DatabaseService<Model> {
|
|
|
1277
1277
|
notifyOwners: boolean,
|
|
1278
1278
|
props: DatabaseCommonInteractionProps,
|
|
1279
1279
|
): Promise<void> {
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
data: teamOwner,
|
|
1293
|
-
props: props,
|
|
1294
|
-
});
|
|
1295
|
-
}
|
|
1296
|
-
|
|
1297
|
-
for (let userId of userIds) {
|
|
1298
|
-
if (typeof userId === Typeof.String) {
|
|
1299
|
-
userId = new ObjectID(userId.toString());
|
|
1300
|
-
}
|
|
1301
|
-
|
|
1302
|
-
const userOwner: AlertEpisodeOwnerUser = new AlertEpisodeOwnerUser();
|
|
1303
|
-
userOwner.alertEpisodeId = episodeId;
|
|
1304
|
-
userOwner.projectId = projectId;
|
|
1305
|
-
userOwner.userId = userId;
|
|
1306
|
-
userOwner.isOwnerNotified = !notifyOwners;
|
|
1307
|
-
|
|
1308
|
-
await AlertEpisodeOwnerUserService.create({
|
|
1309
|
-
data: userOwner,
|
|
1310
|
-
props: props,
|
|
1311
|
-
});
|
|
1312
|
-
}
|
|
1280
|
+
// Owners already on the episode are skipped, not added a second time.
|
|
1281
|
+
await OwnerRuleAssignment.addOwners({
|
|
1282
|
+
ownerUserService: AlertEpisodeOwnerUserService,
|
|
1283
|
+
ownerTeamService: AlertEpisodeOwnerTeamService,
|
|
1284
|
+
resourceIdColumn: "alertEpisodeId",
|
|
1285
|
+
resourceId: episodeId,
|
|
1286
|
+
projectId: projectId,
|
|
1287
|
+
userIds: userIds,
|
|
1288
|
+
teamIds: teamIds,
|
|
1289
|
+
isOwnerNotified: !notifyOwners,
|
|
1290
|
+
props: props,
|
|
1291
|
+
});
|
|
1313
1292
|
}
|
|
1314
1293
|
}
|
|
1315
1294
|
|
|
@@ -12,6 +12,7 @@ import Monitor from "../../Models/DatabaseModels/Monitor";
|
|
|
12
12
|
import AlertSeverity from "../../Models/DatabaseModels/AlertSeverity";
|
|
13
13
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
14
14
|
import logger, { LogAttributes } from "../Utils/Logger";
|
|
15
|
+
import OwnerRuleAssignment from "../Utils/Rules/OwnerRuleAssignment";
|
|
15
16
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
16
17
|
import OneUptimeDate from "../../Types/Date";
|
|
17
18
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
@@ -846,8 +847,9 @@ class AlertGroupingEngineServiceClass {
|
|
|
846
847
|
ownerUser.projectId = alert.projectId!;
|
|
847
848
|
ownerUser.alertEpisodeId = createdEpisode.id;
|
|
848
849
|
ownerUser.userId = user.id;
|
|
849
|
-
await
|
|
850
|
-
|
|
850
|
+
await OwnerRuleAssignment.createOwner({
|
|
851
|
+
ownerService: AlertEpisodeOwnerUserService,
|
|
852
|
+
owner: ownerUser,
|
|
851
853
|
props: {
|
|
852
854
|
isRoot: true,
|
|
853
855
|
},
|
|
@@ -877,8 +879,9 @@ class AlertGroupingEngineServiceClass {
|
|
|
877
879
|
ownerTeam.projectId = alert.projectId!;
|
|
878
880
|
ownerTeam.alertEpisodeId = createdEpisode.id;
|
|
879
881
|
ownerTeam.teamId = team.id;
|
|
880
|
-
await
|
|
881
|
-
|
|
882
|
+
await OwnerRuleAssignment.createOwner({
|
|
883
|
+
ownerService: AlertEpisodeOwnerTeamService,
|
|
884
|
+
owner: ownerTeam,
|
|
882
885
|
props: {
|
|
883
886
|
isRoot: true,
|
|
884
887
|
},
|