@oneuptime/common 13.0.6 → 13.0.8
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/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -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/ProjectOnCallCalendarFeed.ts +1 -1
- 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/UserOnCallCalendarFeed.ts +1 -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/AIBillingAPI.ts +1 -0
- package/Server/API/AIChatAPI.ts +6 -4
- package/Server/API/AIInsightAPI.ts +1 -4
- package/Server/API/AIInvestigationAPI.ts +8 -4
- package/Server/API/AIReadinessAPI.ts +4 -5
- package/Server/API/AlertAPI.ts +1 -0
- package/Server/API/AutoRemediationAPI.ts +1 -4
- package/Server/API/BaseAPI.ts +13 -0
- package/Server/API/BaseAnalyticsAPI.ts +80 -9
- package/Server/API/BillingAPI.ts +2 -0
- package/Server/API/BillingInvoiceAPI.ts +1 -0
- package/Server/API/BillingPaymentMethodAPI.ts +2 -0
- package/Server/API/CodeFixRunAPI.ts +1 -3
- package/Server/API/CommonAPI.ts +68 -4
- package/Server/API/DashboardAPI.ts +12 -12
- package/Server/API/GlobalConfigAPI.ts +17 -0
- package/Server/API/IncidentAPI.ts +2 -0
- package/Server/API/IncidentEpisodeAPI.ts +1 -0
- package/Server/API/NotificationAPI.ts +1 -0
- package/Server/API/OnCallCalendarAPI.ts +4 -5
- package/Server/API/OnCallDutyPolicyAPI.ts +7 -0
- package/Server/API/OnCallReadinessAPI.ts +4 -1
- package/Server/API/OnCallScheduleTimelineAPI.ts +731 -0
- package/Server/API/ProjectAPI.ts +1 -0
- package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
- package/Server/API/StatusPageAPI.ts +174 -32
- package/Server/API/TeamMemberAPI.ts +3 -0
- package/Server/API/UserCallAPI.ts +2 -0
- package/Server/API/UserEmailAPI.ts +2 -0
- package/Server/API/UserIncomingCallNumberAPI.ts +2 -0
- package/Server/API/UserMicrosoftTeamsAPI.ts +1 -0
- package/Server/API/UserSlackAPI.ts +1 -0
- package/Server/API/UserSmsAPI.ts +2 -0
- package/Server/API/UserTotpAuthAPI.ts +1 -0
- package/Server/API/UserWebAuthnAPI.ts +2 -0
- package/Server/API/UserWebhookAPI.ts +1 -0
- package/Server/API/UserWhatsAppAPI.ts +2 -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/MasterAdminAuthorization.ts +13 -2
- package/Server/Middleware/PublicDashboardRateLimit.ts +169 -39
- package/Server/Middleware/UserAuthorization.ts +79 -5
- package/Server/Services/AlertEpisodeService.ts +13 -34
- package/Server/Services/AlertGroupingEngineService.ts +7 -4
- package/Server/Services/AlertService.ts +13 -32
- package/Server/Services/ApiKeyPermissionService.ts +101 -4
- 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 +346 -1
- package/Server/Services/DetectionRuleService.ts +5 -4
- 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/OnCallDutyPolicyChildService.ts +261 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +18 -10
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +18 -10
- package/Server/Services/PayAsYouGoBillingService.ts +23 -28
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +18 -10
- package/Server/Services/ProjectService.ts +18 -0
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +18 -10
- package/Server/Services/RumSessionPinService.ts +274 -22
- 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/TeamPermissionService.ts +120 -26
- package/Server/Services/ThreatIntelFeedService.ts +6 -3
- 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/BasePermission.ts +9 -7
- package/Server/Types/Database/Permissions/Index.ts +75 -11
- package/Server/Types/Database/Permissions/OwnedScopePermission.ts +18 -9
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +82 -0
- package/Server/Types/Database/Permissions/TablePermission.ts +24 -28
- package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
- package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -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/MasterAdminPageAccess.ts +61 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +137 -126
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +4 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1 -1
- package/Server/Utils/Realtime.ts +163 -45
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +157 -6
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +11 -28
- package/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.ts +170 -0
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +1 -1
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +6 -2
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +10 -9
- 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/AffectedResourcesPicker.test.tsx +1059 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +376 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +757 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +307 -0
- package/Tests/App/Dashboard/ArgumentsFormGroupByUnlistedAttributes.test.tsx +131 -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/DashboardHeaderRequests.test.tsx +1 -1
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +9 -1
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +24 -0
- package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +162 -8
- 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/EntityFilterDropdownArchivedSlos.test.tsx +105 -6
- package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +434 -0
- package/Tests/App/Dashboard/ErrorPatternEventScope.test.tsx +148 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +276 -1
- 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/OnCallCalendarFeedSideMenus.test.tsx +9 -1
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +58 -42
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +42 -5
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +34 -23
- package/Tests/App/Dashboard/ScheduleTimeline.test.tsx +1580 -0
- package/Tests/App/Dashboard/ScheduleTimelineAPI.test.ts +280 -0
- package/Tests/App/Dashboard/ScheduleTimelineModel.test.ts +673 -0
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +95 -68
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +28 -3
- package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +761 -0
- package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
- package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
- package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
- package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +321 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +74 -2
- package/Tests/App/Dashboard/SloOverviewHero.test.tsx +171 -36
- package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +215 -0
- package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +40 -3
- package/Tests/App/Dashboard/TextClampLayoutHarness.ts +224 -0
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
- package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
- package/Tests/Models/InventoryItemNaming.test.ts +54 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +299 -5
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +187 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +14 -0
- package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +308 -0
- package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +55 -2
- package/Tests/Server/API/BaseAnalyticsAPIAggregateCache.test.ts +729 -0
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +93 -7
- package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +36 -3
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +1003 -24
- package/Tests/Server/API/DashboardPublicRateLimit.test.ts +6 -3
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +133 -0
- package/Tests/Server/API/ExpiredSessionAIRoutes.test.ts +708 -0
- package/Tests/Server/API/ExpiredSessionCustomRoutes.test.ts +928 -0
- package/Tests/Server/API/ExpiredSessionMonitorTemplate.test.ts +319 -0
- package/Tests/Server/API/ExpiredSessionOnCallDutyPolicy.test.ts +336 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +820 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +140 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +115 -12
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +375 -8
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +175 -17
- package/Tests/Server/API/OnCallScheduleTimelineAPI.test.ts +1513 -0
- package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +119 -7
- package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +111 -4
- package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +615 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +89 -2
- package/Tests/Server/API/SessionReplayAPI.test.ts +121 -0
- package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +484 -0
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +441 -0
- package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +664 -0
- package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +7 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +6 -0
- package/Tests/Server/API/UserNotificationSettingAPI.test.ts +65 -4
- package/Tests/Server/API/UserProjectsAPI.test.ts +63 -3
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +48 -2
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +11 -2
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +46 -3
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +18 -2
- package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +24 -7
- 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/ExpiredSessionUserMiddleware.test.ts +563 -0
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +72 -0
- package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +299 -19
- package/Tests/Server/Middleware/PublicDashboardRateLimit.test.ts +12 -12
- package/Tests/Server/Middleware/PublicDashboardRateLimitStatusPage.test.ts +800 -0
- package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +453 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +24 -0
- package/Tests/Server/Services/AIInvestigationDecisionPostgres.test.ts +346 -0
- package/Tests/Server/Services/AddOwnersIdempotency.test.ts +471 -0
- package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +2 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +3 -3
- package/Tests/Server/Services/DatabaseServiceAutoOwnerOnCreate.test.ts +250 -0
- package/Tests/Server/Services/DatabaseServiceCreateSuppliedId.test.ts +147 -0
- package/Tests/Server/Services/DatabaseServiceLoginBeforeHooks.test.ts +1078 -0
- package/Tests/Server/Services/DatabaseServiceTenantRelationGuard.test.ts +259 -0
- package/Tests/Server/Services/DatabaseServiceUniqueColumnsTogether.test.ts +622 -0
- package/Tests/Server/Services/DatabaseServiceWriteOperatorValues.test.ts +147 -0
- package/Tests/Server/Services/MonitorDescriptionValidation.test.ts +211 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
- package/Tests/Server/Services/MonitorTemplateDescriptionPropagation.test.ts +269 -0
- package/Tests/Server/Services/OnCallChildCreateAuthorizationPostgres.test.ts +711 -0
- package/Tests/Server/Services/OnCallDutyPolicyChildService.test.ts +733 -0
- package/Tests/Server/Services/OwnerRowUniqueness.test.ts +504 -0
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +190 -140
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +4 -9
- package/Tests/Server/Services/PermissionBlockDeletion.test.ts +780 -0
- package/Tests/Server/Services/PermissionBlockDeletionPostgres.test.ts +628 -0
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +43 -0
- package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -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/TeamMemberMultiTenantReadPostgres.test.ts +394 -0
- package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +6 -0
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +131 -0
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
- 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/ModelPermissionAnonymousRefusal.test.ts +518 -0
- package/Tests/Server/Types/Database/Permissions/MultiTenantPermissions.test.ts +350 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +282 -25
- package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +1 -0
- package/Tests/Server/Types/Database/Permissions/TableLevelBlockPermission.test.ts +459 -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/AIRunPrivacyFilter.test.ts +101 -9
- package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +88 -4
- 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/AI/Toolbox/ExceptionTools.test.ts +459 -0
- package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +794 -0
- package/Tests/Server/Utils/AI/Toolbox/RecentChangesTools.test.ts +574 -0
- package/Tests/Server/Utils/AI/Toolbox/SecurityEventTools.test.ts +596 -0
- package/Tests/Server/Utils/CaptchaRequestAndLogging.test.ts +395 -0
- package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +63 -0
- package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -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/MonitorActionTimestamps.test.ts +616 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +3 -2
- package/Tests/Server/Utils/Monitor/MonitorCriteriaHumanMessages.test.ts +529 -0
- package/Tests/Server/Utils/Realtime.test.ts +502 -0
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +412 -4
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorSeverity.test.ts +216 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts +1 -1
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +142 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.test.ts +140 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepairClickhouseIntegration.test.ts +542 -0
- package/Tests/Server/Utils/TailwindBuildCopy.test.ts +14 -2
- package/Tests/Server/Utils/Telemetry/ChangeEventRow.test.ts +743 -0
- package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +235 -0
- package/Tests/Server/Utils/Telemetry/RuntimeMetrics.test.ts +465 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +385 -2
- package/Tests/Server/Utils/VendorAssets.test.ts +17 -3
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Alert.test.ts +202 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/ScheduledMaintenance.test.ts +231 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Alert.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/AlertEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/ScheduledMaintenance.test.ts +247 -0
- package/Tests/Types/AI/AIChatPageContext.test.ts +0 -0
- package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
- package/Tests/Types/AI/AIResourceContext.test.ts +312 -0
- package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
- package/Tests/Types/Call/CallProvider.test.ts +528 -0
- package/Tests/Types/Database/UniqueColumnsTogether.test.ts +100 -0
- package/Tests/Types/Kubernetes/KubernetesCostIngest.test.ts +236 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +4 -4
- package/Tests/Types/Monitor/MonitorStepRetryPersistence.test.ts +125 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimeline.test.ts +736 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimelineLayout.test.ts +996 -0
- package/Tests/Types/SecurityEvent/SigmaRule.test.ts +142 -0
- package/Tests/Types/WebsiteRequest.test.ts +44 -0
- package/Tests/Types/Workflow/Components/JSON.test.ts +182 -0
- package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +116 -1
- package/Tests/UI/Components/Dropdown/DropdownAsyncOptions.test.tsx +81 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +89 -1
- package/Tests/UI/Components/EventAttachmentList.test.tsx +174 -0
- package/Tests/UI/Components/Forms/BasicFormBurnRateTemplateDefaults.test.tsx +395 -0
- package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +286 -0
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +128 -0
- package/Tests/UI/Components/Forms/MonitorDescriptionForm.test.tsx +410 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableQueryChange.test.tsx +365 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableReadPermissions.test.tsx +439 -0
- package/Tests/UI/Components/NavBarMenuSearch.test.tsx +372 -0
- package/Tests/UI/Components/OpenAuthenticatedUrl.test.ts +358 -0
- package/Tests/UI/Components/SessionAwareImage.test.tsx +496 -0
- package/Tests/UI/Components/TelemetryHistogramZeroBuckets.test.tsx +190 -0
- package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
- package/Tests/UI/EsbuildConfig.test.ts +1 -1
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +1 -1
- package/Tests/UI/Monitor/EvaluationLogListTimestamps.test.tsx +367 -0
- 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/UI/Utils/API/BaseAPIRefreshSession.test.ts +1087 -0
- package/Tests/UI/Utils/API/DashboardHost.ts +12 -0
- package/Tests/UI/Utils/API/FakeAxiosServer.ts +183 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/UI/Utils/Cookie.test.ts +440 -0
- package/Tests/UI/Utils/ModelAPIRequestClient.test.ts +278 -0
- package/Tests/UI/Utils/Navigation.test.ts +33 -0
- package/Tests/UI/Utils/PricingPlan.test.ts +295 -0
- package/Tests/UI/Utils/Realtime.test.ts +759 -0
- package/Tests/UI/Utils/Telemetry/Telemetry.test.ts +500 -0
- package/Tests/Utils/API.test.ts +96 -0
- package/Tests/Utils/APIInstanceDispatch.test.ts +311 -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/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -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/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
- package/Types/Database/UniqueColumnsTogether.ts +55 -0
- package/Types/Metrics/MetricQueryConfigData.ts +8 -0
- package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
- package/Types/OnCallDutyPolicy/ScheduleTimeline.ts +507 -0
- package/Types/OnCallDutyPolicy/ScheduleTimelineLayout.ts +589 -0
- package/Types/Realtime/EventName.ts +11 -0
- package/Types/Rum/WebVitals.ts +71 -0
- package/Types/SecurityEvent/DetectionFindingConstants.ts +14 -0
- package/Types/SecurityEvent/OcsfSeverity.ts +31 -26
- package/Types/SecurityEvent/SigmaRule.ts +51 -0
- package/Types/SecurityEvent/ThreatIntelConstants.ts +18 -0
- package/Types/WebsiteRequest.ts +2 -0
- package/UI/Components/AttachmentList/EventAttachmentList.tsx +30 -2
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +12 -2
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/EditionLabel/EditionLabel.tsx +19 -5
- package/UI/Components/EventItem/EventItem.tsx +12 -1
- package/UI/Components/Forms/BasicForm.tsx +151 -126
- package/UI/Components/Forms/CollapsibleFormSection.tsx +63 -0
- package/UI/Components/Forms/Fields/FormField.tsx +10 -4
- package/UI/Components/Forms/FormSummary.tsx +7 -0
- package/UI/Components/Forms/Types/Field.ts +10 -0
- package/UI/Components/KeyboardShortcut/Screenshots/README.md +1 -1
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
- package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +42 -5
- package/UI/Components/ModelTable/TableView.tsx +1 -1
- package/UI/Components/Navbar/NavBar.tsx +2 -0
- package/UI/Components/Navbar/NavBarMenuModal.tsx +6 -2
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +8 -1
- package/UI/Components/Tooltip/Tooltip.tsx +8 -1
- package/UI/Utils/API/API.ts +173 -12
- package/UI/Utils/API/RequestOptions.ts +11 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +31 -7
- package/UI/Utils/ModelAPI/ModelAPI.ts +30 -9
- package/UI/Utils/Navigation.ts +9 -0
- package/UI/Utils/OpenAuthenticatedUrl.ts +154 -0
- package/UI/Utils/Realtime.ts +176 -30
- package/UI/esbuild-config.js +4 -4
- package/Utils/API.ts +24 -6
- 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/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
- package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
- package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
- 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/OnCallDutyPolicyScheduleCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.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/ProjectOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.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/UserOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.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/AIBillingAPI.js +1 -1
- package/build/dist/Server/API/AIBillingAPI.js.map +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/AIInsightAPI.js +1 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +4 -4
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AIReadinessAPI.js +1 -3
- package/build/dist/Server/API/AIReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +1 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +1 -4
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +12 -0
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +55 -10
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +2 -2
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/BillingPaymentMethodAPI.js +2 -2
- package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
- package/build/dist/Server/API/CodeFixRunAPI.js +1 -3
- package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +50 -5
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +12 -12
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +12 -0
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +2 -2
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/NotificationAPI.js +1 -1
- package/build/dist/Server/API/NotificationAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallCalendarAPI.js +1 -4
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js +6 -0
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js +4 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +494 -0
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -0
- package/build/dist/Server/API/ProjectAPI.js +1 -1
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +133 -33
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +3 -3
- package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +2 -2
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +2 -2
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +2 -2
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/UserSlackAPI.js +1 -1
- package/build/dist/Server/API/UserSlackAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +2 -2
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +2 -2
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
- package/build/dist/Server/API/UserWhatsAppAPI.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/MasterAdminAuthorization.js +11 -2
- package/build/dist/Server/Middleware/MasterAdminAuthorization.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/Middleware/UserAuthorization.js +64 -4
- package/build/dist/Server/Middleware/UserAuthorization.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/ApiKeyPermissionService.js +80 -4
- package/build/dist/Server/Services/ApiKeyPermissionService.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 +242 -1
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +4 -4
- package/build/dist/Server/Services/DetectionRuleService.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/OnCallDutyPolicyChildService.js +170 -0
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.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/PayAsYouGoBillingService.js +20 -27
- package/build/dist/Server/Services/PayAsYouGoBillingService.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/ProjectService.js +17 -0
- package/build/dist/Server/Services/ProjectService.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/RumSessionPinService.js +180 -16
- package/build/dist/Server/Services/RumSessionPinService.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/TeamPermissionService.js +89 -27
- package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
- package/build/dist/Server/Services/ThreatIntelFeedService.js +5 -4
- package/build/dist/Server/Services/ThreatIntelFeedService.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/BasePermission.js +9 -6
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/Index.js +60 -6
- package/build/dist/Server/Types/Database/Permissions/Index.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/Types/Database/Permissions/TablePermission.js +14 -13
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.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/MasterAdminPageAccess.js +39 -0
- package/build/dist/Server/Utils/MasterAdminPageAccess.js.map +1 -0
- 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/Monitor/MonitorAlert.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Realtime.js +126 -37
- package/build/dist/Server/Utils/Realtime.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/SecurityEvent/DetectionRuleEvaluator.js +7 -25
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js +127 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +3 -2
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +4 -8
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.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/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +31 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
- 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/OnCallDutyPolicy/ScheduleTimeline.js +321 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js +372 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js.map +1 -0
- package/build/dist/Types/Realtime/EventName.js +10 -0
- package/build/dist/Types/Realtime/EventName.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/SecurityEvent/DetectionFindingConstants.js +11 -0
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js +30 -25
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -1
- package/build/dist/Types/SecurityEvent/SigmaRule.js +47 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -1
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +14 -0
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -1
- package/build/dist/Types/WebsiteRequest.js +2 -0
- package/build/dist/Types/WebsiteRequest.js.map +1 -1
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +9 -4
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +10 -2
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +18 -5
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
- package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +70 -64
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +27 -0
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -0
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -7
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/FormSummary.js +7 -0
- package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +2 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js +84 -0
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +21 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.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/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +2 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/API/API.js +143 -19
- package/build/dist/UI/Utils/API/API.js.map +1 -1
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +21 -7
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +26 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +8 -0
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js +92 -0
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js.map +1 -0
- package/build/dist/UI/Utils/Realtime.js +120 -15
- package/build/dist/UI/Utils/Realtime.js.map +1 -1
- package/build/dist/Utils/API.js +21 -9
- 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/SecurityEvent/GoogleSecOpsAlertNormalizer.js +123 -6
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +4 -18
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -1
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js +2 -2
- 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
|
@@ -6,7 +6,7 @@ import MoreMenuItem from "../MoreMenu/MoreMenuItem";
|
|
|
6
6
|
import ModelAPI from "../../Utils/ModelAPI/ModelAPI";
|
|
7
7
|
import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
|
|
8
8
|
import SortOrder from "../../../Types/BaseDatabase/SortOrder";
|
|
9
|
-
import API from "
|
|
9
|
+
import API from "../../Utils/API/API";
|
|
10
10
|
import MoreMenuSection from "../MoreMenu/MoreMenuSection";
|
|
11
11
|
import { ButtonStyleType } from "../Button/Button";
|
|
12
12
|
import IconProp from "../../../Types/Icon/IconProp";
|
|
@@ -29,6 +29,8 @@ export interface NavItem {
|
|
|
29
29
|
export interface MoreMenuItem {
|
|
30
30
|
title: string;
|
|
31
31
|
description: string;
|
|
32
|
+
/** Acronyms and alternate names users can search for in navigation. */
|
|
33
|
+
keywords?: Array<string> | undefined;
|
|
32
34
|
route: Route;
|
|
33
35
|
icon: IconProp;
|
|
34
36
|
iconColor?: string; // Tailwind color name like "blue", "purple", "amber"
|
|
@@ -186,14 +186,18 @@ const NavBarMenuModal: FunctionComponent<ComponentProps> = (
|
|
|
186
186
|
|
|
187
187
|
const recentLabel: string = tx(props.recentLabel || "Recent");
|
|
188
188
|
|
|
189
|
-
//
|
|
189
|
+
// Keep familiar acronyms searchable even when the displayed title is translated.
|
|
190
190
|
const filteredItems: MoreMenuItem[] = useMemo(() => {
|
|
191
191
|
const normalizedQuery: string = query.trim().toLowerCase();
|
|
192
192
|
if (!normalizedQuery) {
|
|
193
193
|
return props.items;
|
|
194
194
|
}
|
|
195
195
|
return props.items.filter((item: MoreMenuItem) => {
|
|
196
|
-
return item.title.
|
|
196
|
+
return [item.title, item.description, ...(item.keywords || [])].some(
|
|
197
|
+
(value: string) => {
|
|
198
|
+
return value.toLowerCase().includes(normalizedQuery);
|
|
199
|
+
},
|
|
200
|
+
);
|
|
197
201
|
});
|
|
198
202
|
}, [props.items, query]);
|
|
199
203
|
|
|
@@ -118,8 +118,15 @@ const TelemetryHistogram: FunctionComponent<TelemetryHistogramProps> = (
|
|
|
118
118
|
const activeSeries: Array<HistogramSeriesOption> = useMemo(() => {
|
|
119
119
|
const present: Set<string> = new Set<string>();
|
|
120
120
|
|
|
121
|
+
/*
|
|
122
|
+
* A zero-count bucket holds a slot on the time axis (so a quiet stretch
|
|
123
|
+
* reads as a gap rather than being squeezed out); it is not a sighting
|
|
124
|
+
* of its series, which draws nothing and must not be legended.
|
|
125
|
+
*/
|
|
121
126
|
for (const bucket of props.buckets) {
|
|
122
|
-
|
|
127
|
+
if (bucket.count > 0) {
|
|
128
|
+
present.add(bucket.series);
|
|
129
|
+
}
|
|
123
130
|
}
|
|
124
131
|
|
|
125
132
|
return props.series.filter((option: HistogramSeriesOption): boolean => {
|
|
@@ -15,6 +15,13 @@ export interface ComponentProps {
|
|
|
15
15
|
richContent?: ReactElement | undefined;
|
|
16
16
|
// Large collections can wait to create a tooltip until first opened.
|
|
17
17
|
lazy?: boolean | undefined;
|
|
18
|
+
/*
|
|
19
|
+
* Rich tooltips are interactive by default, and Tippy mounts an interactive
|
|
20
|
+
* tooltip inside the trigger's parent - where an overflow-clipped ancestor
|
|
21
|
+
* (a scrolling grid, say) cuts it off. Pass false for rich content that has
|
|
22
|
+
* nothing to click: it then mounts on <body> and hides on mouse-out.
|
|
23
|
+
*/
|
|
24
|
+
interactive?: boolean | undefined;
|
|
18
25
|
}
|
|
19
26
|
|
|
20
27
|
interface PopupProps extends ComponentProps {
|
|
@@ -61,7 +68,7 @@ const TooltipPopup: FunctionComponent<PopupProps> = (
|
|
|
61
68
|
{...(props.reference
|
|
62
69
|
? { reference: props.reference, showOnCreate: true }
|
|
63
70
|
: { children: props.children })}
|
|
64
|
-
interactive={isRich}
|
|
71
|
+
interactive={props.interactive ?? isRich}
|
|
65
72
|
trigger="mouseenter focus"
|
|
66
73
|
hideOnClick={false}
|
|
67
74
|
maxWidth={isRich ? 380 : 350}
|
package/UI/Utils/API/API.ts
CHANGED
|
@@ -22,8 +22,25 @@ import {
|
|
|
22
22
|
import API, { AuthRetryContext } from "../../../Utils/API";
|
|
23
23
|
import { IDENTITY_URL } from "../../Config";
|
|
24
24
|
|
|
25
|
+
/*
|
|
26
|
+
* One in-flight refresh per session, shared by every caller in this tab: the
|
|
27
|
+
* dashboard's BaseAPI, any subclass that inherits its refresh, and callers of
|
|
28
|
+
* refreshSession() that are not going through a request at all (raw fetch,
|
|
29
|
+
* navigations, the realtime socket). Keyed by session name rather than kept on
|
|
30
|
+
* `this`, because a static field read through `this` gives every subclass its
|
|
31
|
+
* own slot, and two slots for one session means two refreshes racing with the
|
|
32
|
+
* same rotating refresh token.
|
|
33
|
+
*/
|
|
34
|
+
const inFlightSessionRefreshes: Map<string, Promise<boolean>> = new Map();
|
|
35
|
+
|
|
25
36
|
class BaseAPI extends API {
|
|
26
|
-
|
|
37
|
+
/*
|
|
38
|
+
* A refresh another tab finished this recently is one this tab can reuse:
|
|
39
|
+
* tabs share cookies, so its new access token is already ours. Comfortably
|
|
40
|
+
* longer than a refresh round trip, far shorter than the token lifetime.
|
|
41
|
+
*/
|
|
42
|
+
public static readonly RECENT_SESSION_REFRESH_WINDOW_IN_MS: number =
|
|
43
|
+
15 * 1000;
|
|
27
44
|
|
|
28
45
|
public constructor(protocol: Protocol, hostname: Hostname, route?: Route) {
|
|
29
46
|
super(protocol, hostname, route);
|
|
@@ -117,6 +134,14 @@ class BaseAPI extends API {
|
|
|
117
134
|
|
|
118
135
|
this.logoutUser();
|
|
119
136
|
|
|
137
|
+
/*
|
|
138
|
+
* Already there: a forced navigation would reload the login page, whose
|
|
139
|
+
* requests would fail the same way and reload it again.
|
|
140
|
+
*/
|
|
141
|
+
if (Navigation.getCurrentRoute().toString() === loginRoute.toString()) {
|
|
142
|
+
return error;
|
|
143
|
+
}
|
|
144
|
+
|
|
120
145
|
if (Navigation.getQueryStringByName("token")) {
|
|
121
146
|
Navigation.navigate(loginRoute.addRouteParam("sso", "true"), {
|
|
122
147
|
forceNavigate: true,
|
|
@@ -140,14 +165,79 @@ class BaseAPI extends API {
|
|
|
140
165
|
return error;
|
|
141
166
|
}
|
|
142
167
|
|
|
168
|
+
/*
|
|
169
|
+
* A refresh that got no answer at all (network down, identity unreachable)
|
|
170
|
+
* rejects here rather than resolving false: the request that asked for it
|
|
171
|
+
* then fails with that transport error, instead of logging the user out
|
|
172
|
+
* over a blip.
|
|
173
|
+
*/
|
|
143
174
|
protected static override async tryRefreshAuth(
|
|
144
175
|
_context: AuthRetryContext,
|
|
145
176
|
): Promise<boolean> {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
177
|
+
return await this.refreshSessionOrThrow();
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/*
|
|
181
|
+
* Where this client's session is refreshed, or null when it has no session
|
|
182
|
+
* that can be (a public dashboard, a status page with no id yet).
|
|
183
|
+
*/
|
|
184
|
+
protected static getRefreshSessionUrl(): URL | null {
|
|
185
|
+
return URL.fromString(IDENTITY_URL.toString()).addRoute("/refresh-token");
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Names the session for the in-tab single flight, the cross-tab lock and the "recently refreshed" marker.
|
|
189
|
+
protected static getSessionName(): string {
|
|
190
|
+
return "dashboard";
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/*
|
|
194
|
+
* Refresh the session now, and say whether it worked.
|
|
195
|
+
*
|
|
196
|
+
* Requests made through this class already do this for themselves when they
|
|
197
|
+
* come back 401. This is for the paths that cannot: a raw fetch() (binary
|
|
198
|
+
* responses), a navigation or new tab pointed at an authenticated route, the
|
|
199
|
+
* realtime socket's handshake. Those call it before (or after) and carry on.
|
|
200
|
+
*
|
|
201
|
+
* Concurrent callers share one refresh, in this tab and across tabs. The
|
|
202
|
+
* server rotates the refresh token on every use, and a token that has
|
|
203
|
+
* already been rotated no longer matches a session: that refresh gets a 401
|
|
204
|
+
* and a response that clears every session cookie, including the ones the
|
|
205
|
+
* winning refresh just set. So two tabs that both notice an expired session
|
|
206
|
+
* and both refresh would log each other out. The refresh therefore runs
|
|
207
|
+
* under a cross-tab lock, and a tab that gets the lock just after another
|
|
208
|
+
* tab refreshed reuses that result instead of spending the stale token.
|
|
209
|
+
*/
|
|
210
|
+
public static async refreshSession(): Promise<boolean> {
|
|
211
|
+
try {
|
|
212
|
+
return await this.refreshSessionOrThrow();
|
|
213
|
+
} catch {
|
|
214
|
+
// No answer at all; callers outside a request just carry on.
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
private static async refreshSessionOrThrow(): Promise<boolean> {
|
|
220
|
+
const refreshUrl: URL | null = this.getRefreshSessionUrl();
|
|
221
|
+
|
|
222
|
+
if (!refreshUrl) {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const sessionName: string = this.getSessionName();
|
|
227
|
+
|
|
228
|
+
const inFlight: Promise<boolean> | undefined =
|
|
229
|
+
inFlightSessionRefreshes.get(sessionName);
|
|
230
|
+
|
|
231
|
+
if (inFlight) {
|
|
232
|
+
return await inFlight;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const refresh: Promise<boolean> = this.runWithSessionLock(
|
|
236
|
+
sessionName,
|
|
237
|
+
async (): Promise<boolean> => {
|
|
238
|
+
if (this.wasSessionRefreshedRecently(sessionName)) {
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
151
241
|
|
|
152
242
|
const result: HTTPResponse<JSONObject> | HTTPErrorResponse =
|
|
153
243
|
await super.fetch<JSONObject>({
|
|
@@ -156,20 +246,91 @@ class BaseAPI extends API {
|
|
|
156
246
|
options: {
|
|
157
247
|
skipAuthRefresh: true,
|
|
158
248
|
hasAttemptedAuthRefresh: true,
|
|
249
|
+
/*
|
|
250
|
+
* A refresh that fails because the identity service is
|
|
251
|
+
* restarting is not a dead session, and treating it as one logs
|
|
252
|
+
* the user out. Retry what a retry can fix; a 401 is final.
|
|
253
|
+
*/
|
|
254
|
+
retries: 2,
|
|
255
|
+
exponentialBackoff: true,
|
|
256
|
+
retryOnlyOnRetryableErrors: true,
|
|
159
257
|
},
|
|
160
258
|
});
|
|
161
259
|
|
|
162
|
-
|
|
163
|
-
|
|
260
|
+
const refreshed: boolean =
|
|
261
|
+
result instanceof HTTPResponse && result.isSuccess();
|
|
262
|
+
|
|
263
|
+
if (refreshed) {
|
|
264
|
+
this.markSessionRefreshed(sessionName);
|
|
164
265
|
}
|
|
165
266
|
|
|
267
|
+
return refreshed;
|
|
268
|
+
},
|
|
269
|
+
).finally(() => {
|
|
270
|
+
inFlightSessionRefreshes.delete(sessionName);
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
inFlightSessionRefreshes.set(sessionName, refresh);
|
|
274
|
+
|
|
275
|
+
return await refresh;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
private static getSessionRefreshedAtKey(sessionName: string): string {
|
|
279
|
+
return `session-refreshed-at:${sessionName}`;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
private static wasSessionRefreshedRecently(sessionName: string): boolean {
|
|
283
|
+
try {
|
|
284
|
+
const refreshedAt: number = Number(
|
|
285
|
+
LocalStorage.getItem(this.getSessionRefreshedAtKey(sessionName)),
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
if (!refreshedAt) {
|
|
166
289
|
return false;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const ageInMs: number = Date.now() - refreshedAt;
|
|
293
|
+
|
|
294
|
+
return (
|
|
295
|
+
ageInMs >= 0 && ageInMs < BaseAPI.RECENT_SESSION_REFRESH_WINDOW_IN_MS
|
|
296
|
+
);
|
|
297
|
+
} catch {
|
|
298
|
+
// Storage can be unavailable (privacy modes); then every tab refreshes.
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
private static markSessionRefreshed(sessionName: string): void {
|
|
304
|
+
try {
|
|
305
|
+
LocalStorage.setItem(
|
|
306
|
+
this.getSessionRefreshedAtKey(sessionName),
|
|
307
|
+
Date.now().toString(),
|
|
308
|
+
);
|
|
309
|
+
} catch {
|
|
310
|
+
// Best effort, as above.
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/*
|
|
315
|
+
* Web Locks serialise the refresh across every tab of this origin. Where
|
|
316
|
+
* they are unavailable the refresh simply runs, which is what happened
|
|
317
|
+
* before this lock existed.
|
|
318
|
+
*/
|
|
319
|
+
private static async runWithSessionLock(
|
|
320
|
+
sessionName: string,
|
|
321
|
+
work: () => Promise<boolean>,
|
|
322
|
+
): Promise<boolean> {
|
|
323
|
+
const locks: LockManager | undefined =
|
|
324
|
+
typeof navigator !== "undefined" ? navigator.locks : undefined;
|
|
325
|
+
|
|
326
|
+
if (!locks || typeof locks.request !== "function") {
|
|
327
|
+
return await work();
|
|
170
328
|
}
|
|
171
329
|
|
|
172
|
-
return await
|
|
330
|
+
return await locks.request(
|
|
331
|
+
`oneuptime-session-refresh:${sessionName}`,
|
|
332
|
+
work,
|
|
333
|
+
);
|
|
173
334
|
}
|
|
174
335
|
|
|
175
336
|
protected static getLoginRoute(): Route {
|
|
@@ -2,10 +2,21 @@ import URL from "../../../Types/API/URL";
|
|
|
2
2
|
import type { RequestOptions as CoreRequestOptions } from "../../../Utils/API";
|
|
3
3
|
import Dictionary from "../../../Types/Dictionary";
|
|
4
4
|
import { JSONObject } from "../../../Types/JSON";
|
|
5
|
+
import type BaseAPI from "./API";
|
|
5
6
|
|
|
6
7
|
export default interface RequestOptions {
|
|
7
8
|
requestHeaders?: Dictionary<string> | undefined;
|
|
8
9
|
overrideRequestUrl?: URL | undefined;
|
|
10
|
+
/*
|
|
11
|
+
* The client that sends THIS request instead of the model API's default
|
|
12
|
+
* (the dashboard client, or a subclass's getApiClient()). Set by callers
|
|
13
|
+
* that route a shared model request to another app's endpoint - a public
|
|
14
|
+
* dashboard widget's /public-dashboard-api/resource-list read - so that
|
|
15
|
+
* endpoint's 401/403 is handled by that app's client (its master-password
|
|
16
|
+
* page), never by the dashboard's refresh-token + User.logout +
|
|
17
|
+
* /accounts/login.
|
|
18
|
+
*/
|
|
19
|
+
apiClient?: typeof BaseAPI | undefined;
|
|
9
20
|
apiRequestOptions?: CoreRequestOptions | undefined;
|
|
10
21
|
/*
|
|
11
22
|
* Extra top-level fields merged into a list request body before the
|
|
@@ -28,6 +28,24 @@ export type ListResult<TAnalyticsBaseModel extends AnalyticsBaseModel> =
|
|
|
28
28
|
BaseListResult<TAnalyticsBaseModel>;
|
|
29
29
|
|
|
30
30
|
export default class ModelAPI {
|
|
31
|
+
/**
|
|
32
|
+
* The API client used for analytics model requests: the authenticated
|
|
33
|
+
* dashboard client.
|
|
34
|
+
*/
|
|
35
|
+
protected static getApiClient(): typeof API {
|
|
36
|
+
return API;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/*
|
|
40
|
+
* The client for ONE request: a client the caller routed this request
|
|
41
|
+
* through (RequestOptions.apiClient) wins; otherwise this class's client.
|
|
42
|
+
*/
|
|
43
|
+
protected static getApiClientForRequest(
|
|
44
|
+
requestOptions?: RequestOptions | undefined,
|
|
45
|
+
): typeof API {
|
|
46
|
+
return requestOptions?.apiClient || this.getApiClient();
|
|
47
|
+
}
|
|
48
|
+
|
|
31
49
|
public static async create<
|
|
32
50
|
TAnalyticsBaseModel extends AnalyticsBaseModel,
|
|
33
51
|
>(data: {
|
|
@@ -103,7 +121,7 @@ export default class ModelAPI {
|
|
|
103
121
|
| JSONArray
|
|
104
122
|
| TAnalyticsBaseModel
|
|
105
123
|
| Array<TAnalyticsBaseModel>
|
|
106
|
-
> = await
|
|
124
|
+
> = await this.getApiClientForRequest(requestOptions).fetch<
|
|
107
125
|
JSONObject | JSONArray | TAnalyticsBaseModel | Array<TAnalyticsBaseModel>
|
|
108
126
|
>({
|
|
109
127
|
method: HTTPMethod.PUT,
|
|
@@ -155,7 +173,9 @@ export default class ModelAPI {
|
|
|
155
173
|
}
|
|
156
174
|
|
|
157
175
|
const apiResult: HTTPErrorResponse | HTTPResponse<TAnalyticsBaseModel> =
|
|
158
|
-
await
|
|
176
|
+
await this.getApiClientForRequest(
|
|
177
|
+
requestOptions,
|
|
178
|
+
).fetch<TAnalyticsBaseModel>({
|
|
159
179
|
method: httpMethod,
|
|
160
180
|
url: apiUrl,
|
|
161
181
|
data: {
|
|
@@ -221,7 +241,7 @@ export default class ModelAPI {
|
|
|
221
241
|
const headers: Dictionary<string> = this.getCommonHeaders(requestOptions);
|
|
222
242
|
|
|
223
243
|
const result: HTTPResponse<JSONArray> | HTTPErrorResponse =
|
|
224
|
-
await
|
|
244
|
+
await this.getApiClientForRequest(requestOptions).fetch<JSONArray>({
|
|
225
245
|
method: HTTPMethod.POST,
|
|
226
246
|
url: apiUrl,
|
|
227
247
|
data: {
|
|
@@ -288,7 +308,7 @@ export default class ModelAPI {
|
|
|
288
308
|
const headers: Dictionary<string> = this.getCommonHeaders(requestOptions);
|
|
289
309
|
|
|
290
310
|
const result: HTTPResponse<JSONArray> | HTTPErrorResponse =
|
|
291
|
-
await
|
|
311
|
+
await this.getApiClientForRequest(requestOptions).fetch<JSONArray>({
|
|
292
312
|
method: HTTPMethod.POST,
|
|
293
313
|
url: apiUrl,
|
|
294
314
|
data: {
|
|
@@ -355,7 +375,7 @@ export default class ModelAPI {
|
|
|
355
375
|
const headers: Dictionary<string> = this.getCommonHeaders(requestOptions);
|
|
356
376
|
|
|
357
377
|
const result: HTTPResponse<JSONObject> | HTTPErrorResponse =
|
|
358
|
-
await
|
|
378
|
+
await this.getApiClientForRequest(requestOptions).fetch<JSONObject>({
|
|
359
379
|
method: HTTPMethod.POST,
|
|
360
380
|
url: apiUrl,
|
|
361
381
|
data: {
|
|
@@ -440,7 +460,9 @@ export default class ModelAPI {
|
|
|
440
460
|
requestOptions?: RequestOptions | undefined,
|
|
441
461
|
): Promise<TAnalyticsBaseModel | null> {
|
|
442
462
|
const result: HTTPResponse<TAnalyticsBaseModel> | HTTPErrorResponse =
|
|
443
|
-
await
|
|
463
|
+
await this.getApiClientForRequest(
|
|
464
|
+
requestOptions,
|
|
465
|
+
).fetch<TAnalyticsBaseModel>({
|
|
444
466
|
method: HTTPMethod.POST,
|
|
445
467
|
url: apiUrl,
|
|
446
468
|
data: {
|
|
@@ -488,7 +510,9 @@ export default class ModelAPI {
|
|
|
488
510
|
}
|
|
489
511
|
|
|
490
512
|
const result: HTTPResponse<TAnalyticsBaseModel> | HTTPErrorResponse =
|
|
491
|
-
await
|
|
513
|
+
await this.getApiClientForRequest(
|
|
514
|
+
requestOptions,
|
|
515
|
+
).fetch<TAnalyticsBaseModel>({
|
|
492
516
|
method: HTTPMethod.DELETE,
|
|
493
517
|
url: apiUrl,
|
|
494
518
|
headers: this.getCommonHeaders(requestOptions),
|
|
@@ -47,6 +47,16 @@ export default class ModelAPI {
|
|
|
47
47
|
return API;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
/*
|
|
51
|
+
* The client for ONE request: a client the caller routed this request
|
|
52
|
+
* through (RequestOptions.apiClient) wins; otherwise this class's client.
|
|
53
|
+
*/
|
|
54
|
+
protected static getApiClientForRequest(
|
|
55
|
+
requestOptions?: RequestOptions | undefined,
|
|
56
|
+
): typeof API {
|
|
57
|
+
return requestOptions?.apiClient || this.getApiClient();
|
|
58
|
+
}
|
|
59
|
+
|
|
50
60
|
public static async create<TBaseModel extends BaseModel>(data: {
|
|
51
61
|
model: TBaseModel;
|
|
52
62
|
modelType: { new (): TBaseModel };
|
|
@@ -109,7 +119,7 @@ export default class ModelAPI {
|
|
|
109
119
|
|
|
110
120
|
const result: HTTPResponse<
|
|
111
121
|
JSONObject | JSONArray | TBaseModel | Array<TBaseModel>
|
|
112
|
-
> = await this.
|
|
122
|
+
> = await this.getApiClientForRequest(data.requestOptions).fetch<
|
|
113
123
|
JSONObject | JSONArray | TBaseModel | Array<TBaseModel>
|
|
114
124
|
>({
|
|
115
125
|
method: HTTPMethod.PUT,
|
|
@@ -163,7 +173,7 @@ export default class ModelAPI {
|
|
|
163
173
|
}
|
|
164
174
|
|
|
165
175
|
const apiResult: HTTPErrorResponse | HTTPResponse<TBaseModel> =
|
|
166
|
-
await this.
|
|
176
|
+
await this.getApiClientForRequest(data.requestOptions).fetch<TBaseModel>({
|
|
167
177
|
method: httpMethod,
|
|
168
178
|
url: apiUrl,
|
|
169
179
|
data: {
|
|
@@ -241,7 +251,7 @@ export default class ModelAPI {
|
|
|
241
251
|
}
|
|
242
252
|
|
|
243
253
|
const result: HTTPResponse<JSONArray> | HTTPErrorResponse =
|
|
244
|
-
await this.
|
|
254
|
+
await this.getApiClientForRequest(data.requestOptions).fetch<JSONArray>({
|
|
245
255
|
method: HTTPMethod.POST,
|
|
246
256
|
url: apiUrl,
|
|
247
257
|
data: {
|
|
@@ -315,7 +325,7 @@ export default class ModelAPI {
|
|
|
315
325
|
}
|
|
316
326
|
|
|
317
327
|
const result: HTTPResponse<JSONObject> | HTTPErrorResponse =
|
|
318
|
-
await this.
|
|
328
|
+
await this.getApiClientForRequest(data.requestOptions).fetch<JSONObject>({
|
|
319
329
|
method: HTTPMethod.POST,
|
|
320
330
|
url: apiUrl,
|
|
321
331
|
data: {
|
|
@@ -343,10 +353,21 @@ export default class ModelAPI {
|
|
|
343
353
|
): Dictionary<string> {
|
|
344
354
|
let headers: Dictionary<string> = {};
|
|
345
355
|
|
|
356
|
+
/*
|
|
357
|
+
* A request routed through another app's client (a public dashboard
|
|
358
|
+
* widget's /public-dashboard-api read) is not scoped to the viewer's own
|
|
359
|
+
* project: that client sends its own tenant header. The viewer's
|
|
360
|
+
* last-opened dashboard project would override it, and a stale or
|
|
361
|
+
* foreign one turns the public read into a 405 (tenant not found) that
|
|
362
|
+
* the public page treats as a login event.
|
|
363
|
+
*/
|
|
364
|
+
const isRoutedToAnotherClient: boolean = Boolean(requestOptions?.apiClient);
|
|
365
|
+
|
|
346
366
|
if (
|
|
347
|
-
!
|
|
348
|
-
!requestOptions
|
|
349
|
-
|
|
367
|
+
!isRoutedToAnotherClient &&
|
|
368
|
+
(!requestOptions ||
|
|
369
|
+
!requestOptions.isMultiTenantRequest ||
|
|
370
|
+
Object.keys(requestOptions).length === 0)
|
|
350
371
|
) {
|
|
351
372
|
/*
|
|
352
373
|
* Read the tenant id via getCurrentProjectId() first - a plain string
|
|
@@ -427,7 +448,7 @@ export default class ModelAPI {
|
|
|
427
448
|
requestOptions?: RequestOptions | undefined;
|
|
428
449
|
}): Promise<TBaseModel | null> {
|
|
429
450
|
const result: HTTPResponse<TBaseModel> | HTTPErrorResponse =
|
|
430
|
-
await this.
|
|
451
|
+
await this.getApiClientForRequest(data.requestOptions).fetch<TBaseModel>({
|
|
431
452
|
method: HTTPMethod.POST,
|
|
432
453
|
url: data.apiUrl,
|
|
433
454
|
data: {
|
|
@@ -476,7 +497,7 @@ export default class ModelAPI {
|
|
|
476
497
|
}
|
|
477
498
|
|
|
478
499
|
const result: HTTPResponse<TBaseModel> | HTTPErrorResponse =
|
|
479
|
-
await this.
|
|
500
|
+
await this.getApiClientForRequest(data.requestOptions).fetch<TBaseModel>({
|
|
480
501
|
method: HTTPMethod.DELETE,
|
|
481
502
|
url: apiUrl,
|
|
482
503
|
headers: this.getCommonHeaders(data.requestOptions),
|
package/UI/Utils/Navigation.ts
CHANGED
|
@@ -174,6 +174,15 @@ abstract class Navigation {
|
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
public static getCurrentRoute(): Route {
|
|
177
|
+
/*
|
|
178
|
+
* The router hands us its location once it has rendered. An API error can
|
|
179
|
+
* be handled before that (or outside a router altogether), and the address
|
|
180
|
+
* bar is the same answer then.
|
|
181
|
+
*/
|
|
182
|
+
if (!this.location) {
|
|
183
|
+
return new Route(window.location.pathname);
|
|
184
|
+
}
|
|
185
|
+
|
|
177
186
|
return new Route(this.location.pathname);
|
|
178
187
|
}
|
|
179
188
|
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import BaseAPI from "./API/API";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Opening an authenticated URL in a new tab, with the session refreshed first.
|
|
5
|
+
*
|
|
6
|
+
* A link to an authenticated API route (an attachment, a pprof export) is a
|
|
7
|
+
* plain navigation. It carries the session cookies but none of the API
|
|
8
|
+
* class's recovery: a request made through BaseAPI that comes back 401
|
|
9
|
+
* refreshes the session and replays itself, while a navigation simply shows
|
|
10
|
+
* the 401. The access cookie expires with the 15-minute access token, so on a
|
|
11
|
+
* page left open that long every such link opened a bare "Authentication
|
|
12
|
+
* required" page although the refresh token was still good. Refreshing before
|
|
13
|
+
* navigating makes the new tab arrive with a live access cookie. It costs
|
|
14
|
+
* nothing extra when another request or another tab has just refreshed:
|
|
15
|
+
* refreshSession() reuses that result.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export type RefreshSessionFunction = () => Promise<boolean>;
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* The part of a click event the link handler reads. React.MouseEvent
|
|
22
|
+
* satisfies it, and so does a DOM MouseEvent, so this module needs neither.
|
|
23
|
+
*/
|
|
24
|
+
export interface AuthenticatedLinkClickEvent {
|
|
25
|
+
button: number;
|
|
26
|
+
metaKey: boolean;
|
|
27
|
+
ctrlKey: boolean;
|
|
28
|
+
shiftKey: boolean;
|
|
29
|
+
altKey: boolean;
|
|
30
|
+
defaultPrevented: boolean;
|
|
31
|
+
preventDefault: () => void;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* The dashboard's session. A client with a session of its own (the status
|
|
36
|
+
* page) passes its API class's refresh instead.
|
|
37
|
+
*/
|
|
38
|
+
const refreshDashboardSession: RefreshSessionFunction =
|
|
39
|
+
async (): Promise<boolean> => {
|
|
40
|
+
return await BaseAPI.refreshSession();
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/*
|
|
44
|
+
* Point a tab this click already opened at the URL, once the session has been
|
|
45
|
+
* refreshed. A refresh that did not work closes the tab instead: a refused one
|
|
46
|
+
* means the session has ended and this page's API client is already taking
|
|
47
|
+
* the user to the login page, and one that got no answer means the server
|
|
48
|
+
* cannot be reached, so the tab would only show an error either way.
|
|
49
|
+
*/
|
|
50
|
+
async function navigateTabAfterRefresh(
|
|
51
|
+
tab: Window,
|
|
52
|
+
url: string,
|
|
53
|
+
refreshSession: RefreshSessionFunction,
|
|
54
|
+
): Promise<void> {
|
|
55
|
+
/*
|
|
56
|
+
* Cut loose from this page, as rel="noopener" would have done. A blank tab
|
|
57
|
+
* opened WITH the "noopener" feature could not be pointed anywhere
|
|
58
|
+
* afterwards, because window.open returns null for it.
|
|
59
|
+
*/
|
|
60
|
+
tab.opener = null;
|
|
61
|
+
|
|
62
|
+
let refreshed: boolean = false;
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
refreshed = await refreshSession();
|
|
66
|
+
} catch {
|
|
67
|
+
refreshed = false;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Closed while the refresh ran: the user changed their mind.
|
|
71
|
+
if (tab.closed) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (!refreshed) {
|
|
76
|
+
tab.close();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
tab.location.href = url;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export default async function openAuthenticatedUrl(
|
|
84
|
+
url: string,
|
|
85
|
+
refreshSession: RefreshSessionFunction = refreshDashboardSession,
|
|
86
|
+
): Promise<void> {
|
|
87
|
+
/*
|
|
88
|
+
* Popup blockers let window.open through only while the click is still
|
|
89
|
+
* being handled; once the handler has awaited something, Safari and Firefox
|
|
90
|
+
* no longer count the new tab as the user's doing and block it. So the tab
|
|
91
|
+
* is opened now, blank, and pointed at the URL once the refresh has settled.
|
|
92
|
+
*/
|
|
93
|
+
const newTab: Window | null = window.open("", "_blank");
|
|
94
|
+
|
|
95
|
+
if (!newTab) {
|
|
96
|
+
/*
|
|
97
|
+
* Blocked. Ask for the URL itself, still inside the click: without a tab
|
|
98
|
+
* to hold, there is nothing to refresh the session for.
|
|
99
|
+
*/
|
|
100
|
+
window.open(url, "_blank", "noopener,noreferrer");
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
await navigateTabAfterRefresh(newTab, url, refreshSession);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/*
|
|
108
|
+
* The onClick for an <a href={url} target="_blank"> that points at an
|
|
109
|
+
* authenticated route. The href stays on the element so middle-click, "copy
|
|
110
|
+
* link address" and the context menu keep working exactly as before (those
|
|
111
|
+
* paths get no refresh); a plain click opens the URL in a tab of its own once
|
|
112
|
+
* the session is refreshed.
|
|
113
|
+
*/
|
|
114
|
+
export function handleAuthenticatedLinkClick(
|
|
115
|
+
event: AuthenticatedLinkClickEvent,
|
|
116
|
+
url: string,
|
|
117
|
+
refreshSession?: RefreshSessionFunction,
|
|
118
|
+
): void {
|
|
119
|
+
/*
|
|
120
|
+
* Modified clicks stay the browser's: cmd/ctrl-click opens a background
|
|
121
|
+
* tab, shift-click a new window, alt-click downloads. Turning all of them
|
|
122
|
+
* into a foreground tab would be a surprise.
|
|
123
|
+
*/
|
|
124
|
+
if (
|
|
125
|
+
event.defaultPrevented ||
|
|
126
|
+
event.button !== 0 ||
|
|
127
|
+
event.metaKey ||
|
|
128
|
+
event.ctrlKey ||
|
|
129
|
+
event.shiftKey ||
|
|
130
|
+
event.altKey
|
|
131
|
+
) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/*
|
|
136
|
+
* Open the tab before deciding to take the click over. Where window.open
|
|
137
|
+
* is refused (a popup-blocking extension, some in-app browsers) the anchor's
|
|
138
|
+
* own navigation may still be allowed, so the click is left to it - no
|
|
139
|
+
* refresh, but a link that opens, as it always did.
|
|
140
|
+
*/
|
|
141
|
+
const newTab: Window | null = window.open("", "_blank");
|
|
142
|
+
|
|
143
|
+
if (!newTab) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
event.preventDefault();
|
|
148
|
+
|
|
149
|
+
void navigateTabAfterRefresh(
|
|
150
|
+
newTab,
|
|
151
|
+
url,
|
|
152
|
+
refreshSession || refreshDashboardSession,
|
|
153
|
+
);
|
|
154
|
+
}
|