@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
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
import { mockRouter } from "./Helpers";
|
|
2
|
+
import CommonAPI from "../../../Server/API/CommonAPI";
|
|
3
|
+
import LlmProviderAPI from "../../../Server/API/LlmProviderAPI";
|
|
4
|
+
import LlmProviderService from "../../../Server/Services/LlmProviderService";
|
|
5
|
+
import {
|
|
6
|
+
ExpressRequest,
|
|
7
|
+
ExpressResponse,
|
|
8
|
+
NextFunction,
|
|
9
|
+
} from "../../../Server/Utils/Express";
|
|
10
|
+
import LLMService, {
|
|
11
|
+
LLMCompletionRequest,
|
|
12
|
+
LLMCompletionResponse,
|
|
13
|
+
LLMToolCall,
|
|
14
|
+
LLMToolDefinition,
|
|
15
|
+
} from "../../../Server/Utils/LLM/LLMService";
|
|
16
|
+
import logger from "../../../Server/Utils/Logger";
|
|
17
|
+
import Response from "../../../Server/Utils/Response";
|
|
18
|
+
import LlmProvider from "../../../Models/DatabaseModels/LlmProvider";
|
|
19
|
+
import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
20
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
21
|
+
import Exception from "../../../Types/Exception/Exception";
|
|
22
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
23
|
+
import LlmType from "../../../Types/LLM/LlmType";
|
|
24
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
25
|
+
import { getJestSpyOn } from "../../Spy";
|
|
26
|
+
import {
|
|
27
|
+
afterEach,
|
|
28
|
+
beforeAll,
|
|
29
|
+
beforeEach,
|
|
30
|
+
describe,
|
|
31
|
+
expect,
|
|
32
|
+
test,
|
|
33
|
+
} from "@jest/globals";
|
|
34
|
+
|
|
35
|
+
/*
|
|
36
|
+
* POST /llm-provider/test is the ONLY verdict an operator ever gets on an LLM
|
|
37
|
+
* provider before they hand it to the product. It used to answer a narrower
|
|
38
|
+
* question than the one the operator is actually asking: it sent a bare
|
|
39
|
+
* "Reply with the word: OK" prompt, and certified any provider that replied.
|
|
40
|
+
*
|
|
41
|
+
* Every OneUptime AI feature — Ask AI, investigations, the agent loops — reads
|
|
42
|
+
* the user's data EXCLUSIVELY through tools. A model or endpoint that holds a
|
|
43
|
+
* conversation but cannot call a tool is therefore unusable for all of them,
|
|
44
|
+
* and it passed this test with a clean "Connection successful." The operator
|
|
45
|
+
* left believing AI worked; the way they found out otherwise was a user asking
|
|
46
|
+
* Ask AI a question and being told the assistant has no tool for it (issue
|
|
47
|
+
* #3552 is exactly that complaint, reported as a missing feature rather than a
|
|
48
|
+
* misconfigured provider).
|
|
49
|
+
*
|
|
50
|
+
* So the route now offers the model a trivial tool and reports whether it
|
|
51
|
+
* called it. Three things about that are load-bearing and are what this file
|
|
52
|
+
* pins:
|
|
53
|
+
*
|
|
54
|
+
* 1. The probe REALLY OFFERS A TOOL — the request that reaches
|
|
55
|
+
* LLMService.getCompletion carries a non-empty `tools` array. Without
|
|
56
|
+
* that the rest is theatre.
|
|
57
|
+
* 2. A tool-blind provider is a WARNING, NEVER A FAILURE. Refusing to
|
|
58
|
+
* certify it would break a setup that works fine for everything except
|
|
59
|
+
* tool calling; saying nothing puts the operator back in #3552.
|
|
60
|
+
* 3. A provider that REJECTS the `tools` field outright still gets its
|
|
61
|
+
* original verdict. Some OpenAI-compatible backends 400 on an unknown
|
|
62
|
+
* field, and this button must not start reporting "connection failed" for
|
|
63
|
+
* a provider whose key, model and base URL are all correct.
|
|
64
|
+
*
|
|
65
|
+
* The handler is driven directly off the mock router's recorded route (the
|
|
66
|
+
* pattern used by AIChatRouteAuthorization / AIGenerationProjectAIToggle):
|
|
67
|
+
* Express and Response are module-mocked, so the response body is read off the
|
|
68
|
+
* Response call rather than off a socket. LlmProviderService.findOneById is
|
|
69
|
+
* stubbed so no database is touched.
|
|
70
|
+
*/
|
|
71
|
+
|
|
72
|
+
jest.mock("../../../Server/Utils/Express", () => {
|
|
73
|
+
return {
|
|
74
|
+
getRouter: () => {
|
|
75
|
+
return mockRouter;
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
jest.mock("../../../Server/Utils/Response", () => {
|
|
81
|
+
return {
|
|
82
|
+
sendJsonObjectResponse: jest.fn(),
|
|
83
|
+
sendEntityArrayResponse: jest.fn(),
|
|
84
|
+
sendEntityResponse: jest.fn(),
|
|
85
|
+
sendEmptySuccessResponse: jest.fn(),
|
|
86
|
+
sendErrorResponse: jest.fn(),
|
|
87
|
+
sendFileResponse: jest.fn(),
|
|
88
|
+
setNoCacheHeaders: jest.fn(),
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const TEST_ROUTE: string = "/llm-provider/test";
|
|
93
|
+
|
|
94
|
+
const PROVIDER_ID: ObjectID = new ObjectID(
|
|
95
|
+
"11111111-1111-4111-8111-111111111111",
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
99
|
+
"22222222-2222-4222-8222-222222222222",
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const USER_ID: ObjectID = new ObjectID("33333333-3333-4333-8333-333333333333");
|
|
103
|
+
|
|
104
|
+
/*
|
|
105
|
+
* The name of the probe tool, as the route both SENDS it and LOOKS FOR IT in
|
|
106
|
+
* the reply. It is a contract between the two halves of the handler, so it is
|
|
107
|
+
* written out here rather than read back off the request: a rename that
|
|
108
|
+
* updated only the outgoing definition would leave every real provider
|
|
109
|
+
* reported as tool-blind, and this constant is what catches that.
|
|
110
|
+
*/
|
|
111
|
+
const PROBE_TOOL_NAME: string = "connection_test_ping";
|
|
112
|
+
|
|
113
|
+
/*
|
|
114
|
+
* The verdict the route used to return for EVERY reachable provider, tool
|
|
115
|
+
* calling or not. Asserted against as a negative: a tool-blind provider must
|
|
116
|
+
* no longer be sent away with this.
|
|
117
|
+
*/
|
|
118
|
+
const PRE_FIX_SUCCESS_MESSAGE: string =
|
|
119
|
+
"Connection successful. The LLM provider responded to a test prompt.";
|
|
120
|
+
|
|
121
|
+
const PROVIDER_ERROR_MESSAGE: string =
|
|
122
|
+
"Incorrect API key provided: sk-****. You can find your API key at https://example.invalid/keys.";
|
|
123
|
+
|
|
124
|
+
let getCompletionSpy: jest.SpyInstance;
|
|
125
|
+
let providerLookupSpy: jest.SpyInstance;
|
|
126
|
+
|
|
127
|
+
/*
|
|
128
|
+
* A perfectly ordinary project-scoped provider: readable by the caller, not
|
|
129
|
+
* global (so the master-admin gate is not what decides anything here), and
|
|
130
|
+
* complete enough to be worth testing.
|
|
131
|
+
*/
|
|
132
|
+
function providerRow(): LlmProvider {
|
|
133
|
+
const provider: LlmProvider = new LlmProvider(PROVIDER_ID);
|
|
134
|
+
provider.projectId = PROJECT_ID;
|
|
135
|
+
provider.isGlobalLlm = false;
|
|
136
|
+
provider.llmType = LlmType.OpenAI;
|
|
137
|
+
provider.apiKey = "sk-connection-test";
|
|
138
|
+
provider.baseUrl = "https://example.invalid/v1";
|
|
139
|
+
provider.modelName = "gpt-connection-test";
|
|
140
|
+
return provider;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function callerProps(): DatabaseCommonInteractionProps {
|
|
144
|
+
return {
|
|
145
|
+
userId: USER_ID,
|
|
146
|
+
tenantId: PROJECT_ID,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// A completion the provider could plausibly have returned, with or without a tool call.
|
|
151
|
+
function completion(toolCalls?: Array<LLMToolCall>): LLMCompletionResponse {
|
|
152
|
+
return {
|
|
153
|
+
content: "OK",
|
|
154
|
+
...(toolCalls ? { toolCalls: toolCalls } : {}),
|
|
155
|
+
usage: undefined,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function probeToolCall(name: string): LLMToolCall {
|
|
160
|
+
return {
|
|
161
|
+
id: "call_1",
|
|
162
|
+
name: name,
|
|
163
|
+
arguments: {},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
type RouteCall = {
|
|
168
|
+
thrown: unknown;
|
|
169
|
+
nextCallCount: number;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
async function callTestRoute(body?: JSONObject): Promise<RouteCall> {
|
|
173
|
+
const req: ExpressRequest = {
|
|
174
|
+
body: body || { llmProviderId: PROVIDER_ID.toString() },
|
|
175
|
+
headers: {},
|
|
176
|
+
params: {},
|
|
177
|
+
query: {},
|
|
178
|
+
} as unknown as ExpressRequest;
|
|
179
|
+
|
|
180
|
+
const res: ExpressResponse = {} as ExpressResponse;
|
|
181
|
+
|
|
182
|
+
const next: jest.Mock = jest.fn();
|
|
183
|
+
|
|
184
|
+
await mockRouter
|
|
185
|
+
.match("post", TEST_ROUTE)
|
|
186
|
+
.handlerFunction(req, res, next as unknown as NextFunction);
|
|
187
|
+
|
|
188
|
+
return {
|
|
189
|
+
thrown: next.mock.calls[0] ? next.mock.calls[0][0] : undefined,
|
|
190
|
+
nextCallCount: next.mock.calls.length,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function sentPayload(): JSONObject {
|
|
195
|
+
const send: jest.Mock =
|
|
196
|
+
Response.sendJsonObjectResponse as unknown as jest.Mock;
|
|
197
|
+
return send.mock.calls[0]![2] as JSONObject;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function sentError(): Exception {
|
|
201
|
+
const send: jest.Mock = Response.sendErrorResponse as unknown as jest.Mock;
|
|
202
|
+
return send.mock.calls[0]![2] as Exception;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function sentMessage(): string {
|
|
206
|
+
return sentPayload()["message"] as string;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Every request the handler put on the wire, in order.
|
|
210
|
+
function completionRequests(): Array<LLMCompletionRequest> {
|
|
211
|
+
return getCompletionSpy.mock.calls.map(
|
|
212
|
+
(call: Array<unknown>): LLMCompletionRequest => {
|
|
213
|
+
return call[0] as LLMCompletionRequest;
|
|
214
|
+
},
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
beforeAll(() => {
|
|
219
|
+
mockRouter.routes.length = 0;
|
|
220
|
+
new LlmProviderAPI();
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
beforeEach(() => {
|
|
224
|
+
jest.clearAllMocks();
|
|
225
|
+
|
|
226
|
+
jest
|
|
227
|
+
.spyOn(CommonAPI, "getDatabaseCommonInteractionProps")
|
|
228
|
+
.mockResolvedValue(callerProps());
|
|
229
|
+
|
|
230
|
+
/*
|
|
231
|
+
* The handler reads the provider twice — once with the caller's props as an
|
|
232
|
+
* access check, once as root for the decrypted key. Both are stubbed with
|
|
233
|
+
* the same row so nothing reaches Postgres.
|
|
234
|
+
*/
|
|
235
|
+
providerLookupSpy = getJestSpyOn(LlmProviderService, "findOneById");
|
|
236
|
+
providerLookupSpy.mockImplementation(async (): Promise<LlmProvider> => {
|
|
237
|
+
return providerRow();
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
getCompletionSpy = getJestSpyOn(LLMService, "getCompletion");
|
|
241
|
+
getCompletionSpy.mockResolvedValue(
|
|
242
|
+
completion([probeToolCall(PROBE_TOOL_NAME)]),
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
// The fallback paths log the provider's error; keep the test output clean.
|
|
246
|
+
getJestSpyOn(logger, "error").mockImplementation((): void => {
|
|
247
|
+
return undefined;
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
afterEach(() => {
|
|
252
|
+
jest.restoreAllMocks();
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
describe("POST /llm-provider/test - the probe actually exercises tool calling", () => {
|
|
256
|
+
test("the test completion is sent with a non-empty tools array", async () => {
|
|
257
|
+
/*
|
|
258
|
+
* The bug this whole change exists for: the connection test asked the
|
|
259
|
+
* provider a question that any chat endpoint can answer, and therefore
|
|
260
|
+
* could not tell a provider that works for Ask AI from one that does not.
|
|
261
|
+
* A probe with no `tools` on the request measures nothing.
|
|
262
|
+
*/
|
|
263
|
+
await callTestRoute();
|
|
264
|
+
|
|
265
|
+
const requests: Array<LLMCompletionRequest> = completionRequests();
|
|
266
|
+
|
|
267
|
+
expect(requests.length).toBeGreaterThan(0);
|
|
268
|
+
|
|
269
|
+
const tools: Array<LLMToolDefinition> = requests[0]!
|
|
270
|
+
.tools as Array<LLMToolDefinition>;
|
|
271
|
+
|
|
272
|
+
expect(Array.isArray(tools)).toBe(true);
|
|
273
|
+
expect(tools.length).toBeGreaterThan(0);
|
|
274
|
+
expect(
|
|
275
|
+
tools.map((tool: LLMToolDefinition): string => {
|
|
276
|
+
return tool.name;
|
|
277
|
+
}),
|
|
278
|
+
).toContain(PROBE_TOOL_NAME);
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
test("the probe leaves room in the output budget for a tool call", async () => {
|
|
282
|
+
/*
|
|
283
|
+
* The old prompt only had to fit the word "OK", so the cap was 16 tokens.
|
|
284
|
+
* A tool call is a JSON payload with a name and an argument object; capped
|
|
285
|
+
* at 16 tokens the provider gets cut off mid-call and a perfectly capable
|
|
286
|
+
* model is reported as tool-blind. The exact number is not the contract —
|
|
287
|
+
* "more than the old one-word budget" is.
|
|
288
|
+
*/
|
|
289
|
+
await callTestRoute();
|
|
290
|
+
|
|
291
|
+
expect(completionRequests()[0]!.maxTokens).toBeGreaterThan(16);
|
|
292
|
+
|
|
293
|
+
/*
|
|
294
|
+
* And past reasoning overhead: on gpt-5/o-series the thinking tokens are
|
|
295
|
+
* billed against this same cap, so a tight budget makes a fully capable
|
|
296
|
+
* provider stop at "length" with nothing emitted and get reported as
|
|
297
|
+
* unverified.
|
|
298
|
+
*/
|
|
299
|
+
expect(completionRequests()[0]!.maxTokens).toBeGreaterThanOrEqual(1024);
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
describe("POST /llm-provider/test - verdict when the model calls the tool", () => {
|
|
304
|
+
test("reports supportsToolCalling true and says tool calling was used", async () => {
|
|
305
|
+
getCompletionSpy.mockResolvedValue(
|
|
306
|
+
completion([probeToolCall(PROBE_TOOL_NAME)]),
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
await callTestRoute();
|
|
310
|
+
|
|
311
|
+
const payload: JSONObject = sentPayload();
|
|
312
|
+
|
|
313
|
+
expect(payload["success"]).toBe(true);
|
|
314
|
+
expect(payload["supportsToolCalling"]).toBe(true);
|
|
315
|
+
expect(sentMessage()).toMatch(/tool calling/i);
|
|
316
|
+
expect(sentMessage()).not.toMatch(/did not/i);
|
|
317
|
+
expect(Response.sendErrorResponse).not.toHaveBeenCalled();
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
test("a tool call for some other tool does not count as tool calling", async () => {
|
|
321
|
+
/*
|
|
322
|
+
* The check is "did it call THE TOOL WE OFFERED", not "did it emit
|
|
323
|
+
* something in the tool-calls field". A provider echoing an unrelated or
|
|
324
|
+
* hallucinated tool name has not demonstrated the capability, and
|
|
325
|
+
* accepting it would put the operator right back in #3552.
|
|
326
|
+
*/
|
|
327
|
+
getCompletionSpy.mockResolvedValue(
|
|
328
|
+
completion([probeToolCall("some_other_tool")]),
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
await callTestRoute();
|
|
332
|
+
|
|
333
|
+
expect(sentPayload()["success"]).toBe(true);
|
|
334
|
+
expect(sentPayload()["supportsToolCalling"]).toBe(false);
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
describe("POST /llm-provider/test - verdict when the model ignores the tool", () => {
|
|
339
|
+
test("still succeeds, but flags the missing capability", async () => {
|
|
340
|
+
/*
|
|
341
|
+
* A tool-blind provider must NOT be rejected: its key, model and base URL
|
|
342
|
+
* may be entirely correct, and this button is also how an operator checks
|
|
343
|
+
* those. But it must not be waved through with the old bare
|
|
344
|
+
* "Connection successful." either — that sentence is precisely what let
|
|
345
|
+
* #3552 reach a user.
|
|
346
|
+
*/
|
|
347
|
+
getCompletionSpy.mockResolvedValue(completion());
|
|
348
|
+
|
|
349
|
+
await callTestRoute();
|
|
350
|
+
|
|
351
|
+
const payload: JSONObject = sentPayload();
|
|
352
|
+
|
|
353
|
+
expect(payload["success"]).toBe(true);
|
|
354
|
+
expect(payload["supportsToolCalling"]).toBe(false);
|
|
355
|
+
|
|
356
|
+
expect(sentMessage()).not.toBe(PRE_FIX_SUCCESS_MESSAGE);
|
|
357
|
+
expect(sentMessage()).toMatch(/tool calling could not be verified/i);
|
|
358
|
+
expect(sentMessage()).toMatch(/answered in prose/i);
|
|
359
|
+
|
|
360
|
+
expect(Response.sendErrorResponse).not.toHaveBeenCalled();
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
test("an empty toolCalls array is treated as no tool call", async () => {
|
|
364
|
+
getCompletionSpy.mockResolvedValue(completion([]));
|
|
365
|
+
|
|
366
|
+
await callTestRoute();
|
|
367
|
+
|
|
368
|
+
expect(sentPayload()["success"]).toBe(true);
|
|
369
|
+
expect(sentPayload()["supportsToolCalling"]).toBe(false);
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
test("a reply cut off at the output cap is reported as truncated, not tool-blind", async () => {
|
|
373
|
+
/*
|
|
374
|
+
* stopReason "length" means the provider stopped generating because it hit
|
|
375
|
+
* maxTokens — the model may have been about to emit the tool call. On a
|
|
376
|
+
* reasoning model the thinking tokens alone can reach the cap. Reporting
|
|
377
|
+
* that as "this model answered in prose instead of calling the tool" would
|
|
378
|
+
* send the operator to replace a model that is perfectly capable, so the
|
|
379
|
+
* verdict has to name what actually happened.
|
|
380
|
+
*/
|
|
381
|
+
getCompletionSpy.mockResolvedValue({
|
|
382
|
+
...completion(),
|
|
383
|
+
stopReason: "length",
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
await callTestRoute();
|
|
387
|
+
|
|
388
|
+
expect(sentPayload()["success"]).toBe(true);
|
|
389
|
+
expect(sentPayload()["supportsToolCalling"]).toBe(false);
|
|
390
|
+
expect(sentMessage()).toMatch(/output limit/i);
|
|
391
|
+
expect(sentMessage()).not.toMatch(/answered in prose/i);
|
|
392
|
+
|
|
393
|
+
/*
|
|
394
|
+
* And it must not send the operator off to replace the model. A reasoning
|
|
395
|
+
* model spends its thinking tokens against this same cap, so "length" is
|
|
396
|
+
* the one no-tool-call outcome that carries no information about the
|
|
397
|
+
* provider's capability.
|
|
398
|
+
*/
|
|
399
|
+
expect(sentMessage()).not.toMatch(/support tool\/function calling/i);
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
test("a tool call still counts even when the reply was truncated after it", async () => {
|
|
403
|
+
/*
|
|
404
|
+
* The capability is proven by the call itself; where generation stopped
|
|
405
|
+
* afterwards says nothing about it.
|
|
406
|
+
*/
|
|
407
|
+
getCompletionSpy.mockResolvedValue({
|
|
408
|
+
...completion([probeToolCall(PROBE_TOOL_NAME)]),
|
|
409
|
+
stopReason: "length",
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
await callTestRoute();
|
|
413
|
+
|
|
414
|
+
expect(sentPayload()["supportsToolCalling"]).toBe(true);
|
|
415
|
+
expect(sentMessage()).not.toMatch(/could not be verified/i);
|
|
416
|
+
});
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
describe("POST /llm-provider/test - provider rejects the tools parameter", () => {
|
|
420
|
+
test("falls back to a tool-less prompt and still certifies the connection", async () => {
|
|
421
|
+
/*
|
|
422
|
+
* The regression guard for OpenAI-compatible backends that 400 on an
|
|
423
|
+
* unknown `tools` field. Before the fallback existed, adding the probe
|
|
424
|
+
* would have turned this button from "your provider is fine" into
|
|
425
|
+
* "connection failed" for every one of them — a worse bug than the one
|
|
426
|
+
* being fixed. The retry carries NO tools, otherwise it fails the same way.
|
|
427
|
+
*/
|
|
428
|
+
getCompletionSpy
|
|
429
|
+
.mockRejectedValueOnce(
|
|
430
|
+
new BadDataException("Unrecognized request argument supplied: tools"),
|
|
431
|
+
)
|
|
432
|
+
.mockResolvedValueOnce(completion());
|
|
433
|
+
|
|
434
|
+
await callTestRoute();
|
|
435
|
+
|
|
436
|
+
const requests: Array<LLMCompletionRequest> = completionRequests();
|
|
437
|
+
|
|
438
|
+
expect(requests.length).toBe(2);
|
|
439
|
+
expect((requests[0]!.tools || []).length).toBeGreaterThan(0);
|
|
440
|
+
expect(requests[1]!.tools).toBeUndefined();
|
|
441
|
+
|
|
442
|
+
const payload: JSONObject = sentPayload();
|
|
443
|
+
|
|
444
|
+
expect(payload["success"]).toBe(true);
|
|
445
|
+
expect(payload["supportsToolCalling"]).toBe(false);
|
|
446
|
+
expect(sentMessage()).toMatch(/tool calling could not be verified/i);
|
|
447
|
+
|
|
448
|
+
/*
|
|
449
|
+
* The message reports what was OBSERVED — the tool-offering request
|
|
450
|
+
* failed and only the plain prompt got through — rather than asserting
|
|
451
|
+
* WHY. The first call could equally have hit a timeout or a rate limit,
|
|
452
|
+
* and telling an operator their model "rejected the tools parameter"
|
|
453
|
+
* when it did not sends them off to swap a perfectly good model.
|
|
454
|
+
*/
|
|
455
|
+
expect(sentMessage()).toMatch(/offered a tool failed/i);
|
|
456
|
+
|
|
457
|
+
expect(Response.sendErrorResponse).not.toHaveBeenCalled();
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
test("a tool call in the fallback reply cannot fake tool support", async () => {
|
|
461
|
+
/*
|
|
462
|
+
* The fallback offered no tools, so nothing it returns is evidence of tool
|
|
463
|
+
* calling. Reading the flag off the second reply would let a provider that
|
|
464
|
+
* refuses the field entirely be certified as tool-capable.
|
|
465
|
+
*/
|
|
466
|
+
getCompletionSpy
|
|
467
|
+
.mockRejectedValueOnce(new BadDataException("tools is not supported"))
|
|
468
|
+
.mockResolvedValueOnce(completion([probeToolCall(PROBE_TOOL_NAME)]));
|
|
469
|
+
|
|
470
|
+
await callTestRoute();
|
|
471
|
+
|
|
472
|
+
expect(sentPayload()["success"]).toBe(true);
|
|
473
|
+
expect(sentPayload()["supportsToolCalling"]).toBe(false);
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
describe("POST /llm-provider/test - the provider is genuinely unreachable", () => {
|
|
478
|
+
test("both attempts failing still surfaces the provider's own error", async () => {
|
|
479
|
+
/*
|
|
480
|
+
* The original job of this button — telling the operator that their key,
|
|
481
|
+
* model or base URL is wrong, IN THE PROVIDER'S OWN WORDS — has to survive
|
|
482
|
+
* the added probe. It would be easy for the new retry to swallow the
|
|
483
|
+
* second error and report something generic instead. That half is a drift
|
|
484
|
+
* guard: it held before the probe existed and must still hold.
|
|
485
|
+
*
|
|
486
|
+
* The attempt count is not a guard. A genuinely unreachable provider must
|
|
487
|
+
* be tried BOTH ways before it is condemned, otherwise the tool-less
|
|
488
|
+
* fallback is not really a fallback.
|
|
489
|
+
*/
|
|
490
|
+
getCompletionSpy.mockRejectedValue(
|
|
491
|
+
new BadDataException(PROVIDER_ERROR_MESSAGE),
|
|
492
|
+
);
|
|
493
|
+
|
|
494
|
+
const call: RouteCall = await callTestRoute();
|
|
495
|
+
|
|
496
|
+
expect(call.nextCallCount).toBe(0);
|
|
497
|
+
expect(Response.sendJsonObjectResponse).not.toHaveBeenCalled();
|
|
498
|
+
|
|
499
|
+
const error: Exception = sentError();
|
|
500
|
+
|
|
501
|
+
expect(error).toBeInstanceOf(BadDataException);
|
|
502
|
+
expect(error.message).toContain("LLM Provider test failed");
|
|
503
|
+
expect(error.message).toContain(PROVIDER_ERROR_MESSAGE);
|
|
504
|
+
|
|
505
|
+
// Both attempts were made before giving up.
|
|
506
|
+
expect(completionRequests().length).toBe(2);
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
test("a provider that is not readable by the caller is refused before any completion", async () => {
|
|
510
|
+
/*
|
|
511
|
+
* DRIFT GUARD (passes before and after the fix). The access check runs
|
|
512
|
+
* ahead of the probe, so the added tool call must not become a way to make
|
|
513
|
+
* the platform talk to a provider the caller cannot read.
|
|
514
|
+
*/
|
|
515
|
+
providerLookupSpy.mockResolvedValue(null);
|
|
516
|
+
|
|
517
|
+
await callTestRoute();
|
|
518
|
+
|
|
519
|
+
expect(getCompletionSpy).not.toHaveBeenCalled();
|
|
520
|
+
expect(sentError()).toBeInstanceOf(BadDataException);
|
|
521
|
+
});
|
|
522
|
+
});
|