@oneuptime/common 12.0.13 → 12.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
- package/Models/DatabaseModels/UserCall.ts +94 -3
- package/Models/DatabaseModels/UserEmail.ts +94 -3
- package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
- package/Models/DatabaseModels/UserPush.ts +37 -0
- package/Models/DatabaseModels/UserSMS.ts +94 -3
- package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
- package/Server/API/BaseAPI.ts +79 -14
- package/Server/API/UserCallAPI.ts +53 -45
- package/Server/API/UserEmailAPI.ts +53 -44
- package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
- package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
- package/Server/API/UserPushAPI.ts +126 -2
- package/Server/API/UserSmsAPI.ts +53 -44
- package/Server/API/UserWhatsAppAPI.ts +53 -50
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/DatabaseService.ts +101 -0
- package/Server/Services/LogAggregationService.ts +5 -0
- package/Server/Services/PushNotificationService.ts +127 -12
- package/Server/Services/TeamMemberService.ts +53 -13
- package/Server/Services/UserCallService.ts +55 -24
- package/Server/Services/UserEmailService.ts +83 -17
- package/Server/Services/UserIncomingCallNumberService.ts +49 -85
- package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
- package/Server/Services/UserNotificationRuleService.ts +26 -0
- package/Server/Services/UserPushService.ts +89 -0
- package/Server/Services/UserSmsService.ts +50 -17
- package/Server/Services/UserWhatsAppService.ts +48 -15
- package/Server/Types/Database/QueryHelper.ts +30 -0
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
- package/Server/Utils/ChannelVerification.ts +510 -0
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
- package/Server/Utils/TotpAuth.ts +137 -9
- package/Server/Utils/UserRegistrationToken.ts +182 -0
- package/Server/Utils/VerificationCode.ts +134 -0
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +28 -0
- package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
- package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
- package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
- package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
- package/Tests/Server/API/UserSmsApi.test.ts +107 -14
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
- package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
- package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
- package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
- package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
- package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
- package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
- package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
- package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
- package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
- package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
- package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
- package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
- package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
- package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
- package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
- package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
- package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
- package/Tests/Server/Utils/Browser.test.ts +162 -0
- package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
- package/Tests/Server/Utils/Express.test.ts +371 -0
- package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
- package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
- package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
- package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
- package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
- package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
- package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
- package/Tests/Types/Call/CallRequest.test.ts +189 -0
- package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
- package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
- package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
- package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
- package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
- package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
- package/Tests/Types/TextRandomGeneration.test.ts +211 -0
- package/Tests/UI/Components/Button.test.tsx +175 -1
- package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
- package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
- package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
- package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
- package/Tests/UI/Components/List.test.tsx +9 -2
- package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
- package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
- package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
- package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
- package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
- package/Tests/UI/Components/Skeleton.test.tsx +71 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
- package/Tests/UI/Components/Tabs.test.tsx +24 -0
- package/Tests/UI/Components/Toast.test.tsx +130 -7
- package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
- package/Tests/UI/Utils/Dropdown.test.ts +423 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
- package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
- package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
- package/Tests/Utils/API.test.ts +16 -2
- package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
- package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
- package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
- package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
- package/Types/Permission.ts +35 -0
- package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
- package/Types/PushNotification/PushNotificationMessage.ts +15 -0
- package/Types/PushNotification/PushNotificationRequest.ts +8 -16
- package/Types/Service/ServiceLanguage.ts +144 -0
- package/Types/Text.ts +111 -19
- package/UI/Components/Button/Button.tsx +27 -14
- package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
- package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
- package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
- package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
- package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
- package/UI/Components/CommandPalette/Types.ts +49 -0
- package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/Feed/FeedItem.tsx +1 -1
- package/UI/Components/List/List.tsx +37 -5
- package/UI/Components/List/ListSkeleton.tsx +54 -0
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
- package/UI/Components/Modal/Modal.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
- package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
- package/UI/Components/Navbar/NavBar.tsx +14 -1
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
- package/UI/Components/SideOver/SideOver.tsx +37 -2
- package/UI/Components/Skeleton/Skeleton.tsx +53 -0
- package/UI/Components/Table/Table.tsx +74 -44
- package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
- package/UI/Components/Tabs/Tab.tsx +1 -1
- package/UI/Components/Toast/Toast.tsx +118 -53
- package/UI/Components/Toast/ToastInit.tsx +82 -32
- package/UI/Styles/Theme.css +40 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
- package/UI/Utils/ModelListCache.ts +188 -0
- package/UI/Utils/Project.ts +29 -0
- package/Utils/API.ts +6 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
- package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
- package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
- package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
- package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +69 -13
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +42 -38
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +42 -38
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
- package/build/dist/Server/API/UserPushAPI.js +95 -2
- package/build/dist/Server/API/UserPushAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +42 -38
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +74 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +5 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +69 -30
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +43 -7
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/UserCallService.js +54 -22
- package/build/dist/Server/Services/UserCallService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +78 -17
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserPushService.js +77 -0
- package/build/dist/Server/Services/UserPushService.js.map +1 -1
- package/build/dist/Server/Services/UserSmsService.js +50 -17
- package/build/dist/Server/Services/UserSmsService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
- package/build/dist/Server/Utils/ChannelVerification.js +348 -0
- package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/TotpAuth.js +127 -8
- package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
- package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
- package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
- package/build/dist/Server/Utils/VerificationCode.js +120 -0
- package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +33 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
- package/build/dist/Types/Service/ServiceLanguage.js +96 -0
- package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
- package/build/dist/Types/Text.js +82 -17
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +22 -14
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
- package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/List/List.js +19 -5
- package/build/dist/UI/Components/List/List.js.map +1 -1
- package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
- package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
- package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +35 -24
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
- package/build/dist/UI/Components/Tabs/Tab.js +1 -1
- package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
- package/build/dist/UI/Components/Toast/Toast.js +77 -23
- package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
- package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
- package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelListCache.js +126 -0
- package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
- package/build/dist/UI/Utils/Project.js +24 -1
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/Utils/API.js +6 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/jest.config.json +1 -1
- package/package.json +2 -3
- package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
- package/Tests/__mocks__/otpauth.js +0 -30
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
|
@@ -5,6 +5,7 @@ import RecommendationType from "../../Recommendation/RecommendationType";
|
|
|
5
5
|
import {
|
|
6
6
|
MonitorRecommendation,
|
|
7
7
|
MonitorRecommendationArgs,
|
|
8
|
+
MonitorRecommendationContext,
|
|
8
9
|
MonitorRecommendationResourceType,
|
|
9
10
|
MonitorRecommendationSeverity,
|
|
10
11
|
buildRecommendationId,
|
|
@@ -46,6 +47,11 @@ import {
|
|
|
46
47
|
RumAlertTemplate,
|
|
47
48
|
getAllRumAlertTemplates,
|
|
48
49
|
} from "../RumAlertTemplates";
|
|
50
|
+
import {
|
|
51
|
+
ServiceAlertTemplate,
|
|
52
|
+
getAllServiceAlertTemplates,
|
|
53
|
+
getServiceAlertTemplates,
|
|
54
|
+
} from "../ServiceAlertTemplates";
|
|
49
55
|
|
|
50
56
|
/*
|
|
51
57
|
* A resource type's entry in the registry.
|
|
@@ -70,17 +76,49 @@ export interface MonitorRecommendationResourceTypeDefinition {
|
|
|
70
76
|
| "clusterIdentifier"
|
|
71
77
|
| "hostIdentifier"
|
|
72
78
|
| "fleetIdentifier"
|
|
73
|
-
| "rumApplicationId"
|
|
79
|
+
| "rumApplicationId"
|
|
80
|
+
| "serviceId";
|
|
74
81
|
icon: IconProp;
|
|
75
|
-
|
|
82
|
+
/*
|
|
83
|
+
* What to recommend for ONE resource of this type.
|
|
84
|
+
*
|
|
85
|
+
* Nine of the ten resource types ignore the argument entirely — every
|
|
86
|
+
* Kubernetes cluster is offered the same eighteen recommendations, and a
|
|
87
|
+
* zero-argument function satisfies this type, so those nine are declared
|
|
88
|
+
* exactly as they were. Services are the exception: see
|
|
89
|
+
* `MonitorRecommendationContext`.
|
|
90
|
+
*
|
|
91
|
+
* Passing no context means "nothing is known about this resource", and the
|
|
92
|
+
* only honest answer to that is the context-free subset. It does NOT mean
|
|
93
|
+
* "give me everything" — that is what `getAllPossibleRecommendations` is
|
|
94
|
+
* for, and conflating the two is how a UI ends up offering JVM monitors to
|
|
95
|
+
* a Go service.
|
|
96
|
+
*/
|
|
97
|
+
getRecommendations: (
|
|
98
|
+
context?: MonitorRecommendationContext | undefined,
|
|
99
|
+
) => Array<MonitorRecommendation>;
|
|
100
|
+
/*
|
|
101
|
+
* Every recommendation this resource type can EVER produce, across every
|
|
102
|
+
* context. Only worth setting on a resource type whose set actually varies;
|
|
103
|
+
* `getAllRecommendations` falls back to `getRecommendations()` for the rest.
|
|
104
|
+
*
|
|
105
|
+
* This is what the registry-wide invariants have to run against — globally
|
|
106
|
+
* unique recommendation ids, globally distinct coverage fingerprints,
|
|
107
|
+
* a severity every mapper understands. Running them over the context-free
|
|
108
|
+
* subset instead would leave every language-specific template unchecked,
|
|
109
|
+
* which is precisely the set most likely to collide.
|
|
110
|
+
*/
|
|
111
|
+
getAllPossibleRecommendations?:
|
|
112
|
+
| (() => Array<MonitorRecommendation>)
|
|
113
|
+
| undefined;
|
|
76
114
|
}
|
|
77
115
|
|
|
78
116
|
/*
|
|
79
|
-
* The structural shape every `<X>AlertTemplate` interface shares. The
|
|
80
|
-
* modules declare
|
|
117
|
+
* The structural shape every `<X>AlertTemplate` interface shares. The ten
|
|
118
|
+
* modules declare ten separate interfaces that differ only in the literal
|
|
81
119
|
* union used for `category` (and the args type of `getMonitorStep`), so the
|
|
82
120
|
* normalizer below widens `category` to `string` rather than trying to union
|
|
83
|
-
*
|
|
121
|
+
* ten unrelated literal unions.
|
|
84
122
|
*/
|
|
85
123
|
interface StructuralAlertTemplate {
|
|
86
124
|
id: string;
|
|
@@ -307,6 +345,55 @@ function getRumRecommendations(): Array<MonitorRecommendation> {
|
|
|
307
345
|
});
|
|
308
346
|
}
|
|
309
347
|
|
|
348
|
+
/*
|
|
349
|
+
* The Service adapter, and the only one that is two functions rather than one.
|
|
350
|
+
*
|
|
351
|
+
* `getServiceRecommendations` answers "what should THIS service be offered",
|
|
352
|
+
* which depends on its runtime. `getAllServiceRecommendations` answers "what
|
|
353
|
+
* can a service ever be offered", which does not. Both go through the same
|
|
354
|
+
* normalizer so a template cannot be shaped differently depending on which
|
|
355
|
+
* door it came through.
|
|
356
|
+
*/
|
|
357
|
+
function normalizeServiceTemplate(
|
|
358
|
+
template: ServiceAlertTemplate,
|
|
359
|
+
): MonitorRecommendation {
|
|
360
|
+
return normalize({
|
|
361
|
+
resourceType: MonitorRecommendationResourceType.Service,
|
|
362
|
+
/*
|
|
363
|
+
* Read off the template rather than fixed, because the service catalog —
|
|
364
|
+
* like RUM's — deliberately spans metric, trace and exception monitors.
|
|
365
|
+
*/
|
|
366
|
+
monitorType: template.monitorType,
|
|
367
|
+
template: template,
|
|
368
|
+
getMonitorStep: (args: MonitorRecommendationArgs) => {
|
|
369
|
+
return template.getMonitorStep({
|
|
370
|
+
serviceId: args.resourceIdentifier,
|
|
371
|
+
onlineMonitorStatusId: args.onlineMonitorStatusId,
|
|
372
|
+
offlineMonitorStatusId: args.offlineMonitorStatusId,
|
|
373
|
+
defaultIncidentSeverityId: args.defaultIncidentSeverityId,
|
|
374
|
+
defaultAlertSeverityId: args.defaultAlertSeverityId,
|
|
375
|
+
monitorName: args.monitorName,
|
|
376
|
+
});
|
|
377
|
+
},
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
function getServiceRecommendations(
|
|
382
|
+
context?: MonitorRecommendationContext | undefined,
|
|
383
|
+
): Array<MonitorRecommendation> {
|
|
384
|
+
return getServiceAlertTemplates(context?.serviceLanguage).map(
|
|
385
|
+
(template: ServiceAlertTemplate) => {
|
|
386
|
+
return normalizeServiceTemplate(template);
|
|
387
|
+
},
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
function getAllServiceRecommendations(): Array<MonitorRecommendation> {
|
|
392
|
+
return getAllServiceAlertTemplates().map((template: ServiceAlertTemplate) => {
|
|
393
|
+
return normalizeServiceTemplate(template);
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
|
|
310
397
|
const RESOURCE_TYPE_DEFINITIONS: Array<MonitorRecommendationResourceTypeDefinition> =
|
|
311
398
|
[
|
|
312
399
|
{
|
|
@@ -385,6 +472,19 @@ const RESOURCE_TYPE_DEFINITIONS: Array<MonitorRecommendationResourceTypeDefiniti
|
|
|
385
472
|
icon: IconProp.Globe,
|
|
386
473
|
getRecommendations: getRumRecommendations,
|
|
387
474
|
},
|
|
475
|
+
{
|
|
476
|
+
resourceType: MonitorRecommendationResourceType.Service,
|
|
477
|
+
monitorTypes: [
|
|
478
|
+
MonitorType.Metrics,
|
|
479
|
+
MonitorType.Traces,
|
|
480
|
+
MonitorType.Exceptions,
|
|
481
|
+
],
|
|
482
|
+
resourceLabel: "Service",
|
|
483
|
+
identifierFieldName: "serviceId",
|
|
484
|
+
icon: IconProp.Code,
|
|
485
|
+
getRecommendations: getServiceRecommendations,
|
|
486
|
+
getAllPossibleRecommendations: getAllServiceRecommendations,
|
|
487
|
+
},
|
|
388
488
|
];
|
|
389
489
|
|
|
390
490
|
export default class MonitorRecommendationCatalog {
|
|
@@ -402,8 +502,14 @@ export default class MonitorRecommendationCatalog {
|
|
|
402
502
|
);
|
|
403
503
|
}
|
|
404
504
|
|
|
505
|
+
/*
|
|
506
|
+
* What to offer ONE resource. `context` is what a caller knows about that
|
|
507
|
+
* specific resource; omitting it is a valid answer meaning "nothing", and
|
|
508
|
+
* yields the subset that is true of every resource of this type.
|
|
509
|
+
*/
|
|
405
510
|
public static getRecommendations(
|
|
406
511
|
resourceType: MonitorRecommendationResourceType,
|
|
512
|
+
context?: MonitorRecommendationContext | undefined,
|
|
407
513
|
): Array<MonitorRecommendation> {
|
|
408
514
|
const definition: MonitorRecommendationResourceTypeDefinition | undefined =
|
|
409
515
|
this.getResourceTypeDefinition(resourceType);
|
|
@@ -412,13 +518,26 @@ export default class MonitorRecommendationCatalog {
|
|
|
412
518
|
return [];
|
|
413
519
|
}
|
|
414
520
|
|
|
415
|
-
return definition.getRecommendations();
|
|
521
|
+
return definition.getRecommendations(context);
|
|
416
522
|
}
|
|
417
523
|
|
|
524
|
+
/*
|
|
525
|
+
* Every recommendation the catalog can produce, for any resource, in any
|
|
526
|
+
* context.
|
|
527
|
+
*
|
|
528
|
+
* Deliberately takes no context. Its two jobs — resolving a
|
|
529
|
+
* `recommendationId` back to its recommendation, and giving the
|
|
530
|
+
* registry-wide invariant tests something exhaustive to run over — are both
|
|
531
|
+
* jobs where filtering would silently weaken the answer. Resolving an id in
|
|
532
|
+
* particular has to work from a dismissal row alone, which carries no
|
|
533
|
+
* language.
|
|
534
|
+
*/
|
|
418
535
|
public static getAllRecommendations(): Array<MonitorRecommendation> {
|
|
419
536
|
return RESOURCE_TYPE_DEFINITIONS.flatMap(
|
|
420
537
|
(definition: MonitorRecommendationResourceTypeDefinition) => {
|
|
421
|
-
return definition.
|
|
538
|
+
return definition.getAllPossibleRecommendations
|
|
539
|
+
? definition.getAllPossibleRecommendations()
|
|
540
|
+
: definition.getRecommendations();
|
|
422
541
|
},
|
|
423
542
|
);
|
|
424
543
|
}
|
|
@@ -441,10 +560,14 @@ export default class MonitorRecommendationCatalog {
|
|
|
441
560
|
*/
|
|
442
561
|
public static getCategories(
|
|
443
562
|
resourceType: MonitorRecommendationResourceType,
|
|
563
|
+
context?: MonitorRecommendationContext | undefined,
|
|
444
564
|
): Array<string> {
|
|
445
565
|
const categories: Array<string> = [];
|
|
446
566
|
|
|
447
|
-
for (const recommendation of this.getRecommendations(
|
|
567
|
+
for (const recommendation of this.getRecommendations(
|
|
568
|
+
resourceType,
|
|
569
|
+
context,
|
|
570
|
+
)) {
|
|
448
571
|
if (!categories.includes(recommendation.category)) {
|
|
449
572
|
categories.push(recommendation.category);
|
|
450
573
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import ObjectID from "../../ObjectID";
|
|
2
2
|
import RecommendationType from "../../Recommendation/RecommendationType";
|
|
3
|
+
import { ServiceLanguage } from "../../Service/ServiceLanguage";
|
|
3
4
|
import MonitorStep from "../MonitorStep";
|
|
4
5
|
import MonitorType from "../MonitorType";
|
|
5
6
|
|
|
@@ -10,9 +11,14 @@ import MonitorType from "../MonitorType";
|
|
|
10
11
|
* member here and an adapter in `MonitorRecommendationCatalog.ts`, and the
|
|
11
12
|
* catalog's own tests fail until both exist.
|
|
12
13
|
*
|
|
13
|
-
* These values are persisted
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* These values are NOT persisted directly, but they ARE written into
|
|
15
|
+
* `RecommendationDismissal.resourceType` (a free-text column) and into every
|
|
16
|
+
* `recommendationId` via `buildRecommendationId`. Renaming a member orphans
|
|
17
|
+
* the dismissals recorded under the old value, exactly as renaming a
|
|
18
|
+
* `RecommendationType` member does.
|
|
19
|
+
*
|
|
20
|
+
* They are free to differ from `MonitorType`, and they do: `DockerSwarm` here
|
|
21
|
+
* vs `"Docker Swarm"` there.
|
|
16
22
|
*/
|
|
17
23
|
export enum MonitorRecommendationResourceType {
|
|
18
24
|
Kubernetes = "Kubernetes",
|
|
@@ -24,13 +30,46 @@ export enum MonitorRecommendationResourceType {
|
|
|
24
30
|
Ceph = "Ceph",
|
|
25
31
|
IoTDevice = "IoTDevice",
|
|
26
32
|
RumApplication = "RumApplication",
|
|
33
|
+
/*
|
|
34
|
+
* An APM telemetry service — a backend process reporting OTel traces,
|
|
35
|
+
* metrics and exceptions under a `service.name`. The only resource type
|
|
36
|
+
* whose recommendation set is not a constant: see
|
|
37
|
+
* `MonitorRecommendationContext`.
|
|
38
|
+
*/
|
|
39
|
+
Service = "Service",
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/*
|
|
43
|
+
* What is known about ONE resource, for resource types whose recommendation
|
|
44
|
+
* set depends on it.
|
|
45
|
+
*
|
|
46
|
+
* Every other resource type answers "what should I monitor here?" from the
|
|
47
|
+
* resource type alone — every Kubernetes cluster gets the same eighteen
|
|
48
|
+
* recommendations. Services do not: the runtime signals worth alerting on for
|
|
49
|
+
* a Java service (heap pressure, GC pause time, thread exhaustion) do not
|
|
50
|
+
* exist on a Go service, and recommending them there produces monitors that
|
|
51
|
+
* silently never fire, which is worse than recommending nothing.
|
|
52
|
+
*
|
|
53
|
+
* Optional everywhere, and every field inside it is optional too, so a caller
|
|
54
|
+
* that knows nothing still gets the language-agnostic recommendations rather
|
|
55
|
+
* than an empty list or a guess.
|
|
56
|
+
*/
|
|
57
|
+
export interface MonitorRecommendationContext {
|
|
58
|
+
/*
|
|
59
|
+
* The service's detected runtime. `null` and `undefined` mean the same
|
|
60
|
+
* thing here — nothing identified the runtime — and both are accepted
|
|
61
|
+
* because `detectServiceLanguage` returns `null` while an absent field is
|
|
62
|
+
* `undefined`, and forcing every call site to normalize one into the other
|
|
63
|
+
* is how a `null` ends up narrowing to some default language by accident.
|
|
64
|
+
*/
|
|
65
|
+
serviceLanguage?: ServiceLanguage | null | undefined;
|
|
27
66
|
}
|
|
28
67
|
|
|
29
68
|
/*
|
|
30
69
|
* Every template module declares its own
|
|
31
70
|
* `<X>AlertTemplateSeverity = "Critical" | "Warning"` union. They are
|
|
32
71
|
* identical, so the registry uses one shared type rather than a union of
|
|
33
|
-
*
|
|
72
|
+
* ten structurally-equal unions.
|
|
34
73
|
*/
|
|
35
74
|
export type MonitorRecommendationSeverity = "Critical" | "Warning";
|
|
36
75
|
|
|
@@ -42,11 +81,12 @@ export type MonitorRecommendationSeverity = "Critical" | "Warning";
|
|
|
42
81
|
* hostIdentifier -> Host, Docker, Podman
|
|
43
82
|
* fleetIdentifier -> IoTDevice
|
|
44
83
|
* rumApplicationId -> RUM application
|
|
84
|
+
* serviceId -> APM service
|
|
45
85
|
*
|
|
46
86
|
* The registry normalizes that single difference into `resourceIdentifier`
|
|
47
87
|
* and each catalog adapter renames it back on the way into the module's own
|
|
48
88
|
* `getMonitorStep`. Nothing else about the args differs, which is why this
|
|
49
|
-
* one interface can drive all
|
|
89
|
+
* one interface can drive all ten.
|
|
50
90
|
*/
|
|
51
91
|
export interface MonitorRecommendationArgs {
|
|
52
92
|
resourceIdentifier: string;
|
|
@@ -89,9 +129,9 @@ export interface MonitorRecommendation {
|
|
|
89
129
|
* Registry-wide unique id for a recommendation.
|
|
90
130
|
*
|
|
91
131
|
* Every template module happens to self-prefix its ids today (`host-high-cpu`,
|
|
92
|
-
* `docker-high-cpu`, `podman-high-cpu`), so
|
|
93
|
-
* globally unique right now. That is a convention across
|
|
94
|
-
* maintained files, not a contract — each module only guarantees uniqueness
|
|
132
|
+
* `docker-high-cpu`, `podman-high-cpu`), so every shipped template id is in
|
|
133
|
+
* fact globally unique right now. That is a convention across ten
|
|
134
|
+
* independently maintained files, not a contract — each module only guarantees uniqueness
|
|
95
135
|
* WITHIN itself. Prefixing here makes the registry correct regardless: without
|
|
96
136
|
* it, the day two modules pick the same id, selecting one card in the UI would
|
|
97
137
|
* silently also select the other. `MonitorRecommendationCatalog.test.ts` keeps
|