@oneuptime/common 12.0.34 → 13.0.1
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/Alert.ts +55 -0
- package/Models/DatabaseModels/CloudResource.ts +45 -7
- package/Models/DatabaseModels/CodeRepository.ts +85 -0
- package/Models/DatabaseModels/GlobalConfig.ts +12 -12
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +57 -7
- package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +263 -0
- package/Models/DatabaseModels/Incident.ts +55 -0
- package/Models/DatabaseModels/Index.ts +16 -0
- package/Models/DatabaseModels/InventoryItem.ts +44 -1
- package/Models/DatabaseModels/NetworkDevice.ts +126 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
- package/Models/DatabaseModels/User.ts +51 -2
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +43 -2
- package/Models/DatabaseModels/UserWebAuthn.ts +17 -0
- package/Models/DatabaseModels/VMwareResource.ts +1149 -0
- package/Models/DatabaseModels/VMwareVCenter.ts +1122 -0
- package/Models/DatabaseModels/VMwareVCenterFeed.ts +625 -0
- package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +514 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +596 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +485 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +484 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +22 -1
- package/Server/API/AIAgentDataAPI.ts +79 -4
- package/Server/API/AIAgentGitHubAPI.ts +523 -0
- package/Server/API/AIChatAPI.ts +20 -1
- package/Server/API/BillingAPI.ts +33 -0
- package/Server/API/DashboardAPI.ts +10 -0
- package/Server/API/GitHubAPI.ts +47 -5
- package/Server/API/GoogleSecOpsConnectionAPI.ts +79 -0
- package/Server/API/UserWebAuthnAPI.ts +21 -1
- package/Server/API/VMwareResourceAPI.ts +143 -0
- package/Server/EnvironmentConfig.ts +47 -16
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.ts +68 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.ts +636 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.ts +83 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Infrastructure/Redis.ts +8 -8
- package/Server/Infrastructure/Status.ts +10 -4
- package/Server/Middleware/IdentityRateLimit.ts +101 -0
- package/Server/Services/AIRunService.ts +13 -0
- package/Server/Services/BillingPaymentMethodService.ts +99 -28
- package/Server/Services/BillingService.ts +287 -20
- package/Server/Services/CloudResourceInstanceService.ts +70 -0
- package/Server/Services/DatabaseService.ts +65 -13
- package/Server/Services/ExceptionAggregationService.ts +1 -0
- package/Server/Services/GoogleSecOpsConnectionRunService.ts +10 -0
- package/Server/Services/GoogleSecOpsConnectionService.ts +12 -0
- package/Server/Services/Index.ts +16 -0
- package/Server/Services/InventoryItemService.ts +31 -1
- package/Server/Services/LogAggregationService.ts +1 -0
- package/Server/Services/MetricAggregationService.ts +1 -0
- package/Server/Services/MobilePasskeyLoginService.ts +216 -0
- package/Server/Services/MonitorService.ts +51 -1
- package/Server/Services/MonitorTemplateService.ts +218 -35
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +481 -42
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +176 -2
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +87 -2
- package/Server/Services/NetworkDeviceService.ts +69 -0
- package/Server/Services/OpenTelemetryIngestService.ts +17 -0
- package/Server/Services/PayAsYouGoBillingService.ts +446 -0
- package/Server/Services/ProjectService.ts +46 -2
- package/Server/Services/ServerlessFunctionInstanceService.ts +71 -0
- package/Server/Services/TeamMemberService.ts +96 -36
- package/Server/Services/TelemetryIngestionKeyService.ts +80 -10
- package/Server/Services/TelemetryUsageBillingService.ts +95 -5
- package/Server/Services/TraceAggregationService.ts +5 -4
- package/Server/Services/UserNotificationRuleService.ts +76 -25
- package/Server/Services/UserWebAuthnService.ts +592 -133
- package/Server/Services/VMwareResourceService.ts +648 -0
- package/Server/Services/VMwareVCenterFeedService.ts +99 -0
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +240 -0
- package/Server/Services/VMwareVCenterLabelRuleService.ts +14 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +252 -0
- package/Server/Services/VMwareVCenterOwnerRuleService.ts +14 -0
- package/Server/Services/VMwareVCenterOwnerTeamService.ts +139 -0
- package/Server/Services/VMwareVCenterOwnerUserService.ts +133 -0
- package/Server/Services/VMwareVCenterService.ts +629 -0
- package/Server/Services/WorkflowVariableService.ts +203 -0
- package/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.ts +17 -0
- package/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.ts +31 -1
- package/Server/Types/Database/Permissions/ReadPermission.ts +45 -5
- package/Server/Types/Database/QueryUtil.ts +56 -0
- package/Server/Types/Markdown.ts +93 -1
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +7 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.ts +341 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.ts +274 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.ts +375 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubConversation.ts +846 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.ts +360 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubRunReply.ts +421 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.ts +140 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.ts +906 -0
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +225 -17
- package/Server/Utils/DataSource/EgressGuard.ts +160 -15
- package/Server/Utils/Database/TruncateColumnValue.ts +1 -1
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +12 -1
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +35 -2
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +44 -0
- package/Server/Utils/LogRedaction.ts +2 -1
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +82 -35
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +31 -5
- package/Server/Utils/Monitor/MonitorAlert.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +502 -38
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +82 -9
- package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +16 -7
- package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +29 -17
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +107 -48
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +26 -4
- package/Server/Utils/Monitor/MonitorResourceContext.ts +5 -3
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +14 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
- package/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.ts +158 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +27 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +28 -5
- package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +3 -3
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +14 -9
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +116 -84
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +594 -195
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +466 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +16 -1
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +2 -1
- package/Server/Utils/Telemetry/TelemetryEntity.ts +264 -10
- package/Server/Utils/Telemetry/VMwareSnapshotScan.ts +1352 -0
- package/Tests/App/Accounts/LoginPasskey.test.tsx +529 -0
- package/Tests/App/Accounts/MobilePasskey.test.tsx +620 -0
- package/Tests/App/Accounts/PasswordRequirements.test.tsx +254 -0
- package/Tests/App/Accounts/RegisterPassword.test.tsx +553 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +32 -0
- package/Tests/App/Dashboard/AdoptedDeviceDrawer.test.tsx +374 -0
- package/Tests/App/Dashboard/AskAiAvailability.test.ts +224 -0
- package/Tests/App/Dashboard/AskAiDisabled.test.tsx +432 -0
- package/Tests/App/Dashboard/BackupCodes.test.tsx +414 -0
- package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +530 -0
- package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +195 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +199 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +198 -0
- package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +215 -0
- package/Tests/App/Dashboard/CloudFleetSummary.test.ts +183 -0
- package/Tests/App/Dashboard/CloudFleetSummaryComponent.test.tsx +248 -0
- package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +215 -0
- package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +3 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +441 -0
- package/Tests/App/Dashboard/DashboardLabelVariables.test.tsx +580 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +458 -0
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +438 -0
- package/Tests/App/Dashboard/DashboardToolbarPopupLayering.test.tsx +566 -0
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +5 -2
- package/Tests/App/Dashboard/DeviceAttachmentCard.test.tsx +273 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +505 -0
- package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +376 -0
- package/Tests/App/Dashboard/DiscoveryScanLiveUpdates.test.tsx +642 -0
- package/Tests/App/Dashboard/DiscoveryScanProgress.test.tsx +267 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +69 -231
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +163 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +244 -0
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +724 -0
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +401 -0
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +232 -0
- package/Tests/App/Dashboard/InventoryItems.test.tsx +201 -0
- package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +798 -0
- package/Tests/App/Dashboard/MonitorTemplateSyncFields.test.tsx +539 -0
- package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +320 -0
- package/Tests/App/Dashboard/NetworkTopologyToolbar.test.tsx +275 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedEmptyState.test.tsx +975 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +63 -0
- package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +24 -7
- package/Tests/App/Dashboard/OnCallOverridePresentation.test.ts +496 -0
- package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +677 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +31 -3
- package/Tests/App/Dashboard/PaidUsageConsent.test.tsx +180 -0
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +1220 -0
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +176 -275
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +380 -233
- package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +3 -23
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +1 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +626 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +348 -0
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +331 -0
- package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +260 -0
- package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +603 -0
- package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +324 -0
- package/Tests/App/Dashboard/VMwareDashboardWidgets.test.ts +573 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
- package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +768 -0
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +13 -4
- package/Tests/App/StatusPage/StatusPageOidcOrigin.test.tsx +223 -0
- package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +532 -40
- package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +19 -2
- package/Tests/Fixtures/MobilePasskeyUser.json +8 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +25 -6
- package/Tests/Models/DatabaseModels/VMwareModels.test.ts +1134 -0
- package/Tests/Models/InventoryItemStatus.test.ts +147 -0
- package/Tests/Models/NetworkDeviceMacAddressColumn.test.ts +294 -0
- package/Tests/Models/RunnerVersionLabel.test.ts +4 -2
- package/Tests/Server/API/AIChatProvidersAIEnabled.test.ts +259 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +31 -2
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +116 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +158 -1
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +13 -2
- package/Tests/Server/API/GitHubWebhookSignature.test.ts +368 -0
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +248 -0
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +330 -0
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +172 -0
- package/Tests/Server/API/VMwareResourceAPI.test.ts +546 -0
- package/Tests/Server/EnvironmentConfigValkey.test.ts +227 -0
- package/Tests/Server/Infrastructure/Postgres/AddMacAddressToNetworkDeviceMigration.test.ts +365 -0
- package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +62 -23
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupMetadataMigration.test.ts +85 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +34 -3
- package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +265 -0
- package/Tests/Server/Middleware/HttpMetricsMiddleware.test.ts +382 -0
- package/Tests/Server/Middleware/PasskeyRateLimit.test.ts +141 -0
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +525 -0
- package/Tests/Server/Services/AutoImportRuleRearmRecentScans.test.ts +343 -0
- package/Tests/Server/Services/AutoImportRuleWriteRearmsScans.test.ts +381 -0
- package/Tests/Server/Services/BillingPaymentMethodServiceSync.test.ts +175 -0
- package/Tests/Server/Services/BillingService.test.ts +26 -11
- package/Tests/Server/Services/BillingServiceMeteredPaymentAuthorization.test.ts +245 -0
- package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +362 -0
- package/Tests/Server/Services/CloudResourceInstanceStalePrune.test.ts +188 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +291 -56
- package/Tests/Server/Services/DatabaseServiceSortTiebreaker.test.ts +151 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +16 -2
- package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +153 -0
- package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +13 -0
- package/Tests/Server/Services/InventoryItemManualCreate.test.ts +105 -0
- package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +183 -0
- package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +36 -0
- package/Tests/Server/Services/InventoryUpsertTruncationGuard.test.ts +151 -0
- package/Tests/Server/Services/MobilePasskeyLoginIntegration.test.ts +231 -0
- package/Tests/Server/Services/MobilePasskeyLoginService.test.ts +315 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +302 -0
- package/Tests/Server/Services/MonitorTemplateServiceCustomFieldSync.test.ts +502 -0
- package/Tests/Server/Services/MonitorTemplateServiceFieldSync.test.ts +994 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1133 -81
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +22 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanRegistration.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceMacAddressNormalization.test.ts +572 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +857 -0
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +379 -0
- package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +99 -1
- package/Tests/Server/Services/ProjectServiceSubscriptionSeats.test.ts +134 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +3 -2
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +32 -6
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +363 -175
- package/Tests/Server/Services/ServerlessFunctionInstanceStalePrune.test.ts +200 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +3 -0
- package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +762 -0
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +3 -0
- package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +72 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +17 -4
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +355 -0
- package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +41 -4
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +37 -0
- package/Tests/Server/Services/UserWebAuthnPasskeyIntegration.test.ts +401 -0
- package/Tests/Server/Services/UserWebAuthnPasskeyService.test.ts +769 -0
- package/Tests/Server/Services/UserWebAuthnUserVerification.test.ts +649 -0
- package/Tests/Server/Services/VMwareResourceService.test.ts +945 -0
- package/Tests/Server/Services/VMwareVCenterService.test.ts +722 -0
- package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +842 -0
- package/Tests/Server/TestingUtils/PasskeyHttpIntegration.ts +102 -0
- package/Tests/Server/TestingUtils/SecurityKey.ts +464 -0
- package/Tests/Server/TestingUtils/WebAuthnServiceMocks.ts +60 -0
- package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +573 -0
- package/Tests/Server/Types/Database/InventoryStatusPostgres.test.ts +368 -0
- package/Tests/Server/Types/Database/Permissions/ProjectCustomerSupportAccessColumn.test.ts +261 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +261 -14
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +95 -0
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroups.test.ts +169 -0
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroupsPostgres.test.ts +297 -0
- package/Tests/Server/Types/Markdown.test.ts +194 -1
- package/Tests/Server/Types/Workflow/Components/IncomingWebhookUtils.test.ts +279 -0
- package/Tests/Server/Types/Workflow/Components/TextToJson.test.ts +212 -0
- package/Tests/Server/Utils/CodeRepository/GitHubAgentTaskTrigger.test.ts +2101 -0
- package/Tests/Server/Utils/CodeRepository/GitHubCommandAuthorizer.test.ts +883 -0
- package/Tests/Server/Utils/CodeRepository/GitHubCommandParser.test.ts +1474 -0
- package/Tests/Server/Utils/CodeRepository/GitHubConversation.test.ts +1526 -0
- package/Tests/Server/Utils/CodeRepository/GitHubReplyComposer.test.ts +1389 -0
- package/Tests/Server/Utils/CodeRepository/GitHubRunReply.test.ts +1707 -0
- package/Tests/Server/Utils/CodeRepository/GitHubWebhookHandler.test.ts +2202 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingRegistry.test.ts +436 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +559 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +896 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupMetadataIntegration.test.ts +246 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +309 -4
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +6 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +185 -0
- package/Tests/Server/Utils/EventLoop.test.ts +359 -0
- package/Tests/Server/Utils/JsonWebToken.test.ts +30 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +33 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +2 -1
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +242 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +13 -7
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +29 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +30 -6
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +246 -0
- package/Tests/Server/Utils/Monitor/Criteria/TelemetryStepMetricAlias.test.ts +10 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +66 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEmailEvalLogAgreement.test.ts +280 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +586 -10
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +570 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +30 -5
- package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +68 -21
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +36 -19
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +60 -1
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +60 -0
- package/Tests/Server/Utils/Monitor/MonitorRootCauseTargetResolution.test.ts +423 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +6 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.test.ts +573 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +317 -0
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +46 -2
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +81 -45
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +711 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClickhouseIntegration.test.ts +223 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +69 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +838 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsErrorHandling.test.ts +241 -28
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +651 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +11 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +13 -12
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +112 -127
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsRequestContract.test.ts +12 -18
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsResponseParsing.test.ts +43 -0
- package/Tests/Server/Utils/Telemetry/ContextSpanProcessor.test.ts +281 -0
- package/Tests/Server/Utils/Telemetry/InventoryDuplicateIdentity.test.ts +316 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +691 -8
- package/Tests/Server/Utils/Telemetry/VMwareSnapshotScan.test.ts +1748 -0
- package/Tests/Types/Cloud/CloudPlatform.test.ts +574 -0
- package/Tests/Types/Database/IncludesAnyOfGroups.test.ts +106 -0
- package/Tests/Types/JSONFunctions.test.ts +40 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +2 -0
- package/Tests/Types/Monitor/MonitorCriteriaMetricVariables.test.ts +9 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +53 -8
- package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +97 -0
- package/Tests/Types/Monitor/MonitorStepMetricViewConfigUtil.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorStepTemplateSyncFields.test.ts +107 -0
- package/Tests/Types/Monitor/MonitorTemplateSyncField.test.ts +172 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +2 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +1 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +9 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +131 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +10 -0
- package/Tests/Types/Monitor/VMwareAlertTemplates.test.ts +1608 -0
- package/Tests/Types/Monitor/VMwareMetricCatalog.test.ts +488 -0
- package/Tests/Types/NetworkAutomation/AutoImportRunMerge.test.ts +235 -0
- package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +66 -0
- package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +309 -1
- package/Tests/Types/OnCallDutyPolicy/OverrideProvenance.test.ts +295 -0
- package/Tests/Types/Runner/RunnerLiveStatus.test.ts +2 -2
- package/Tests/Types/SignupPassword.test.ts +205 -0
- package/Tests/Types/StatusPage/StatusPageLanguage.test.ts +44 -0
- package/Tests/Types/SupportedLanguages.test.ts +119 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +19 -0
- package/Tests/Types/Telemetry/InventoryLiveness.test.ts +99 -0
- package/Tests/UI/ColorPickerBuild.test.ts +86 -0
- package/Tests/UI/Components/Breadcrumbs.test.tsx +32 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +160 -0
- package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +937 -0
- package/Tests/UI/Components/Forms/ModelFormWriteOnlyColumnSelect.test.tsx +230 -0
- package/Tests/UI/Components/Forms/ValidationFormSteps.test.ts +3 -4
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +907 -0
- package/Tests/UI/Components/ModelTable/ModelTableCreateAfterEdit.test.tsx +514 -0
- package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +301 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +2 -1
- package/Tests/UI/Components/TooltipLazyContent.test.tsx +373 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsMessagingEndpointGuidance.test.tsx +43 -12
- package/Tests/UI/ReactDomBuild.test.ts +104 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +143 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +10 -2
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +514 -0
- package/Tests/UI/Rum/ReplayTimeFormat.test.ts +94 -0
- package/Tests/UI/Rum/ReplayUi.test.tsx +559 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +153 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +30 -0
- package/Tests/UI/Utils/DashboardStackingLayers.test.ts +197 -0
- package/Tests/UI/Utils/LabelRuleImportExport.test.ts +546 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +109 -2
- package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +7 -2
- package/Tests/UI/Utils/UserEmailRegistrationStatus.test.tsx +295 -0
- package/Tests/UI/Utils/WebAuthn.test.ts +265 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +5 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +11 -1
- package/Tests/Utils/Dashboard/Components/DashboardVMwareListComponents.test.ts +548 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +17 -3
- package/Tests/Utils/Dashboard/LabelVariable.test.ts +257 -0
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +144 -14
- package/Tests/Utils/LabelRuleImportExport.test.ts +583 -0
- package/Tests/Utils/MetricUnitUtil.test.ts +81 -0
- package/Tests/Utils/Monitor/DeviceMacLearningUtil.test.ts +497 -0
- package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +546 -0
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/MonitorTemplateCustomFieldUtil.test.ts +218 -0
- package/Tests/Utils/Monitor/MonitorTemplateSyncUtil.test.ts +590 -0
- package/Tests/Utils/Monitor/NetworkTopologyEndpointAdoption.test.ts +1755 -0
- package/Tests/Utils/NetworkAutomation/AutoImportRunChain.test.ts +320 -0
- package/Tests/Utils/RequestFailedDetails.test.ts +325 -0
- package/Tests/Utils/Telemetry/CloudInstanceIdentity.test.ts +255 -0
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +167 -0
- package/Tests/Utils/WebAuthnTestUtil.ts +79 -0
- package/Tests/__mocks__/simplewebauthn.js +33 -4
- package/Types/AI/CodeFixTaskContext.ts +122 -0
- package/Types/AI/CodeFixTaskType.ts +62 -0
- package/Types/Accounts/AccountsLanguage.ts +1 -0
- package/Types/AdminDashboard/AdminDashboardLanguage.ts +1 -0
- package/Types/BaseDatabase/IncludesAnyOfGroups.ts +77 -0
- package/Types/Calendar/CalendarEvent.ts +16 -0
- package/Types/Cloud/CloudPlatform.ts +372 -0
- package/Types/CodeRepository/GitHubCommand.ts +69 -0
- package/Types/Dashboard/DashboardComponentType.ts +2 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
- package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.ts +23 -0
- package/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.ts +30 -0
- package/Types/Dashboard/DashboardLanguage.ts +1 -0
- package/Types/Dashboard/DashboardTemplates.ts +314 -0
- package/Types/Dashboard/DashboardVariable.ts +8 -0
- package/Types/Docs/DocsLanguage.ts +1 -0
- package/Types/Exception/EgressGuardException.ts +65 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/JSON.ts +4 -0
- package/Types/JSONFunctions.ts +16 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +36 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +1 -0
- package/Types/Monitor/MonitorStep.ts +78 -17
- package/Types/Monitor/MonitorStepMetricViewConfigUtil.ts +1 -0
- package/Types/Monitor/MonitorStepVMwareMonitor.ts +127 -0
- package/Types/Monitor/MonitorTemplateSyncField.ts +291 -0
- package/Types/Monitor/MonitorType.ts +24 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +33 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +2 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +3 -0
- package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +158 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +61 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
- package/Types/Monitor/VMwareAlertTemplates.ts +1070 -0
- package/Types/Monitor/VMwareMetricCatalog.ts +914 -0
- package/Types/NetworkAutomation/RuleRunResult.ts +402 -13
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +29 -0
- package/Types/OnCallDutyPolicy/UserOverrideUtil.ts +16 -0
- package/Types/Password.ts +84 -5
- package/Types/Permission.ts +265 -0
- package/Types/Probe/RequestFailedDetails.ts +7 -0
- package/Types/Runner/RunnerLiveStatus.ts +1 -1
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -0
- package/Types/SerializableObjectDictionary.ts +4 -0
- package/Types/StatusPage/StatusPageLanguage.ts +1 -0
- package/Types/Telemetry/EntityType.ts +21 -0
- package/Types/Telemetry/InventoryLiveness.ts +56 -0
- package/Types/Telemetry/ServiceType.ts +1 -0
- package/Typings/Index.d.ts +63 -0
- package/UI/Components/Breadcrumbs/Breadcrumbs.tsx +2 -2
- package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +9 -2
- package/UI/Components/Calendar/Calendar.css +78 -0
- package/UI/Components/Calendar/Calendar.tsx +28 -3
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +46 -21
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +285 -0
- package/UI/Components/Forms/BasicForm.tsx +44 -2
- package/UI/Components/Forms/Fields/ColorPicker.tsx +2 -1
- package/UI/Components/Forms/Fields/FormField.tsx +16 -3
- package/UI/Components/Forms/ModelForm.tsx +159 -5
- package/UI/Components/Forms/Types/Field.ts +8 -1
- package/UI/Components/Graphs/DayUptimeGraph.tsx +8 -10
- package/UI/Components/Icon/Icon.tsx +16 -0
- package/UI/Components/Input/Input.tsx +42 -7
- package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +441 -0
- package/UI/Components/LabelRule/LabelRuleTable.tsx +142 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +22 -5
- package/UI/Components/ModelTable/ModelTable.tsx +14 -6
- package/UI/Components/MonitorGraphs/Uptime.tsx +17 -27
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +3 -1
- package/UI/Components/Tooltip/Tooltip.tsx +52 -6
- package/UI/Utils/DashboardStackingLayers.ts +85 -0
- package/UI/Utils/LabelRuleImportExport.ts +310 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +4 -3
- package/UI/Utils/TelemetryService.ts +4 -3
- package/UI/Utils/UseDashboardGridDnd.ts +4 -1
- package/UI/Utils/UserEmailRegistrationStatus.ts +33 -5
- package/UI/Utils/WebAuthn.ts +220 -0
- package/UI/esbuild-config.js +10 -0
- package/Utils/API.ts +34 -0
- package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +12 -1
- package/Utils/Dashboard/Components/DashboardVMwareHostListComponent.ts +38 -0
- package/Utils/Dashboard/Components/DashboardVMwareResourceListShared.ts +70 -0
- package/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.ts +76 -0
- package/Utils/Dashboard/Components/Index.ts +16 -0
- package/Utils/Dashboard/LabelVariable.ts +152 -0
- package/Utils/Dashboard/VariableUrlState.ts +27 -5
- package/Utils/LabelRuleImportExport.ts +496 -0
- package/Utils/MetricUnitUtil.ts +34 -0
- package/Utils/Monitor/DeviceMacLearningUtil.ts +177 -0
- package/Utils/Monitor/MetricValueFormatter.ts +342 -0
- package/Utils/Monitor/MonitorTemplateCustomFieldUtil.ts +124 -0
- package/Utils/Monitor/MonitorTemplateSyncUtil.ts +164 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +7 -2
- package/Utils/Monitor/NetworkTopologyUtil.ts +693 -0
- package/Utils/NetworkAutomation/AutoImportRunChain.ts +138 -0
- package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +8 -0
- package/Utils/Telemetry/CloudInstanceIdentity.ts +94 -0
- package/Utils/Telemetry/EntityKey.ts +19 -0
- package/Utils/Telemetry/EntityRelationship.ts +19 -0
- package/build/dist/Models/DatabaseModels/Alert.js +54 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResource.js +44 -7
- package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +87 -0
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +12 -12
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +60 -7
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +287 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +54 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +16 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js +34 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +128 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +57 -4
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +47 -2
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +18 -0
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareResource.js +1201 -0
- package/build/dist/Models/DatabaseModels/VMwareResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js +1149 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +22 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +63 -3
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentGitHubAPI.js +363 -0
- package/build/dist/Server/API/AIAgentGitHubAPI.js.map +1 -0
- package/build/dist/Server/API/AIChatAPI.js +19 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +22 -0
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +10 -0
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GitHubAPI.js +33 -5
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +56 -0
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -0
- package/build/dist/Server/API/UserWebAuthnAPI.js +17 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/VMwareResourceAPI.js +106 -0
- package/build/dist/Server/API/VMwareResourceAPI.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +44 -12
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js +241 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Redis.js +8 -8
- package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
- package/build/dist/Server/Infrastructure/Status.js +10 -4
- package/build/dist/Server/Infrastructure/Status.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +80 -0
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +14 -1
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/BillingPaymentMethodService.js +71 -21
- package/build/dist/Server/Services/BillingPaymentMethodService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +210 -22
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceInstanceService.js +66 -0
- package/build/dist/Server/Services/CloudResourceInstanceService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +58 -13
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +1 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +9 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +1 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +7 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +16 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +28 -1
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +1 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +1 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MobilePasskeyLoginService.js +137 -0
- package/build/dist/Server/Services/MobilePasskeyLoginService.js.map +1 -0
- package/build/dist/Server/Services/MonitorService.js +34 -1
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +167 -30
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +394 -38
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +142 -2
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +65 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +54 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +28 -13
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PayAsYouGoBillingService.js +297 -0
- package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -0
- package/build/dist/Server/Services/ProjectService.js +38 -2
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js +66 -0
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +85 -28
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +61 -10
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +62 -5
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +5 -4
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +60 -25
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserWebAuthnService.js +345 -113
- package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
- package/build/dist/Server/Services/VMwareResourceService.js +395 -0
- package/build/dist/Server/Services/VMwareResourceService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterFeedService.js +89 -0
- package/build/dist/Server/Services/VMwareVCenterFeedService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +197 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js +13 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +214 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js +129 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js +122 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterService.js +533 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -0
- package/build/dist/Server/Services/WorkflowVariableService.js +169 -0
- package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js +12 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js +25 -2
- package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +29 -4
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +36 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +75 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js +275 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js +226 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js +297 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js +582 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js +275 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js +365 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js +103 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js +661 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +166 -18
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +99 -15
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +12 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +20 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +31 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +2 -1
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +58 -35
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +29 -5
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +382 -36
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +58 -9
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +9 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +26 -12
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +74 -33
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +12 -4
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +5 -3
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +22 -9
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js +114 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +25 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +21 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +21 -6
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +3 -3
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +9 -9
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +92 -71
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +428 -143
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +376 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +14 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +206 -14
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js +933 -0
- package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js +40 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskType.js +57 -0
- package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -1
- package/build/dist/Types/Accounts/AccountsLanguage.js +1 -0
- package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +1 -0
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js +54 -0
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js.map +1 -0
- package/build/dist/Types/Cloud/CloudPlatform.js +277 -0
- package/build/dist/Types/Cloud/CloudPlatform.js.map +1 -0
- package/build/dist/Types/CodeRepository/GitHubCommand.js +52 -0
- package/build/dist/Types/CodeRepository/GitHubCommand.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +286 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardVariable.js +1 -0
- package/build/dist/Types/Dashboard/DashboardVariable.js.map +1 -1
- package/build/dist/Types/Docs/DocsLanguage.js +1 -0
- package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
- package/build/dist/Types/Exception/EgressGuardException.js +59 -0
- package/build/dist/Types/Exception/EgressGuardException.js.map +1 -0
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/JSON.js +1 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +13 -0
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +61 -18
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js +1 -0
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js +71 -0
- package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorTemplateSyncField.js +211 -0
- package/build/dist/Types/Monitor/MonitorTemplateSyncField.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +23 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +28 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +2 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +120 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +60 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/Monitor/VMwareAlertTemplates.js +775 -0
- package/build/dist/Types/Monitor/VMwareAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/VMwareMetricCatalog.js +799 -0
- package/build/dist/Types/Monitor/VMwareMetricCatalog.js.map +1 -0
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +291 -6
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +25 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js +5 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js.map +1 -1
- package/build/dist/Types/Password.js +63 -5
- package/build/dist/Types/Password.js.map +1 -1
- package/build/dist/Types/Permission.js +234 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Probe/RequestFailedDetails.js +7 -0
- package/build/dist/Types/Probe/RequestFailedDetails.js.map +1 -1
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +2 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +1 -0
- package/build/dist/Types/SerializableObjectDictionary.js +4 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/StatusPage/StatusPageLanguage.js +1 -0
- package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +21 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/InventoryLiveness.js +37 -0
- package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js +2 -2
- package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +7 -0
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
- package/build/dist/UI/Components/Calendar/Calendar.js +24 -4
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +9 -2
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +137 -0
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -0
- package/build/dist/UI/Components/Forms/BasicForm.js +28 -3
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -3
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +89 -6
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +5 -6
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +14 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +37 -8
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +228 -0
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -0
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +102 -0
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +15 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +13 -5
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +14 -15
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +2 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +33 -4
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/DashboardStackingLayers.js +44 -0
- package/build/dist/UI/Utils/DashboardStackingLayers.js.map +1 -0
- package/build/dist/UI/Utils/LabelRuleImportExport.js +195 -0
- package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -0
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +4 -4
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +3 -2
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js +2 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -1
- package/build/dist/UI/Utils/UserEmailRegistrationStatus.js +21 -4
- package/build/dist/UI/Utils/UserEmailRegistrationStatus.js.map +1 -1
- package/build/dist/UI/Utils/WebAuthn.js +121 -0
- package/build/dist/UI/Utils/WebAuthn.js.map +1 -0
- package/build/dist/Utils/API.js +29 -0
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +9 -1
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js +33 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js +54 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js +60 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Dashboard/LabelVariable.js +96 -0
- package/build/dist/Utils/Dashboard/LabelVariable.js.map +1 -0
- package/build/dist/Utils/Dashboard/VariableUrlState.js +19 -4
- package/build/dist/Utils/Dashboard/VariableUrlState.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +356 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -0
- package/build/dist/Utils/MetricUnitUtil.js +26 -0
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js +112 -0
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +276 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js +101 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js +110 -0
- package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +7 -2
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +484 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js +59 -0
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +6 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -1
- package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js +88 -0
- package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +15 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityRelationship.js +13 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
- package/jest.config.json +2 -0
- package/package.json +1 -1
- package/test-setup.sh +9 -9
- package/tsconfig.json +51 -11
- package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +0 -399
|
@@ -0,0 +1,883 @@
|
|
|
1
|
+
import CodeRepositoryService from "../../../../Server/Services/CodeRepositoryService";
|
|
2
|
+
import ProjectService from "../../../../Server/Services/ProjectService";
|
|
3
|
+
import GitHubCommandAuthorizer, {
|
|
4
|
+
GitHubAuthorizationOutcome,
|
|
5
|
+
GitHubAuthorizationResult,
|
|
6
|
+
} from "../../../../Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer";
|
|
7
|
+
import GitHubConversation, {
|
|
8
|
+
GitHubRepositoryPermission,
|
|
9
|
+
} from "../../../../Server/Utils/CodeRepository/GitHub/GitHubConversation";
|
|
10
|
+
import GitHubInstallationBinding from "../../../../Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding";
|
|
11
|
+
import CodeRepository from "../../../../Models/DatabaseModels/CodeRepository";
|
|
12
|
+
import Project from "../../../../Models/DatabaseModels/Project";
|
|
13
|
+
import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
|
|
14
|
+
import CodeRepositoryType from "../../../../Types/CodeRepository/CodeRepositoryType";
|
|
15
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
16
|
+
import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
|
|
17
|
+
|
|
18
|
+
/*
|
|
19
|
+
* ---------------------------------------------------------------------------
|
|
20
|
+
* GitHubCommandAuthorizer is the ONLY thing standing between "@oneuptime
|
|
21
|
+
* implement this" typed by a stranger and an agent run that pushes commits,
|
|
22
|
+
* opens pull requests and spends a project's AI budget.
|
|
23
|
+
*
|
|
24
|
+
* Every command arrives from an untrusted party: a connected repository's
|
|
25
|
+
* issue tracker is open to anyone with a GitHub account, and a mention costs
|
|
26
|
+
* nothing to write. So there are four invariants here, and each one is a
|
|
27
|
+
* different incident when it regresses.
|
|
28
|
+
*
|
|
29
|
+
* 1. BOTS ARE NEVER OBEYED, AND NEVER ANSWERED. The app's own comments come
|
|
30
|
+
* back as webhooks. If a bot sender ever reached the resolver, two apps
|
|
31
|
+
* mentioning each other would burn a budget overnight. The guard has to
|
|
32
|
+
* fire before ANY service call — a bot must not even cause a database
|
|
33
|
+
* read.
|
|
34
|
+
*
|
|
35
|
+
* 2. THE ROW'S INSTALLATION ID IS NOT AUTHORITY (GHSA-xx95-gmcf-7q86). A
|
|
36
|
+
* CodeRepository row carries an installation ID, and the single GitHub
|
|
37
|
+
* App JWT this instance holds will mint a write-scoped token for whatever
|
|
38
|
+
* installation it is handed. Whether an installation may act for a
|
|
39
|
+
* project is answered by GitHubInstallationBinding and nowhere else, so
|
|
40
|
+
* an unbound candidate row must be SKIPPED rather than used.
|
|
41
|
+
*
|
|
42
|
+
* 3. ONE COMMENT PRODUCES AT MOST ONE RUN. A repository can be imported by
|
|
43
|
+
* several projects. Acting for all of them turns one mention into several
|
|
44
|
+
* projects' pull requests, so the query is ordered oldest-first and the
|
|
45
|
+
* first bound candidate wins — deterministically, and identically across
|
|
46
|
+
* webhook redeliveries.
|
|
47
|
+
*
|
|
48
|
+
* 4. SILENCE VS. REPLY IS PART OF THE BOUNDARY. A collaborator who hits a
|
|
49
|
+
* switched-off repository gets a reason to show them. Someone WITHOUT
|
|
50
|
+
* write access gets no reason at all, because a guaranteed reply per
|
|
51
|
+
* mention is exactly the amplifier an open issue tracker would hand to
|
|
52
|
+
* anyone with an account. These tests assert the presence and the ABSENCE
|
|
53
|
+
* of `reason` as carefully as they assert the outcome.
|
|
54
|
+
* ---------------------------------------------------------------------------
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
const ORGANIZATION: string = "acme";
|
|
58
|
+
const REPOSITORY: string = "checkout";
|
|
59
|
+
const INSTALLATION_ID: string = "12345678";
|
|
60
|
+
|
|
61
|
+
// The shape of the single argument CodeRepositoryService.findBy is handed.
|
|
62
|
+
interface FindByCallArguments {
|
|
63
|
+
query: {
|
|
64
|
+
organizationName?: string | undefined;
|
|
65
|
+
repositoryName?: string | undefined;
|
|
66
|
+
repositoryHostedAt?: CodeRepositoryType | undefined;
|
|
67
|
+
gitHubAppInstallationId?: string | undefined;
|
|
68
|
+
};
|
|
69
|
+
sort: {
|
|
70
|
+
createdAt?: SortOrder | undefined;
|
|
71
|
+
};
|
|
72
|
+
props: {
|
|
73
|
+
isRoot?: boolean | undefined;
|
|
74
|
+
};
|
|
75
|
+
limit?: number | undefined;
|
|
76
|
+
skip?: number | undefined;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
interface BindingCallArguments {
|
|
80
|
+
projectId: ObjectID;
|
|
81
|
+
installationId: string;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
interface PermissionCallArguments {
|
|
85
|
+
installationId: string;
|
|
86
|
+
organizationName: string;
|
|
87
|
+
repositoryName: string;
|
|
88
|
+
username: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
describe("GitHubCommandAuthorizer", () => {
|
|
92
|
+
let projectId: ObjectID;
|
|
93
|
+
let findBySpy: jest.SpyInstance;
|
|
94
|
+
let isBoundSpy: jest.SpyInstance;
|
|
95
|
+
let permissionSpy: jest.SpyInstance;
|
|
96
|
+
let findOneByIdSpy: jest.SpyInstance;
|
|
97
|
+
|
|
98
|
+
beforeEach(() => {
|
|
99
|
+
projectId = ObjectID.generate();
|
|
100
|
+
|
|
101
|
+
// Default world: nothing connected, everything else permissive.
|
|
102
|
+
findBySpy = jest.spyOn(CodeRepositoryService, "findBy");
|
|
103
|
+
findBySpy.mockResolvedValue([]);
|
|
104
|
+
|
|
105
|
+
isBoundSpy = jest.spyOn(
|
|
106
|
+
GitHubInstallationBinding,
|
|
107
|
+
"isInstallationBoundToProject",
|
|
108
|
+
);
|
|
109
|
+
isBoundSpy.mockResolvedValue(true);
|
|
110
|
+
|
|
111
|
+
permissionSpy = jest.spyOn(
|
|
112
|
+
GitHubConversation,
|
|
113
|
+
"getUserRepositoryPermission",
|
|
114
|
+
);
|
|
115
|
+
permissionSpy.mockResolvedValue(GitHubRepositoryPermission.Admin);
|
|
116
|
+
|
|
117
|
+
findOneByIdSpy = jest.spyOn(ProjectService, "findOneById");
|
|
118
|
+
findOneByIdSpy.mockResolvedValue(namedProject("Acme Production"));
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
/*
|
|
122
|
+
* Required, not cosmetic: these spies mutate shared module singletons that
|
|
123
|
+
* outlive the test and would leak into every other test in this worker.
|
|
124
|
+
*/
|
|
125
|
+
afterEach(() => {
|
|
126
|
+
jest.restoreAllMocks();
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
function namedProject(name: string): Project {
|
|
130
|
+
const project: Project = new Project();
|
|
131
|
+
project.id = projectId;
|
|
132
|
+
project.name = name;
|
|
133
|
+
return project;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// A row with the identity fields set but neither project nor installation.
|
|
137
|
+
function bareRepository(): CodeRepository {
|
|
138
|
+
const repository: CodeRepository = new CodeRepository();
|
|
139
|
+
repository.id = ObjectID.generate();
|
|
140
|
+
repository.organizationName = ORGANIZATION;
|
|
141
|
+
repository.repositoryName = REPOSITORY;
|
|
142
|
+
repository.mainBranchName = "main";
|
|
143
|
+
repository.repositoryHostedAt = CodeRepositoryType.GitHub;
|
|
144
|
+
return repository;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function connectedRepository(data?: {
|
|
148
|
+
projectId?: ObjectID | undefined;
|
|
149
|
+
installationId?: string | undefined;
|
|
150
|
+
}): CodeRepository {
|
|
151
|
+
const repository: CodeRepository = bareRepository();
|
|
152
|
+
repository.projectId = data?.projectId || projectId;
|
|
153
|
+
repository.gitHubAppInstallationId =
|
|
154
|
+
data?.installationId || INSTALLATION_ID;
|
|
155
|
+
return repository;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/*
|
|
159
|
+
* The commands switch is a nullable boolean column, and "null" is a state
|
|
160
|
+
* TypeScript will not let us assign through the model's own typing. Tests
|
|
161
|
+
* that pin the null-means-enabled semantics need to produce it anyway.
|
|
162
|
+
*/
|
|
163
|
+
function setCommandsColumn(
|
|
164
|
+
repository: CodeRepository,
|
|
165
|
+
value: boolean | null | undefined,
|
|
166
|
+
): void {
|
|
167
|
+
(repository as unknown as Record<string, boolean | null | undefined>)[
|
|
168
|
+
"isGitHubCommandsEnabled"
|
|
169
|
+
] = value;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function mockCandidates(candidates: Array<CodeRepository>): void {
|
|
173
|
+
findBySpy.mockResolvedValue(candidates);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function authorize(overrides?: {
|
|
177
|
+
senderLogin?: string | undefined;
|
|
178
|
+
senderType?: string | undefined;
|
|
179
|
+
installationId?: string | undefined;
|
|
180
|
+
}): Promise<GitHubAuthorizationResult> {
|
|
181
|
+
return GitHubCommandAuthorizer.authorize({
|
|
182
|
+
organizationName: ORGANIZATION,
|
|
183
|
+
repositoryName: REPOSITORY,
|
|
184
|
+
installationId: overrides?.installationId ?? INSTALLATION_ID,
|
|
185
|
+
senderLogin: overrides?.senderLogin ?? "octo-dev",
|
|
186
|
+
senderType: overrides?.senderType ?? "User",
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function resolve(): Promise<CodeRepository | null> {
|
|
191
|
+
return GitHubCommandAuthorizer.resolveConnectedRepository({
|
|
192
|
+
organizationName: ORGANIZATION,
|
|
193
|
+
repositoryName: REPOSITORY,
|
|
194
|
+
installationId: INSTALLATION_ID,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function findByCall(): FindByCallArguments {
|
|
199
|
+
return findBySpy.mock.calls[0]![0] as FindByCallArguments;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function bindingCall(callNumber: number): BindingCallArguments {
|
|
203
|
+
return isBoundSpy.mock.calls[callNumber - 1]![0] as BindingCallArguments;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function permissionCall(): PermissionCallArguments {
|
|
207
|
+
return permissionSpy.mock.calls[0]![0] as PermissionCallArguments;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function expectNoServiceCallsAtAll(): void {
|
|
211
|
+
expect(findBySpy).not.toHaveBeenCalled();
|
|
212
|
+
expect(isBoundSpy).not.toHaveBeenCalled();
|
|
213
|
+
expect(permissionSpy).not.toHaveBeenCalled();
|
|
214
|
+
expect(findOneByIdSpy).not.toHaveBeenCalled();
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/*
|
|
218
|
+
* Invariant 1. The app's own comment arrives here as a webhook, as does
|
|
219
|
+
* every other app's. A single reply to a bot is the first half of a loop
|
|
220
|
+
* that has no second half.
|
|
221
|
+
*/
|
|
222
|
+
describe("the bot loop guard", () => {
|
|
223
|
+
test("ignores a sender GitHub itself labels as a Bot", async () => {
|
|
224
|
+
const result: GitHubAuthorizationResult = await authorize({
|
|
225
|
+
senderLogin: "dependabot",
|
|
226
|
+
senderType: "Bot",
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Ignore);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test("ignores a login ending in [bot] even when the sender type says User", async () => {
|
|
233
|
+
const result: GitHubAuthorizationResult = await authorize({
|
|
234
|
+
senderLogin: "oneuptime[bot]",
|
|
235
|
+
senderType: "User",
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Ignore);
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
test("ignores its own bot login whatever case GitHub sends it in", async () => {
|
|
242
|
+
const result: GitHubAuthorizationResult = await authorize({
|
|
243
|
+
senderLogin: "OneUptime[BOT]",
|
|
244
|
+
senderType: "User",
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Ignore);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
test("ignores an empty sender login", async () => {
|
|
251
|
+
const result: GitHubAuthorizationResult = await authorize({
|
|
252
|
+
senderLogin: "",
|
|
253
|
+
senderType: "User",
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Ignore);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test("ignores an empty login even when the webhook omits the sender type", async () => {
|
|
260
|
+
const result: GitHubAuthorizationResult =
|
|
261
|
+
await GitHubCommandAuthorizer.authorize({
|
|
262
|
+
organizationName: ORGANIZATION,
|
|
263
|
+
repositoryName: REPOSITORY,
|
|
264
|
+
installationId: INSTALLATION_ID,
|
|
265
|
+
senderLogin: "",
|
|
266
|
+
senderType: undefined,
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Ignore);
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
/*
|
|
273
|
+
* The mirror image, and the more dangerous direction. A webhook that
|
|
274
|
+
* carries no sender.type is not evidence of a bot, and treating it as one
|
|
275
|
+
* would silently drop a collaborator's command.
|
|
276
|
+
*/
|
|
277
|
+
test("still serves a human whose webhook carries no sender type", async () => {
|
|
278
|
+
mockCandidates([connectedRepository()]);
|
|
279
|
+
|
|
280
|
+
const result: GitHubAuthorizationResult =
|
|
281
|
+
await GitHubCommandAuthorizer.authorize({
|
|
282
|
+
organizationName: ORGANIZATION,
|
|
283
|
+
repositoryName: REPOSITORY,
|
|
284
|
+
installationId: INSTALLATION_ID,
|
|
285
|
+
senderLogin: "octo-dev",
|
|
286
|
+
senderType: undefined,
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Allowed);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
/*
|
|
293
|
+
* The guard is worth nothing if it fires AFTER the work. A bot comment
|
|
294
|
+
* must not cost a database read, a binding check or a GitHub API call —
|
|
295
|
+
* otherwise two chatty apps still generate load in a tight loop even
|
|
296
|
+
* though neither is obeyed.
|
|
297
|
+
*/
|
|
298
|
+
test("makes no service call at all for a bot, even on a connected repository", async () => {
|
|
299
|
+
mockCandidates([connectedRepository()]);
|
|
300
|
+
|
|
301
|
+
await authorize({ senderLogin: "renovate[bot]", senderType: "Bot" });
|
|
302
|
+
|
|
303
|
+
expectNoServiceCallsAtAll();
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
test("makes no service call at all for an empty sender login", async () => {
|
|
307
|
+
mockCandidates([connectedRepository()]);
|
|
308
|
+
|
|
309
|
+
await authorize({ senderLogin: "", senderType: "User" });
|
|
310
|
+
|
|
311
|
+
expectNoServiceCallsAtAll();
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
test("returns no repository to act on when it ignores a bot", async () => {
|
|
315
|
+
mockCandidates([connectedRepository()]);
|
|
316
|
+
|
|
317
|
+
const result: GitHubAuthorizationResult = await authorize({
|
|
318
|
+
senderLogin: "oneuptime[bot]",
|
|
319
|
+
senderType: "Bot",
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
expect(result.codeRepository).toBeUndefined();
|
|
323
|
+
expect(result.projectName).toBeUndefined();
|
|
324
|
+
expect(result.reason).toBeUndefined();
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
/*
|
|
328
|
+
* The other half of the guard: it must not be so broad that it silently
|
|
329
|
+
* swallows real people. A dropped command from a human reads to them as
|
|
330
|
+
* "the integration is broken", and there is no log line in their thread.
|
|
331
|
+
*/
|
|
332
|
+
test("does not mistake a human whose login merely contains 'bot' for a bot", async () => {
|
|
333
|
+
mockCandidates([connectedRepository()]);
|
|
334
|
+
|
|
335
|
+
const result: GitHubAuthorizationResult = await authorize({
|
|
336
|
+
senderLogin: "robotnik",
|
|
337
|
+
senderType: "User",
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Allowed);
|
|
341
|
+
expect(findBySpy).toHaveBeenCalled();
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
test("does not ignore a login with [bot] in the middle rather than at the end", async () => {
|
|
345
|
+
mockCandidates([connectedRepository()]);
|
|
346
|
+
|
|
347
|
+
const result: GitHubAuthorizationResult = await authorize({
|
|
348
|
+
senderLogin: "not-a[bot]-account",
|
|
349
|
+
senderType: "User",
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Allowed);
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
describe("resolveConnectedRepository", () => {
|
|
357
|
+
/*
|
|
358
|
+
* All four filters matter. Dropping the installation would let any
|
|
359
|
+
* installation act on a repository name it does not own; dropping
|
|
360
|
+
* repositoryHostedAt would match a GitLab row of the same name.
|
|
361
|
+
*/
|
|
362
|
+
test("filters on organization, repository, GitHub and installation together", async () => {
|
|
363
|
+
await resolve();
|
|
364
|
+
|
|
365
|
+
expect(findBySpy).toHaveBeenCalledTimes(1);
|
|
366
|
+
expect(findByCall().query.organizationName).toBe(ORGANIZATION);
|
|
367
|
+
expect(findByCall().query.repositoryName).toBe(REPOSITORY);
|
|
368
|
+
expect(findByCall().query.repositoryHostedAt).toBe(
|
|
369
|
+
CodeRepositoryType.GitHub,
|
|
370
|
+
);
|
|
371
|
+
expect(findByCall().query.gitHubAppInstallationId).toBe(INSTALLATION_ID);
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
/*
|
|
375
|
+
* Invariant 3. Ascending createdAt is what makes "the oldest connection
|
|
376
|
+
* wins" a fact rather than a coin flip. Flip this to Descending and a
|
|
377
|
+
* webhook redelivery can land in a different project than the first
|
|
378
|
+
* delivery did.
|
|
379
|
+
*/
|
|
380
|
+
test("asks for the candidates oldest first, so the winner is deterministic", async () => {
|
|
381
|
+
await resolve();
|
|
382
|
+
|
|
383
|
+
expect(findByCall().sort.createdAt).toBe(SortOrder.Ascending);
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
test("reads as root, so nobody's permissions can hide a connection", async () => {
|
|
387
|
+
await resolve();
|
|
388
|
+
|
|
389
|
+
expect(findByCall().props.isRoot).toBe(true);
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
test("returns null when the repository is connected to no project", async () => {
|
|
393
|
+
mockCandidates([]);
|
|
394
|
+
|
|
395
|
+
await expect(resolve()).resolves.toBeNull();
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
test("returns the candidate when its installation is bound to its project", async () => {
|
|
399
|
+
const repository: CodeRepository = connectedRepository();
|
|
400
|
+
mockCandidates([repository]);
|
|
401
|
+
|
|
402
|
+
await expect(resolve()).resolves.toBe(repository);
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
/*
|
|
406
|
+
* Invariant 2, the core of it. The row says which installation it belongs
|
|
407
|
+
* to; the row is not allowed to be believed. A row whose installation ID
|
|
408
|
+
* was planted must be stepped over, and a legitimate row behind it must
|
|
409
|
+
* still be found.
|
|
410
|
+
*/
|
|
411
|
+
test("skips an unbound candidate and uses the bound one behind it", async () => {
|
|
412
|
+
const plantedProjectId: ObjectID = ObjectID.generate();
|
|
413
|
+
const planted: CodeRepository = connectedRepository({
|
|
414
|
+
projectId: plantedProjectId,
|
|
415
|
+
});
|
|
416
|
+
const legitimate: CodeRepository = connectedRepository();
|
|
417
|
+
|
|
418
|
+
mockCandidates([planted, legitimate]);
|
|
419
|
+
isBoundSpy.mockResolvedValueOnce(false).mockResolvedValueOnce(true);
|
|
420
|
+
|
|
421
|
+
await expect(resolve()).resolves.toBe(legitimate);
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
test("returns null when no candidate's installation is bound to its project", async () => {
|
|
425
|
+
mockCandidates([
|
|
426
|
+
connectedRepository({ projectId: ObjectID.generate() }),
|
|
427
|
+
connectedRepository({ projectId: ObjectID.generate() }),
|
|
428
|
+
]);
|
|
429
|
+
isBoundSpy.mockResolvedValue(false);
|
|
430
|
+
|
|
431
|
+
await expect(resolve()).resolves.toBeNull();
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
test("asks the binding about the candidate's OWN project and installation", async () => {
|
|
435
|
+
mockCandidates([
|
|
436
|
+
connectedRepository({
|
|
437
|
+
projectId: projectId,
|
|
438
|
+
installationId: INSTALLATION_ID,
|
|
439
|
+
}),
|
|
440
|
+
]);
|
|
441
|
+
|
|
442
|
+
await resolve();
|
|
443
|
+
|
|
444
|
+
expect(isBoundSpy).toHaveBeenCalledTimes(1);
|
|
445
|
+
expect(bindingCall(1).projectId.toString()).toBe(projectId.toString());
|
|
446
|
+
expect(bindingCall(1).installationId).toBe(INSTALLATION_ID);
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
/*
|
|
450
|
+
* Invariant 3 again, at the point it actually bites. Three projects have
|
|
451
|
+
* imported this repository and all three bindings are genuine. Only the
|
|
452
|
+
* oldest may act, and the loop must stop the moment it finds it — one
|
|
453
|
+
* mention, one run, one pull request.
|
|
454
|
+
*/
|
|
455
|
+
test("stops at the FIRST bound candidate when several are bound", async () => {
|
|
456
|
+
const oldest: CodeRepository = connectedRepository({
|
|
457
|
+
projectId: projectId,
|
|
458
|
+
});
|
|
459
|
+
const middle: CodeRepository = connectedRepository({
|
|
460
|
+
projectId: ObjectID.generate(),
|
|
461
|
+
});
|
|
462
|
+
const newest: CodeRepository = connectedRepository({
|
|
463
|
+
projectId: ObjectID.generate(),
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
mockCandidates([oldest, middle, newest]);
|
|
467
|
+
|
|
468
|
+
const resolved: CodeRepository | null = await resolve();
|
|
469
|
+
|
|
470
|
+
expect(resolved).toBe(oldest);
|
|
471
|
+
expect(resolved).not.toBe(middle);
|
|
472
|
+
expect(resolved).not.toBe(newest);
|
|
473
|
+
expect(isBoundSpy).toHaveBeenCalledTimes(1);
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
// A half-populated row cannot be permitted by accident.
|
|
477
|
+
test("skips a row carrying no project id, without asking the binding about it", async () => {
|
|
478
|
+
const orphan: CodeRepository = bareRepository();
|
|
479
|
+
orphan.gitHubAppInstallationId = INSTALLATION_ID;
|
|
480
|
+
const legitimate: CodeRepository = connectedRepository();
|
|
481
|
+
|
|
482
|
+
mockCandidates([orphan, legitimate]);
|
|
483
|
+
|
|
484
|
+
await expect(resolve()).resolves.toBe(legitimate);
|
|
485
|
+
expect(isBoundSpy).toHaveBeenCalledTimes(1);
|
|
486
|
+
expect(bindingCall(1).projectId.toString()).toBe(projectId.toString());
|
|
487
|
+
});
|
|
488
|
+
|
|
489
|
+
test("skips a row carrying no installation id, without asking the binding about it", async () => {
|
|
490
|
+
const halfPopulated: CodeRepository = bareRepository();
|
|
491
|
+
halfPopulated.projectId = ObjectID.generate();
|
|
492
|
+
const legitimate: CodeRepository = connectedRepository();
|
|
493
|
+
|
|
494
|
+
mockCandidates([halfPopulated, legitimate]);
|
|
495
|
+
|
|
496
|
+
await expect(resolve()).resolves.toBe(legitimate);
|
|
497
|
+
expect(isBoundSpy).toHaveBeenCalledTimes(1);
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
test("returns null when the only candidate is half-populated", async () => {
|
|
501
|
+
mockCandidates([bareRepository()]);
|
|
502
|
+
|
|
503
|
+
await expect(resolve()).resolves.toBeNull();
|
|
504
|
+
expect(isBoundSpy).not.toHaveBeenCalled();
|
|
505
|
+
});
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
/*
|
|
509
|
+
* The switch was added after the repositories were. Defaulting existing
|
|
510
|
+
* rows to "off" would mean the feature does nothing anywhere until every
|
|
511
|
+
* repository is visited by hand, so a null/absent column reads as enabled.
|
|
512
|
+
* Only an explicit `false` turns it off.
|
|
513
|
+
*/
|
|
514
|
+
describe("areCommandsEnabled", () => {
|
|
515
|
+
test("treats an untouched column as ENABLED", () => {
|
|
516
|
+
const repository: CodeRepository = connectedRepository();
|
|
517
|
+
|
|
518
|
+
expect(repository.isGitHubCommandsEnabled).toBeUndefined();
|
|
519
|
+
expect(GitHubCommandAuthorizer.areCommandsEnabled(repository)).toBe(true);
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
test("treats a NULL column as enabled, not as disabled", () => {
|
|
523
|
+
const repository: CodeRepository = connectedRepository();
|
|
524
|
+
setCommandsColumn(repository, null);
|
|
525
|
+
|
|
526
|
+
expect(GitHubCommandAuthorizer.areCommandsEnabled(repository)).toBe(true);
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
test("treats an explicitly undefined column as enabled", () => {
|
|
530
|
+
const repository: CodeRepository = connectedRepository();
|
|
531
|
+
setCommandsColumn(repository, undefined);
|
|
532
|
+
|
|
533
|
+
expect(GitHubCommandAuthorizer.areCommandsEnabled(repository)).toBe(true);
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
test("returns true when the column is explicitly true", () => {
|
|
537
|
+
const repository: CodeRepository = connectedRepository();
|
|
538
|
+
setCommandsColumn(repository, true);
|
|
539
|
+
|
|
540
|
+
expect(GitHubCommandAuthorizer.areCommandsEnabled(repository)).toBe(true);
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
// The one and only value that switches the feature off.
|
|
544
|
+
test("returns false only for an explicit false", () => {
|
|
545
|
+
const repository: CodeRepository = connectedRepository();
|
|
546
|
+
setCommandsColumn(repository, false);
|
|
547
|
+
|
|
548
|
+
expect(GitHubCommandAuthorizer.areCommandsEnabled(repository)).toBe(
|
|
549
|
+
false,
|
|
550
|
+
);
|
|
551
|
+
});
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
describe("authorize", () => {
|
|
555
|
+
describe("a repository this instance has no standing in", () => {
|
|
556
|
+
test("ignores a command on a repository connected to no project", async () => {
|
|
557
|
+
mockCandidates([]);
|
|
558
|
+
|
|
559
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
560
|
+
|
|
561
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Ignore);
|
|
562
|
+
expect(result.codeRepository).toBeUndefined();
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
/*
|
|
566
|
+
* Silence, not a reply. The app is installed somewhere it was never
|
|
567
|
+
* connected — commenting there would be an uninvited bot posting in
|
|
568
|
+
* someone else's repository.
|
|
569
|
+
*/
|
|
570
|
+
test("says nothing back when the repository is not connected", async () => {
|
|
571
|
+
mockCandidates([]);
|
|
572
|
+
|
|
573
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
574
|
+
|
|
575
|
+
expect(result.reason).toBeUndefined();
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
test("never asks GitHub about the sender when nothing is connected", async () => {
|
|
579
|
+
mockCandidates([]);
|
|
580
|
+
|
|
581
|
+
await authorize();
|
|
582
|
+
|
|
583
|
+
expect(permissionSpy).not.toHaveBeenCalled();
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
/*
|
|
587
|
+
* Invariant 2 end to end: an unbound row must produce exactly the same
|
|
588
|
+
* silence as no row at all, and must never reach the permission check
|
|
589
|
+
* with somebody else's installation.
|
|
590
|
+
*/
|
|
591
|
+
test("ignores a command whose only candidate row is unbound", async () => {
|
|
592
|
+
mockCandidates([connectedRepository()]);
|
|
593
|
+
isBoundSpy.mockResolvedValue(false);
|
|
594
|
+
|
|
595
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
596
|
+
|
|
597
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Ignore);
|
|
598
|
+
expect(result.codeRepository).toBeUndefined();
|
|
599
|
+
expect(permissionSpy).not.toHaveBeenCalled();
|
|
600
|
+
});
|
|
601
|
+
});
|
|
602
|
+
|
|
603
|
+
describe("a repository with commands switched off", () => {
|
|
604
|
+
function disabledRepository(): CodeRepository {
|
|
605
|
+
const repository: CodeRepository = connectedRepository();
|
|
606
|
+
setCommandsColumn(repository, false);
|
|
607
|
+
return repository;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
test("returns CommandsDisabled", async () => {
|
|
611
|
+
mockCandidates([disabledRepository()]);
|
|
612
|
+
|
|
613
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
614
|
+
|
|
615
|
+
expect(result.outcome).toBe(
|
|
616
|
+
GitHubAuthorizationOutcome.CommandsDisabled,
|
|
617
|
+
);
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
/*
|
|
621
|
+
* This outcome IS answered in the thread — a collaborator who gets
|
|
622
|
+
* silence assumes the integration is broken and files a bug — so the
|
|
623
|
+
* reason has to exist and has to say where the switch lives.
|
|
624
|
+
*/
|
|
625
|
+
test("carries a reason that points the collaborator at the switch", async () => {
|
|
626
|
+
mockCandidates([disabledRepository()]);
|
|
627
|
+
|
|
628
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
629
|
+
|
|
630
|
+
expect(result.reason).toBeDefined();
|
|
631
|
+
expect(result.reason!.length).toBeGreaterThan(0);
|
|
632
|
+
expect(result.reason).toContain("OneUptime");
|
|
633
|
+
});
|
|
634
|
+
|
|
635
|
+
test("carries the repository, so the reply can name what it refused", async () => {
|
|
636
|
+
const repository: CodeRepository = disabledRepository();
|
|
637
|
+
mockCandidates([repository]);
|
|
638
|
+
|
|
639
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
640
|
+
|
|
641
|
+
expect(result.codeRepository).toBe(repository);
|
|
642
|
+
});
|
|
643
|
+
|
|
644
|
+
/*
|
|
645
|
+
* The switch is checked BEFORE GitHub is asked anything. A disabled
|
|
646
|
+
* repository must not turn every drive-by mention into an API call
|
|
647
|
+
* against someone's rate limit.
|
|
648
|
+
*/
|
|
649
|
+
test("never asks GitHub for the sender's permission", async () => {
|
|
650
|
+
mockCandidates([disabledRepository()]);
|
|
651
|
+
|
|
652
|
+
await authorize();
|
|
653
|
+
|
|
654
|
+
expect(permissionSpy).not.toHaveBeenCalled();
|
|
655
|
+
});
|
|
656
|
+
|
|
657
|
+
test("still runs when the column is null, because null means enabled", async () => {
|
|
658
|
+
const repository: CodeRepository = connectedRepository();
|
|
659
|
+
setCommandsColumn(repository, null);
|
|
660
|
+
mockCandidates([repository]);
|
|
661
|
+
|
|
662
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
663
|
+
|
|
664
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Allowed);
|
|
665
|
+
});
|
|
666
|
+
});
|
|
667
|
+
|
|
668
|
+
describe("the repository permission matrix", () => {
|
|
669
|
+
/*
|
|
670
|
+
* Write is the floor: it is the permission that lets a person push to
|
|
671
|
+
* the branch the agent would push to, so anyone who could do the work by
|
|
672
|
+
* hand may ask the app to do it.
|
|
673
|
+
*/
|
|
674
|
+
test.each([
|
|
675
|
+
GitHubRepositoryPermission.Admin,
|
|
676
|
+
GitHubRepositoryPermission.Maintain,
|
|
677
|
+
GitHubRepositoryPermission.Write,
|
|
678
|
+
])(
|
|
679
|
+
"allows a command from a collaborator with %s access",
|
|
680
|
+
async (permission: GitHubRepositoryPermission) => {
|
|
681
|
+
mockCandidates([connectedRepository()]);
|
|
682
|
+
permissionSpy.mockResolvedValue(permission);
|
|
683
|
+
|
|
684
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
685
|
+
|
|
686
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Allowed);
|
|
687
|
+
},
|
|
688
|
+
);
|
|
689
|
+
|
|
690
|
+
/*
|
|
691
|
+
* Read and triage can both comment on the thread, which is exactly why
|
|
692
|
+
* neither may command the app: commenting is not a permission to push.
|
|
693
|
+
*/
|
|
694
|
+
test.each([
|
|
695
|
+
GitHubRepositoryPermission.Read,
|
|
696
|
+
GitHubRepositoryPermission.Triage,
|
|
697
|
+
GitHubRepositoryPermission.None,
|
|
698
|
+
])(
|
|
699
|
+
"refuses a command from someone with only %s access",
|
|
700
|
+
async (permission: GitHubRepositoryPermission) => {
|
|
701
|
+
mockCandidates([connectedRepository()]);
|
|
702
|
+
permissionSpy.mockResolvedValue(permission);
|
|
703
|
+
|
|
704
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
705
|
+
|
|
706
|
+
expect(result.outcome).toBe(
|
|
707
|
+
GitHubAuthorizationOutcome.InsufficientPermission,
|
|
708
|
+
);
|
|
709
|
+
},
|
|
710
|
+
);
|
|
711
|
+
|
|
712
|
+
/*
|
|
713
|
+
* Invariant 4. No reason means the caller has nothing to post, which is
|
|
714
|
+
* the whole point: a guaranteed reply per mention would make the app a
|
|
715
|
+
* comment-poster any GitHub account could drive.
|
|
716
|
+
*/
|
|
717
|
+
test.each([
|
|
718
|
+
GitHubRepositoryPermission.Read,
|
|
719
|
+
GitHubRepositoryPermission.Triage,
|
|
720
|
+
GitHubRepositoryPermission.None,
|
|
721
|
+
])(
|
|
722
|
+
"gives the caller nothing to say back to someone with %s access",
|
|
723
|
+
async (permission: GitHubRepositoryPermission) => {
|
|
724
|
+
mockCandidates([connectedRepository()]);
|
|
725
|
+
permissionSpy.mockResolvedValue(permission);
|
|
726
|
+
|
|
727
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
728
|
+
|
|
729
|
+
expect(result.reason).toBeUndefined();
|
|
730
|
+
},
|
|
731
|
+
);
|
|
732
|
+
|
|
733
|
+
// The caller still needs the row — to react on the comment, not to reply.
|
|
734
|
+
test("still returns the repository when the permission is insufficient", async () => {
|
|
735
|
+
const repository: CodeRepository = connectedRepository();
|
|
736
|
+
mockCandidates([repository]);
|
|
737
|
+
permissionSpy.mockResolvedValue(GitHubRepositoryPermission.Read);
|
|
738
|
+
|
|
739
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
740
|
+
|
|
741
|
+
expect(result.codeRepository).toBe(repository);
|
|
742
|
+
});
|
|
743
|
+
|
|
744
|
+
/*
|
|
745
|
+
* A refused sender must not learn which OneUptime project the
|
|
746
|
+
* repository belongs to — that is internal naming, and the refusal is
|
|
747
|
+
* not answered in the thread anyway.
|
|
748
|
+
*/
|
|
749
|
+
test("does not attribute a project to a refused sender", async () => {
|
|
750
|
+
mockCandidates([connectedRepository()]);
|
|
751
|
+
permissionSpy.mockResolvedValue(GitHubRepositoryPermission.Triage);
|
|
752
|
+
|
|
753
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
754
|
+
|
|
755
|
+
expect(result.projectName).toBeUndefined();
|
|
756
|
+
});
|
|
757
|
+
|
|
758
|
+
test("asks GitHub about the exact sender, repository and installation", async () => {
|
|
759
|
+
mockCandidates([connectedRepository()]);
|
|
760
|
+
|
|
761
|
+
await authorize({ senderLogin: "octo-dev" });
|
|
762
|
+
|
|
763
|
+
expect(permissionSpy).toHaveBeenCalledTimes(1);
|
|
764
|
+
expect(permissionCall().username).toBe("octo-dev");
|
|
765
|
+
expect(permissionCall().organizationName).toBe(ORGANIZATION);
|
|
766
|
+
expect(permissionCall().repositoryName).toBe(REPOSITORY);
|
|
767
|
+
expect(permissionCall().installationId).toBe(INSTALLATION_ID);
|
|
768
|
+
});
|
|
769
|
+
|
|
770
|
+
/*
|
|
771
|
+
* GitHub logins are matched exactly by the collaborator API. Any
|
|
772
|
+
* normalisation applied here — casing, trimming, stripping non-ASCII —
|
|
773
|
+
* would ask about a DIFFERENT account than the one that commented, and
|
|
774
|
+
* that account may have write access when the commenter does not.
|
|
775
|
+
*/
|
|
776
|
+
test("passes an unusual sender login through to GitHub untouched", async () => {
|
|
777
|
+
mockCandidates([connectedRepository()]);
|
|
778
|
+
|
|
779
|
+
await authorize({ senderLogin: "Ünïcodé-Dev" });
|
|
780
|
+
|
|
781
|
+
expect(permissionCall().username).toBe("Ünïcodé-Dev");
|
|
782
|
+
});
|
|
783
|
+
|
|
784
|
+
test("does not lowercase a mixed-case sender login before checking it", async () => {
|
|
785
|
+
mockCandidates([connectedRepository()]);
|
|
786
|
+
|
|
787
|
+
await authorize({ senderLogin: "OctoDev" });
|
|
788
|
+
|
|
789
|
+
expect(permissionCall().username).toBe("OctoDev");
|
|
790
|
+
});
|
|
791
|
+
});
|
|
792
|
+
|
|
793
|
+
describe("project attribution on an allowed command", () => {
|
|
794
|
+
test("names the project the app is about to act for", async () => {
|
|
795
|
+
mockCandidates([connectedRepository()]);
|
|
796
|
+
|
|
797
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
798
|
+
|
|
799
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Allowed);
|
|
800
|
+
expect(result.projectName).toBe("Acme Production");
|
|
801
|
+
});
|
|
802
|
+
|
|
803
|
+
/*
|
|
804
|
+
* Attribution follows the WINNING candidate. Naming the first row's
|
|
805
|
+
* project while acting for the second one's would tell a team the wrong
|
|
806
|
+
* budget was about to be spent.
|
|
807
|
+
*/
|
|
808
|
+
test("names the project of the bound candidate, not of a skipped one", async () => {
|
|
809
|
+
const skippedProjectId: ObjectID = ObjectID.generate();
|
|
810
|
+
mockCandidates([
|
|
811
|
+
connectedRepository({ projectId: skippedProjectId }),
|
|
812
|
+
connectedRepository({ projectId: projectId }),
|
|
813
|
+
]);
|
|
814
|
+
isBoundSpy.mockResolvedValueOnce(false).mockResolvedValueOnce(true);
|
|
815
|
+
|
|
816
|
+
await authorize();
|
|
817
|
+
|
|
818
|
+
const lookup: { id: ObjectID } = findOneByIdSpy.mock.calls[0]![0] as {
|
|
819
|
+
id: ObjectID;
|
|
820
|
+
};
|
|
821
|
+
|
|
822
|
+
expect(lookup.id.toString()).toBe(projectId.toString());
|
|
823
|
+
expect(lookup.id.toString()).not.toBe(skippedProjectId.toString());
|
|
824
|
+
});
|
|
825
|
+
|
|
826
|
+
/*
|
|
827
|
+
* A name is a nicety. Refusing to run a command a collaborator is
|
|
828
|
+
* entitled to, because a display-name lookup failed, would be a far
|
|
829
|
+
* worse bug than an unattributed acknowledgement.
|
|
830
|
+
*/
|
|
831
|
+
test("still allows the command when the project lookup throws", async () => {
|
|
832
|
+
mockCandidates([connectedRepository()]);
|
|
833
|
+
findOneByIdSpy.mockRejectedValue(new Error("database unreachable"));
|
|
834
|
+
|
|
835
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
836
|
+
|
|
837
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Allowed);
|
|
838
|
+
expect(result.projectName).toBeUndefined();
|
|
839
|
+
});
|
|
840
|
+
|
|
841
|
+
test("still allows the command when the project row is missing", async () => {
|
|
842
|
+
mockCandidates([connectedRepository()]);
|
|
843
|
+
findOneByIdSpy.mockResolvedValue(null);
|
|
844
|
+
|
|
845
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
846
|
+
|
|
847
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Allowed);
|
|
848
|
+
expect(result.projectName).toBeUndefined();
|
|
849
|
+
});
|
|
850
|
+
|
|
851
|
+
// An empty name is not a name — it would render as an empty attribution.
|
|
852
|
+
test("reports no project name rather than an empty one", async () => {
|
|
853
|
+
mockCandidates([connectedRepository()]);
|
|
854
|
+
findOneByIdSpy.mockResolvedValue(namedProject(""));
|
|
855
|
+
|
|
856
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
857
|
+
|
|
858
|
+
expect(result.projectName).toBeUndefined();
|
|
859
|
+
});
|
|
860
|
+
|
|
861
|
+
// A row with no project has no budget to bill and no project to name.
|
|
862
|
+
test("skips the lookup entirely for a row with no project id", async () => {
|
|
863
|
+
const orphan: CodeRepository = bareRepository();
|
|
864
|
+
orphan.gitHubAppInstallationId = INSTALLATION_ID;
|
|
865
|
+
mockCandidates([orphan]);
|
|
866
|
+
|
|
867
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
868
|
+
|
|
869
|
+
expect(result.outcome).toBe(GitHubAuthorizationOutcome.Ignore);
|
|
870
|
+
expect(findOneByIdSpy).not.toHaveBeenCalled();
|
|
871
|
+
});
|
|
872
|
+
|
|
873
|
+
test("returns the repository the command should run against", async () => {
|
|
874
|
+
const repository: CodeRepository = connectedRepository();
|
|
875
|
+
mockCandidates([repository]);
|
|
876
|
+
|
|
877
|
+
const result: GitHubAuthorizationResult = await authorize();
|
|
878
|
+
|
|
879
|
+
expect(result.codeRepository).toBe(repository);
|
|
880
|
+
});
|
|
881
|
+
});
|
|
882
|
+
});
|
|
883
|
+
});
|