@oneuptime/common 12.0.32 → 12.0.33
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/AnalyticsModels/Span.ts +14 -0
- package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
- package/Models/DatabaseModels/Index.ts +10 -0
- package/Models/DatabaseModels/Monitor.ts +76 -0
- package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
- package/Models/DatabaseModels/NetworkDevice.ts +176 -1
- package/Models/DatabaseModels/NetworkSite.ts +201 -2
- package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
- package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
- package/Models/DatabaseModels/TelemetryException.ts +119 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
- package/Server/API/EnterpriseLicenseAPI.ts +391 -64
- package/Server/API/LlmProviderAPI.ts +137 -22
- package/Server/EnvironmentConfig.ts +14 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Infrastructure/QueueWorker.ts +38 -8
- package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
- package/Server/Middleware/ProjectAuthorization.ts +11 -0
- package/Server/Middleware/SCIMAuthorization.ts +12 -0
- package/Server/Middleware/TelemetryIngest.ts +11 -0
- package/Server/Services/AIBillingService.ts +101 -27
- package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
- package/Server/Services/EnterpriseLicenseService.ts +55 -0
- package/Server/Services/Index.ts +10 -0
- package/Server/Services/MonitorService.ts +143 -21
- package/Server/Services/MonitorStatusTimelineService.ts +150 -8
- package/Server/Services/MonitorTemplateService.ts +217 -1
- package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
- package/Server/Services/NetworkAlertPolicyService.ts +944 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
- package/Server/Services/NetworkDeviceService.ts +1032 -73
- package/Server/Services/NetworkSiteService.ts +1502 -129
- package/Server/Services/NetworkSiteTypeService.ts +1216 -0
- package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
- package/Server/Services/NotificationService.ts +118 -28
- package/Server/Services/ProjectService.ts +105 -48
- package/Server/Services/StatusPagePrivateUserService.ts +103 -3
- package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
- package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
- package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
- package/Server/Services/UserNotificationSettingService.ts +62 -25
- package/Server/Services/UserService.ts +95 -0
- package/Server/Types/Database/QueryHelper.ts +2 -2
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
- package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
- package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
- package/Server/Utils/DataSource/HttpFetch.ts +9 -2
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
- package/Server/Utils/LLM/LLMService.ts +78 -0
- package/Server/Utils/LogRedaction.ts +8 -0
- package/Server/Utils/Logger.ts +79 -1
- package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
- package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
- package/Server/Utils/OutboundUserAgent.ts +152 -0
- package/Server/Utils/StartServer.ts +51 -19
- package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
- package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
- package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
- package/Server/Utils/Telemetry.ts +198 -51
- package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
- package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
- package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
- package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
- package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
- package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
- package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
- package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
- package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
- package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
- package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
- package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
- package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
- package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
- package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
- package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
- package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
- package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
- package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
- package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
- package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
- package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
- package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
- package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
- package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
- package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
- package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
- package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
- package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
- package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
- package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
- package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
- package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
- package/Tests/Server/Utils/Captcha.test.ts +422 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
- package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
- package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
- package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
- package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
- package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
- package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
- package/Tests/Server/Utils/Telemetry.test.ts +456 -66
- package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
- package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
- package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
- package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
- package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
- package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
- package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
- package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
- package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
- package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
- package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
- package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
- package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
- package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
- package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
- package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
- package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
- package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
- package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
- package/Types/AI/ExceptionAIClassification.ts +10 -24
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
- package/Types/Exception/ApiException.ts +10 -0
- package/Types/Exception/BadDataException.ts +11 -0
- package/Types/Exception/BadRequestException.ts +11 -0
- package/Types/Exception/Exception.ts +65 -0
- package/Types/Exception/ForbiddenException.ts +10 -0
- package/Types/Exception/NotAuthenticatedException.ts +10 -0
- package/Types/Exception/NotAuthorizedException.ts +10 -0
- package/Types/Exception/NotFoundException.ts +11 -0
- package/Types/Exception/PayloadTooLargeException.ts +11 -0
- package/Types/Exception/PaymentRequiredException.ts +10 -0
- package/Types/Exception/ServiceUnavailableException.ts +10 -0
- package/Types/Exception/SsoAuthorizationException.ts +10 -0
- package/Types/Exception/TenantNotFoundException.ts +11 -0
- package/Types/Exception/TimeoutException.ts +10 -0
- package/Types/Exception/TooManyRequestsException.ts +10 -0
- package/Types/Exception/UnableToReachServer.ts +10 -0
- package/Types/Exception/WebsiteRequestException.ts +10 -0
- package/Types/Monitor/CriteriaFilter.ts +60 -2
- package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
- package/Types/Monitor/MonitorMetricType.ts +71 -0
- package/Types/Monitor/MonitorStep.ts +76 -0
- package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
- package/Types/Monitor/MonitorType.ts +47 -1
- package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
- package/Types/Monitor/SqlConnectionConfig.ts +31 -0
- package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
- package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
- package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
- package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
- package/Types/Permission.ts +90 -0
- package/Types/Probe/ProbeMonitorResponse.ts +16 -0
- package/Types/Telemetry/ErrorClass.ts +274 -0
- package/Types/Telemetry/UnitOfWork.ts +59 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
- package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
- package/UI/Components/Modal/Modal.tsx +2 -8
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
- package/UI/Components/SideMenu/SideMenu.tsx +123 -5
- package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
- package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
- package/UI/Components/SideOver/SideOver.tsx +21 -20
- package/UI/Utils/PageScrollLock.ts +79 -3
- package/UI/Utils/PermissionGate.ts +61 -0
- package/UI/Utils/SensitiveUrlToken.ts +112 -0
- package/UI/Utils/TestLLMProvider.ts +11 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
- package/Utils/Monitor/MonitorMetricType.ts +153 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
- package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
- package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
- package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
- package/build/dist/Models/AnalyticsModels/Span.js +14 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +10 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/LlmProviderAPI.js +108 -13
- package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +12 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIBillingService.js +70 -16
- package/build/dist/Server/Services/AIBillingService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +10 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +119 -21
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
- package/build/dist/Server/Services/NotificationService.js +80 -17
- package/build/dist/Server/Services/NotificationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +66 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +90 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
- package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +8 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +63 -1
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +38 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +162 -46
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
- package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
- package/build/dist/Types/Exception/ApiException.js +9 -0
- package/build/dist/Types/Exception/ApiException.js.map +1 -1
- package/build/dist/Types/Exception/BadDataException.js +10 -0
- package/build/dist/Types/Exception/BadDataException.js.map +1 -1
- package/build/dist/Types/Exception/BadRequestException.js +10 -0
- package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
- package/build/dist/Types/Exception/Exception.js +56 -0
- package/build/dist/Types/Exception/Exception.js.map +1 -1
- package/build/dist/Types/Exception/ForbiddenException.js +9 -0
- package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
- package/build/dist/Types/Exception/NotFoundException.js +10 -0
- package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
- package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
- package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
- package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
- package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
- package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
- package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/TimeoutException.js +9 -0
- package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
- package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
- package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
- package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
- package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
- package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +54 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +45 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
- package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
- package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +80 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
- package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -7
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +31 -3
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +42 -1
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
- package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
- package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
- package/package.json +2 -2
|
@@ -5,16 +5,19 @@ import WorkspaceUserNotificationService from "../../../Server/Services/Workspace
|
|
|
5
5
|
import ProjectCallSMSConfigService from "../../../Server/Services/ProjectCallSMSConfigService";
|
|
6
6
|
import MailService from "../../../Server/Services/MailService";
|
|
7
7
|
import UserEmailService from "../../../Server/Services/UserEmailService";
|
|
8
|
+
import UserNotificationEmailRollupItemService from "../../../Server/Services/UserNotificationEmailRollupItemService";
|
|
8
9
|
import logger from "../../../Server/Utils/Logger";
|
|
9
10
|
import UserNotificationSetting from "../../../Models/DatabaseModels/UserNotificationSetting";
|
|
10
11
|
import UserSlack from "../../../Models/DatabaseModels/UserSlack";
|
|
11
12
|
import UserMicrosoftTeams from "../../../Models/DatabaseModels/UserMicrosoftTeams";
|
|
12
13
|
import UserEmail from "../../../Models/DatabaseModels/UserEmail";
|
|
14
|
+
import UserNotificationEmailRollupItem from "../../../Models/DatabaseModels/UserNotificationEmailRollupItem";
|
|
13
15
|
import { CallRequestMessage } from "../../../Types/Call/CallRequest";
|
|
14
16
|
import { EmailEnvelope } from "../../../Types/Email/EmailMessage";
|
|
15
17
|
import EmailTemplateType from "../../../Types/Email/EmailTemplateType";
|
|
16
18
|
import NotificationSettingEventType from "../../../Types/NotificationSetting/NotificationSettingEventType";
|
|
17
19
|
import ObjectID from "../../../Types/ObjectID";
|
|
20
|
+
import PositiveNumber from "../../../Types/PositiveNumber";
|
|
18
21
|
import PushNotificationMessage from "../../../Types/PushNotification/PushNotificationMessage";
|
|
19
22
|
import { SMSMessage } from "../../../Types/SMS/SMS";
|
|
20
23
|
import { WhatsAppMessagePayload } from "../../../Types/WhatsApp/WhatsAppMessage";
|
|
@@ -150,6 +153,23 @@ describe("UserNotificationSettingService.sendUserNotification - workspace channe
|
|
|
150
153
|
.spyOn(MailService, "sendMail")
|
|
151
154
|
.mockResolvedValue(undefined as never);
|
|
152
155
|
|
|
156
|
+
/*
|
|
157
|
+
* The email branch now runs through EmailRollupWriter, which counts this
|
|
158
|
+
* address's recent owner emails and writes a ledger row before sending.
|
|
159
|
+
* Both are stubbed here on purpose rather than left unmocked: an unmocked
|
|
160
|
+
* countBy rejects with no database, the writer's fail-open catch swallows
|
|
161
|
+
* that, and every email assertion in this suite would then be exercising
|
|
162
|
+
* the failure path. "Below the burst threshold nothing changed" has to be
|
|
163
|
+
* pinned deliberately, not by accident.
|
|
164
|
+
*/
|
|
165
|
+
jest
|
|
166
|
+
.spyOn(UserNotificationEmailRollupItemService, "countBy")
|
|
167
|
+
.mockResolvedValue(new PositiveNumber(0) as never);
|
|
168
|
+
|
|
169
|
+
jest
|
|
170
|
+
.spyOn(UserNotificationEmailRollupItemService, "create")
|
|
171
|
+
.mockResolvedValue(new UserNotificationEmailRollupItem() as never);
|
|
172
|
+
|
|
153
173
|
findSlacks = jest.spyOn(UserSlackService, "findBy").mockResolvedValue([
|
|
154
174
|
{
|
|
155
175
|
id: new ObjectID("44444444-4444-4444-8444-444444444444"),
|
|
@@ -431,7 +451,88 @@ describe("UserNotificationSettingService.sendUserNotification - workspace channe
|
|
|
431
451
|
|
|
432
452
|
/*
|
|
433
453
|
* ----------------------------------------------------------------------- *
|
|
434
|
-
* (D)
|
|
454
|
+
* (D) The email hand-off is unchanged by the rollup seam.
|
|
455
|
+
* -----------------------------------------------------------------------
|
|
456
|
+
*/
|
|
457
|
+
|
|
458
|
+
describe("the email hand-off", () => {
|
|
459
|
+
/*
|
|
460
|
+
* Owner emails now pass through EmailRollupWriter on their way to
|
|
461
|
+
* MailService. Below the burst threshold that has to be invisible, and
|
|
462
|
+
* "invisible" means these two exact arguments - not merely an email that
|
|
463
|
+
* arrives. The second argument is the correlation-id bag every downstream
|
|
464
|
+
* log line joins on, so a field silently dropped in the hand-off would
|
|
465
|
+
* detach incident emails from their incident with nothing failing.
|
|
466
|
+
*/
|
|
467
|
+
test("MailService receives the identical envelope and correlation-id options it received before rollup existed", async () => {
|
|
468
|
+
findSettings.mockResolvedValue(
|
|
469
|
+
settingsRow({ alertByEmail: true }) as never,
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
await UserNotificationSettingService.sendUserNotification(
|
|
473
|
+
notificationData(),
|
|
474
|
+
);
|
|
475
|
+
|
|
476
|
+
expect(sendMail).toHaveBeenCalledTimes(1);
|
|
477
|
+
|
|
478
|
+
expect(sendMail.mock.calls[0]?.[0]).toEqual({
|
|
479
|
+
subject: "Incident created: Checkout is down",
|
|
480
|
+
templateType: EmailTemplateType.BlankTemplate,
|
|
481
|
+
vars: {},
|
|
482
|
+
toEmail: "user@example.com",
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
expect(sendMail.mock.calls[0]?.[1]).toEqual({
|
|
486
|
+
projectId: PROJECT_ID,
|
|
487
|
+
incidentId: INCIDENT_ID,
|
|
488
|
+
alertId: undefined,
|
|
489
|
+
alertEpisodeId: undefined,
|
|
490
|
+
incidentEpisodeId: undefined,
|
|
491
|
+
monitorId: undefined,
|
|
492
|
+
scheduledMaintenanceId: undefined,
|
|
493
|
+
statusPageId: undefined,
|
|
494
|
+
statusPageAnnouncementId: undefined,
|
|
495
|
+
userId: USER_ID,
|
|
496
|
+
teamId: undefined,
|
|
497
|
+
onCallPolicyId: undefined,
|
|
498
|
+
onCallPolicyEscalationRuleId: undefined,
|
|
499
|
+
onCallDutyPolicyExecutionLogTimelineId: undefined,
|
|
500
|
+
onCallScheduleId: undefined,
|
|
501
|
+
});
|
|
502
|
+
|
|
503
|
+
/*
|
|
504
|
+
* toEqual treats an explicitly-undefined property as absent, so the key
|
|
505
|
+
* set is pinned separately - otherwise the hand-off could quietly stop
|
|
506
|
+
* forwarding a field and this test would still pass.
|
|
507
|
+
*/
|
|
508
|
+
const optionKeys: Array<string> = Object.keys(
|
|
509
|
+
sendMail.mock.calls[0]?.[1] as Record<string, unknown>,
|
|
510
|
+
).sort();
|
|
511
|
+
expect(optionKeys).toEqual(
|
|
512
|
+
[
|
|
513
|
+
"alertEpisodeId",
|
|
514
|
+
"alertId",
|
|
515
|
+
"incidentEpisodeId",
|
|
516
|
+
"incidentId",
|
|
517
|
+
"monitorId",
|
|
518
|
+
"onCallDutyPolicyExecutionLogTimelineId",
|
|
519
|
+
"onCallPolicyEscalationRuleId",
|
|
520
|
+
"onCallPolicyId",
|
|
521
|
+
"onCallScheduleId",
|
|
522
|
+
"projectId",
|
|
523
|
+
"scheduledMaintenanceId",
|
|
524
|
+
"statusPageAnnouncementId",
|
|
525
|
+
"statusPageId",
|
|
526
|
+
"teamId",
|
|
527
|
+
"userId",
|
|
528
|
+
].sort(),
|
|
529
|
+
);
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
/*
|
|
534
|
+
* ----------------------------------------------------------------------- *
|
|
535
|
+
* (E) Failure isolation.
|
|
435
536
|
* -----------------------------------------------------------------------
|
|
436
537
|
*/
|
|
437
538
|
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import DatabaseRequestType from "../../../../../Server/Types/BaseDatabase/DatabaseRequestType";
|
|
2
|
+
import OwnedScopePermission from "../../../../../Server/Types/Database/Permissions/OwnedScopePermission";
|
|
3
|
+
import TablePermission from "../../../../../Server/Types/Database/Permissions/TablePermission";
|
|
4
|
+
import Dashboard from "../../../../../Models/DatabaseModels/Dashboard";
|
|
5
|
+
import DatabaseCommonInteractionProps from "../../../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
6
|
+
import PermissionScope from "../../../../../Types/Database/AccessControl/PermissionScope";
|
|
7
|
+
import ObjectID from "../../../../../Types/ObjectID";
|
|
8
|
+
import Permission, {
|
|
9
|
+
UserPermission,
|
|
10
|
+
UserTenantAccessPermission,
|
|
11
|
+
} from "../../../../../Types/Permission";
|
|
12
|
+
import { FindOperator } from "typeorm";
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
* github.com/OneUptime/oneuptime/issues/3550 reported that a user holding only
|
|
16
|
+
* the read-only `Viewer` and `MonitorViewer` roles could open a dashboard they
|
|
17
|
+
* were not an owner of AND save changes to it.
|
|
18
|
+
*
|
|
19
|
+
* These tests pin down what the server actually does, because the two halves of
|
|
20
|
+
* that report have different answers:
|
|
21
|
+
*
|
|
22
|
+
* - Reading is allowed, and is meant to be. `Viewer` is documented as
|
|
23
|
+
* "read-only access across all project resources", and the reported team
|
|
24
|
+
* granted it at scope "All resources in project". Narrowing visibility to
|
|
25
|
+
* the resources somebody owns is what the `Owned` scope on the permission
|
|
26
|
+
* row is for - the last two tests here are the proof that it reaches
|
|
27
|
+
* dashboards.
|
|
28
|
+
*
|
|
29
|
+
* - Writing was never allowed. Dashboard's update ACL is
|
|
30
|
+
* [ProjectOwner, ProjectAdmin, EditDashboard], so the PUT the editor
|
|
31
|
+
* eventually sends is refused. What was broken lived entirely in the UI,
|
|
32
|
+
* which offered the whole editing surface to a reader and only surfaced the
|
|
33
|
+
* refusal after the work was done (see
|
|
34
|
+
* Common/Tests/App/Dashboard/DashboardEditPermissions.test.tsx). These
|
|
35
|
+
* cases stand guard over the ACL that makes that refusal happen.
|
|
36
|
+
*/
|
|
37
|
+
describe("Dashboard access control (issue #3550)", () => {
|
|
38
|
+
const projectId: ObjectID = ObjectID.generate();
|
|
39
|
+
const userId: ObjectID = ObjectID.generate();
|
|
40
|
+
|
|
41
|
+
type MakePropsFunction = (
|
|
42
|
+
permissions: Array<Permission>,
|
|
43
|
+
scope?: PermissionScope | undefined,
|
|
44
|
+
) => DatabaseCommonInteractionProps;
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* The permission set a member of the reported team actually carries:
|
|
48
|
+
* whatever their team grants, plus the implicit grants every signed-in
|
|
49
|
+
* project member gets (see UserPermissionUtil).
|
|
50
|
+
*/
|
|
51
|
+
const makeProps: MakePropsFunction = (
|
|
52
|
+
permissions: Array<Permission>,
|
|
53
|
+
scope?: PermissionScope | undefined,
|
|
54
|
+
): DatabaseCommonInteractionProps => {
|
|
55
|
+
const userPermissions: Array<UserPermission> = permissions.map(
|
|
56
|
+
(permission: Permission) => {
|
|
57
|
+
return {
|
|
58
|
+
_type: "UserPermission" as const,
|
|
59
|
+
permission: permission,
|
|
60
|
+
labelIds: [],
|
|
61
|
+
isBlockPermission: false,
|
|
62
|
+
...(scope ? { scope: scope } : {}),
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
// Implicit grants - never scoped, never stored on a TeamPermission row.
|
|
68
|
+
for (const implicitPermission of [
|
|
69
|
+
Permission.CurrentUser,
|
|
70
|
+
Permission.ProjectUser,
|
|
71
|
+
Permission.UnAuthorizedSsoUser,
|
|
72
|
+
]) {
|
|
73
|
+
userPermissions.push({
|
|
74
|
+
_type: "UserPermission",
|
|
75
|
+
permission: implicitPermission,
|
|
76
|
+
labelIds: [],
|
|
77
|
+
isBlockPermission: false,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const tenantPermission: UserTenantAccessPermission = {
|
|
82
|
+
projectId,
|
|
83
|
+
_type: "UserTenantAccessPermission",
|
|
84
|
+
permissions: userPermissions,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
userId,
|
|
89
|
+
tenantId: projectId,
|
|
90
|
+
userTenantAccessPermission: {
|
|
91
|
+
[projectId.toString()]: tenantPermission,
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
type CheckFunction = (
|
|
97
|
+
permissions: Array<Permission>,
|
|
98
|
+
type: DatabaseRequestType,
|
|
99
|
+
) => Error | null;
|
|
100
|
+
|
|
101
|
+
const check: CheckFunction = (
|
|
102
|
+
permissions: Array<Permission>,
|
|
103
|
+
type: DatabaseRequestType,
|
|
104
|
+
): Error | null => {
|
|
105
|
+
try {
|
|
106
|
+
TablePermission.checkTableLevelPermissions(
|
|
107
|
+
Dashboard,
|
|
108
|
+
makeProps(permissions),
|
|
109
|
+
type,
|
|
110
|
+
);
|
|
111
|
+
} catch (err) {
|
|
112
|
+
return err as Error;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return null;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const readOnlyRoles: Array<Permission> = [
|
|
119
|
+
Permission.Viewer,
|
|
120
|
+
Permission.MonitorViewer,
|
|
121
|
+
];
|
|
122
|
+
|
|
123
|
+
describe("the roles from the report", () => {
|
|
124
|
+
test("Viewer + Monitor Viewer may READ a dashboard", () => {
|
|
125
|
+
expect(check(readOnlyRoles, DatabaseRequestType.Read)).toBeNull();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test("Viewer + Monitor Viewer may NOT update a dashboard", () => {
|
|
129
|
+
const error: Error | null = check(
|
|
130
|
+
readOnlyRoles,
|
|
131
|
+
DatabaseRequestType.Update,
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
expect(error).not.toBeNull();
|
|
135
|
+
expect(error?.message).toContain(
|
|
136
|
+
"You do not have permissions to update Dashboard",
|
|
137
|
+
);
|
|
138
|
+
/*
|
|
139
|
+
* The message names the permissions that would work, in their human
|
|
140
|
+
* titles. The UI gate reproduces this same sentence so the two do not
|
|
141
|
+
* read like different products.
|
|
142
|
+
*/
|
|
143
|
+
expect(error?.message).toContain("Edit Dashboard");
|
|
144
|
+
expect(error?.message).toContain("Project Admin");
|
|
145
|
+
expect(error?.message).toContain("Project Owner");
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test("Viewer + Monitor Viewer may NOT create a dashboard", () => {
|
|
149
|
+
const error: Error | null = check(
|
|
150
|
+
readOnlyRoles,
|
|
151
|
+
DatabaseRequestType.Create,
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
expect(error).not.toBeNull();
|
|
155
|
+
expect(error?.message).toContain(
|
|
156
|
+
"You do not have permissions to create Dashboard",
|
|
157
|
+
);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test("Viewer + Monitor Viewer may NOT delete a dashboard", () => {
|
|
161
|
+
const error: Error | null = check(
|
|
162
|
+
readOnlyRoles,
|
|
163
|
+
DatabaseRequestType.Delete,
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
expect(error).not.toBeNull();
|
|
167
|
+
expect(error?.message).toContain(
|
|
168
|
+
"You do not have permissions to delete Dashboard",
|
|
169
|
+
);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
/*
|
|
173
|
+
* The project-wide Viewer role is read-only by definition, so it must not
|
|
174
|
+
* pick up write access to a dashboard by any route - not through the
|
|
175
|
+
* granular Dashboard permissions and not through the operational
|
|
176
|
+
* wildcards, neither of which it holds.
|
|
177
|
+
*/
|
|
178
|
+
test("no combination of the reported roles grants a write", () => {
|
|
179
|
+
for (const type of [
|
|
180
|
+
DatabaseRequestType.Create,
|
|
181
|
+
DatabaseRequestType.Update,
|
|
182
|
+
DatabaseRequestType.Delete,
|
|
183
|
+
]) {
|
|
184
|
+
expect(check([Permission.Viewer], type)).not.toBeNull();
|
|
185
|
+
expect(check([Permission.MonitorViewer], type)).not.toBeNull();
|
|
186
|
+
expect(check(readOnlyRoles, type)).not.toBeNull();
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
describe("the permissions that DO grant a write", () => {
|
|
192
|
+
test("Edit Dashboard allows an update", () => {
|
|
193
|
+
expect(
|
|
194
|
+
check([Permission.EditDashboard], DatabaseRequestType.Update),
|
|
195
|
+
).toBeNull();
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test("Project Admin allows an update", () => {
|
|
199
|
+
expect(
|
|
200
|
+
check([Permission.ProjectAdmin], DatabaseRequestType.Update),
|
|
201
|
+
).toBeNull();
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
/*
|
|
205
|
+
* Dashboard is @OperationalResource, so the wildcard covers it even though
|
|
206
|
+
* it is not enumerated in the model's ACL. The UI gate has to know this
|
|
207
|
+
* too, or it would lock the editor for somebody the API would let through.
|
|
208
|
+
*/
|
|
209
|
+
test("Edit All Operational Resources allows an update", () => {
|
|
210
|
+
expect(
|
|
211
|
+
check(
|
|
212
|
+
[Permission.EditAllOperationalResources],
|
|
213
|
+
DatabaseRequestType.Update,
|
|
214
|
+
),
|
|
215
|
+
).toBeNull();
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test("Read All Operational Resources does NOT allow an update", () => {
|
|
219
|
+
expect(
|
|
220
|
+
check(
|
|
221
|
+
[Permission.ReadAllOperationalResources],
|
|
222
|
+
DatabaseRequestType.Update,
|
|
223
|
+
),
|
|
224
|
+
).not.toBeNull();
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
* The half of the report that is a configuration answer rather than a bug:
|
|
230
|
+
* "a dashboard with no assigned Owner should not be visible to arbitrary
|
|
231
|
+
* team members". That is exactly what scope `Owned` does, and Dashboard is
|
|
232
|
+
* registered in the owner-table registry so it resolves through
|
|
233
|
+
* DashboardOwnerUser / DashboardOwnerTeam.
|
|
234
|
+
*/
|
|
235
|
+
describe("restricting visibility to owners via the Owned scope", () => {
|
|
236
|
+
const ownedDashboardId: ObjectID = ObjectID.generate();
|
|
237
|
+
|
|
238
|
+
afterEach(() => {
|
|
239
|
+
jest.restoreAllMocks();
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
* The ids end up as bound parameters on a Raw operator, so the values are
|
|
244
|
+
* read off objectLiteralParameters rather than off `value`.
|
|
245
|
+
*/
|
|
246
|
+
type BoundValuesFunction = (operator: FindOperator<any>) => Array<string>;
|
|
247
|
+
|
|
248
|
+
const boundValues: BoundValuesFunction = (
|
|
249
|
+
operator: FindOperator<any>,
|
|
250
|
+
): Array<string> => {
|
|
251
|
+
/*
|
|
252
|
+
* `in` binds the whole id list to a single parameter, `equalTo` binds one
|
|
253
|
+
* value per parameter - flatten so both shapes read the same here.
|
|
254
|
+
*/
|
|
255
|
+
return Object.values(
|
|
256
|
+
(operator.objectLiteralParameters || {}) as Record<string, unknown>,
|
|
257
|
+
).flatMap((value: unknown) => {
|
|
258
|
+
return Array.isArray(value) ? value.map(String) : [String(value)];
|
|
259
|
+
});
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
test("an Owned-scoped Viewer only sees dashboards they own", async () => {
|
|
263
|
+
jest
|
|
264
|
+
.spyOn(OwnedScopePermission as any, "getAllowedResourceIds")
|
|
265
|
+
.mockResolvedValue([ownedDashboardId]);
|
|
266
|
+
|
|
267
|
+
const query: any = await OwnedScopePermission.addOwnedScopeToQuery(
|
|
268
|
+
Dashboard,
|
|
269
|
+
{ projectId } as any,
|
|
270
|
+
makeProps([Permission.Viewer], PermissionScope.Owned),
|
|
271
|
+
DatabaseRequestType.Read,
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
expect(query._id).toBeInstanceOf(FindOperator);
|
|
275
|
+
expect(boundValues(query._id)).toEqual([ownedDashboardId.toString()]);
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
test("an Owned-scoped Viewer who owns no dashboard sees none", async () => {
|
|
279
|
+
jest
|
|
280
|
+
.spyOn(OwnedScopePermission as any, "getAllowedResourceIds")
|
|
281
|
+
.mockResolvedValue([]);
|
|
282
|
+
|
|
283
|
+
const query: any = await OwnedScopePermission.addOwnedScopeToQuery(
|
|
284
|
+
Dashboard,
|
|
285
|
+
{ projectId } as any,
|
|
286
|
+
makeProps([Permission.Viewer], PermissionScope.Owned),
|
|
287
|
+
DatabaseRequestType.Read,
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
/*
|
|
291
|
+
* Matches nothing rather than everything. A dashboard with an empty
|
|
292
|
+
* Owners list is owned by nobody, so it drops out of the result for
|
|
293
|
+
* every Owned-scoped reader - which is the behaviour the report asked
|
|
294
|
+
* for.
|
|
295
|
+
*/
|
|
296
|
+
expect(query._id).toBeInstanceOf(FindOperator);
|
|
297
|
+
expect(boundValues(query._id)).toEqual([
|
|
298
|
+
ObjectID.getZeroObjectID().toString(),
|
|
299
|
+
]);
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
/*
|
|
303
|
+
* The scope the reported team actually had. Documented here so the
|
|
304
|
+
* difference between the two configurations is not folklore.
|
|
305
|
+
*/
|
|
306
|
+
test("an All-scoped Viewer is not narrowed to owned dashboards", async () => {
|
|
307
|
+
jest
|
|
308
|
+
.spyOn(OwnedScopePermission as any, "getAllowedResourceIds")
|
|
309
|
+
.mockResolvedValue([ownedDashboardId]);
|
|
310
|
+
|
|
311
|
+
const query: any = await OwnedScopePermission.addOwnedScopeToQuery(
|
|
312
|
+
Dashboard,
|
|
313
|
+
{ projectId } as any,
|
|
314
|
+
makeProps([Permission.Viewer], PermissionScope.All),
|
|
315
|
+
DatabaseRequestType.Read,
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
expect(query._id).toBeUndefined();
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import QueryHelper from "../../../../Server/Types/Database/QueryHelper";
|
|
2
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
2
3
|
import { FindOperator } from "typeorm";
|
|
3
4
|
import { describe, expect, it } from "@jest/globals";
|
|
4
5
|
|
|
@@ -64,6 +65,22 @@ describe("QueryHelper comparison operators — exact rendered SQL", () => {
|
|
|
64
65
|
expect(operator.objectLiteralParameters[param]).toBe(5);
|
|
65
66
|
});
|
|
66
67
|
|
|
68
|
+
it("greaterThan stringifies and binds an ObjectID cursor", () => {
|
|
69
|
+
const cursor: ObjectID = new ObjectID(
|
|
70
|
+
"11111111-1111-4111-8111-111111111111",
|
|
71
|
+
);
|
|
72
|
+
const operator: RawOperator = asRaw(QueryHelper.greaterThan(cursor));
|
|
73
|
+
const param: string = soleParamName(operator);
|
|
74
|
+
const alias: string = '"NetworkSite"."_id"';
|
|
75
|
+
const sql: string = operator.getSql(alias);
|
|
76
|
+
|
|
77
|
+
expect(sql).toBe(`(${alias} > :${param})`);
|
|
78
|
+
expect(sql).not.toContain(cursor.toString());
|
|
79
|
+
expect(sql).not.toContain(">=");
|
|
80
|
+
expect(operator.objectLiteralParameters[param]).toBe(cursor.toString());
|
|
81
|
+
expect(operator.objectLiteralParameters[param]).not.toBe(cursor);
|
|
82
|
+
});
|
|
83
|
+
|
|
67
84
|
it("greaterThanEqualTo emits an INCLUSIVE `>=`", () => {
|
|
68
85
|
const operator: RawOperator = asRaw(QueryHelper.greaterThanEqualTo(5));
|
|
69
86
|
|
|
@@ -51,6 +51,7 @@ function buildAlert(data?: {
|
|
|
51
51
|
number?: number;
|
|
52
52
|
title?: string;
|
|
53
53
|
state?: string;
|
|
54
|
+
monitorName?: string;
|
|
54
55
|
}): Alert {
|
|
55
56
|
const alert: Alert = new Alert();
|
|
56
57
|
alert._id = ObjectID.generate().toString();
|
|
@@ -58,6 +59,15 @@ function buildAlert(data?: {
|
|
|
58
59
|
alert.alertNumber = data?.number ?? 42;
|
|
59
60
|
alert.createdAt = new Date("2026-08-01T00:00:00Z");
|
|
60
61
|
|
|
62
|
+
/*
|
|
63
|
+
* Left unset on purpose when no name is given: an alert can be raised by
|
|
64
|
+
* hand or by a workflow, with no monitor behind it at all, and that shape
|
|
65
|
+
* has to survive serialization too.
|
|
66
|
+
*/
|
|
67
|
+
if (data?.monitorName) {
|
|
68
|
+
alert.monitor = buildMonitor({ name: data.monitorName });
|
|
69
|
+
}
|
|
70
|
+
|
|
61
71
|
const state: AlertState = new AlertState();
|
|
62
72
|
state.name = data?.state ?? "Created";
|
|
63
73
|
alert.currentAlertState = state;
|
|
@@ -308,6 +318,120 @@ describe("query_alerts — detail mode owners", () => {
|
|
|
308
318
|
});
|
|
309
319
|
});
|
|
310
320
|
|
|
321
|
+
/*
|
|
322
|
+
* The alerts page ships "Which monitor or source is generating the most alerts
|
|
323
|
+
* recently?" as a first-class suggested prompt, and query_alerts is the only
|
|
324
|
+
* tool that can answer it. Until an alert row carried the monitor it was
|
|
325
|
+
* raised for, the model had nothing to group by and could only guess a source
|
|
326
|
+
* out of alert titles. So the monitor is pinned in two places here: the select
|
|
327
|
+
* that reaches the database (a column that is never selected can never be
|
|
328
|
+
* returned, no matter what the row mapper does) and the serialized rows the
|
|
329
|
+
* model actually reads.
|
|
330
|
+
*/
|
|
331
|
+
describe("query_alerts — originating monitor", () => {
|
|
332
|
+
test("the list branch selects and returns the monitor each alert was raised for", async () => {
|
|
333
|
+
const findBySpy: jest.SpyInstance = jest
|
|
334
|
+
.spyOn(AlertService, "findBy")
|
|
335
|
+
.mockResolvedValue([
|
|
336
|
+
buildAlert({ title: "Latency spike", monitorName: "Payments API" }),
|
|
337
|
+
buildAlert({ title: "5xx rate high", monitorName: "Checkout Web" }),
|
|
338
|
+
] as never);
|
|
339
|
+
jest
|
|
340
|
+
.spyOn(AlertService, "countBy")
|
|
341
|
+
.mockResolvedValue(new PositiveNumber(2) as never);
|
|
342
|
+
|
|
343
|
+
const result: ToolExecutionResult = await QueryAlertsTool.execute(
|
|
344
|
+
{ state: "active" },
|
|
345
|
+
ctx,
|
|
346
|
+
);
|
|
347
|
+
|
|
348
|
+
const select: JSONObject = (findBySpy.mock.calls[0]?.[0] as JSONObject)[
|
|
349
|
+
"select"
|
|
350
|
+
] as JSONObject;
|
|
351
|
+
expect(select["monitor"]).toEqual({ name: true });
|
|
352
|
+
|
|
353
|
+
// One monitor per row — grouping by source is only possible if each row names its own.
|
|
354
|
+
expect(result.dataForLlm).toContain("monitor=Payments API");
|
|
355
|
+
expect(result.dataForLlm).toContain("monitor=Checkout Web");
|
|
356
|
+
|
|
357
|
+
/*
|
|
358
|
+
* The widget is built from the same rows, so the field travels in its
|
|
359
|
+
* payload too. EntityListWidget does not render a monitor today — this
|
|
360
|
+
* pins the payload shape, not a user-visible outcome.
|
|
361
|
+
*/
|
|
362
|
+
const items: Array<JSONObject> = result.widget?.data.items ?? [];
|
|
363
|
+
expect(items).toHaveLength(2);
|
|
364
|
+
expect(items[0]?.["monitor"]).toBe("Payments API");
|
|
365
|
+
expect(items[1]?.["monitor"]).toBe("Checkout Web");
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
test("the single-alert branch selects and returns the originating monitor too", async () => {
|
|
369
|
+
const alertId: ObjectID = ObjectID.generate();
|
|
370
|
+
|
|
371
|
+
const findOneByIdSpy: jest.SpyInstance = jest
|
|
372
|
+
.spyOn(AlertService, "findOneById")
|
|
373
|
+
.mockResolvedValue(
|
|
374
|
+
buildAlert({
|
|
375
|
+
title: "Latency spike",
|
|
376
|
+
monitorName: "Payments API",
|
|
377
|
+
}) as never,
|
|
378
|
+
);
|
|
379
|
+
jest.spyOn(AlertOwnerTeamService, "findBy").mockResolvedValue([] as never);
|
|
380
|
+
jest.spyOn(AlertOwnerUserService, "findBy").mockResolvedValue([] as never);
|
|
381
|
+
|
|
382
|
+
const result: ToolExecutionResult = await QueryAlertsTool.execute(
|
|
383
|
+
{ alertId: alertId.toString() },
|
|
384
|
+
ctx,
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
const select: JSONObject = (
|
|
388
|
+
findOneByIdSpy.mock.calls[0]?.[0] as JSONObject
|
|
389
|
+
)["select"] as JSONObject;
|
|
390
|
+
expect(select["monitor"]).toEqual({ name: true });
|
|
391
|
+
|
|
392
|
+
/*
|
|
393
|
+
* "What is this alert even watching?" is the first question asked of a
|
|
394
|
+
* single alert, and the detail row is the only place it can be answered.
|
|
395
|
+
*/
|
|
396
|
+
expect(result.dataForLlm).toContain("monitor=Payments API");
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
test("an alert with no monitor serializes cleanly and emits no monitor field", async () => {
|
|
400
|
+
jest
|
|
401
|
+
.spyOn(AlertService, "findBy")
|
|
402
|
+
.mockResolvedValue([buildAlert({ title: "Raised by hand" })] as never);
|
|
403
|
+
jest
|
|
404
|
+
.spyOn(AlertService, "countBy")
|
|
405
|
+
.mockResolvedValue(new PositiveNumber(1) as never);
|
|
406
|
+
|
|
407
|
+
const result: ToolExecutionResult = await QueryAlertsTool.execute(
|
|
408
|
+
{ state: "active" },
|
|
409
|
+
ctx,
|
|
410
|
+
);
|
|
411
|
+
|
|
412
|
+
expect(result.rowCount).toBe(1);
|
|
413
|
+
expect(result.dataForLlm).toContain("Raised by hand");
|
|
414
|
+
|
|
415
|
+
/*
|
|
416
|
+
* Nothing is better than something wrong here: the field is dropped
|
|
417
|
+
* outright rather than emitted as an empty or "undefined" source that the
|
|
418
|
+
* model would then count as a monitor of its own.
|
|
419
|
+
*/
|
|
420
|
+
expect(result.dataForLlm).not.toContain("monitor=");
|
|
421
|
+
const items: Array<JSONObject> = result.widget?.data.items ?? [];
|
|
422
|
+
expect(items[0]?.["monitor"]).toBeUndefined();
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
test("the tool description advertises the monitor so the model plans around it", () => {
|
|
426
|
+
/*
|
|
427
|
+
* The model chooses tools from their descriptions, not from the shape of
|
|
428
|
+
* results it has not fetched yet. A field nothing advertises is a field it
|
|
429
|
+
* will not go looking for.
|
|
430
|
+
*/
|
|
431
|
+
expect(QueryAlertsTool.description.toLowerCase()).toContain("monitor");
|
|
432
|
+
});
|
|
433
|
+
});
|
|
434
|
+
|
|
311
435
|
describe("query_monitors — problemsOnly filter", () => {
|
|
312
436
|
test("problemsOnly=true filters on isOperationalState=false at the DB level", async () => {
|
|
313
437
|
const downStatus: MonitorStatus = buildMonitorStatus({
|