@oneuptime/common 13.0.0 → 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/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/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/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 +12 -0
- 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/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/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 +91 -29
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +132 -1
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +176 -2
- 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/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/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 +143 -0
- package/Server/Utils/DataSource/EgressGuard.ts +160 -15
- package/Server/Utils/Database/TruncateColumnValue.ts +1 -1
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +2 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +33 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +44 -0
- package/Server/Utils/LogRedaction.ts +2 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +302 -3
- 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/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 +5 -0
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +2 -1
- package/Server/Utils/Telemetry/TelemetryEntity.ts +181 -1
- 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/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/DashboardLazyPages.test.tsx +458 -0
- package/Tests/App/Dashboard/DashboardToolbarPopupLayering.test.tsx +566 -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/GoogleSecOpsConnectionsErrors.test.tsx +244 -0
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +724 -0
- package/Tests/App/Dashboard/MonitorTemplateSyncFields.test.tsx +539 -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/TwoFactorStatus.test.tsx +260 -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/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/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 +29 -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/Infrastructure/Postgres/UserNotificationEmailRollupMetadataMigration.test.ts +85 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +34 -3
- package/Tests/Server/Middleware/PasskeyRateLimit.test.ts +141 -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/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/InventoryItemPromotionGate.test.ts +5 -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/MonitorTemplateServiceFieldSync.test.ts +994 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +22 -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/Permissions/ProjectCustomerSupportAccessColumn.test.ts +261 -0
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +95 -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/Dashboard/PublicDashboardResourceListPolicy.test.ts +345 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +896 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupMetadataIntegration.test.ts +246 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +299 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +6 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +185 -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/TelemetryStepMetricAlias.test.ts +10 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +66 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +362 -0
- 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/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/TelemetryEntity.test.ts +580 -0
- package/Tests/Server/Utils/Telemetry/VMwareSnapshotScan.test.ts +1748 -0
- package/Tests/Types/Cloud/CloudPlatform.test.ts +574 -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/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/UI/ColorPickerBuild.test.ts +86 -0
- package/Tests/UI/Components/Breadcrumbs.test.tsx +32 -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 +11 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +148 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +29 -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/DashboardVMwareListComponents.test.ts +548 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +17 -3
- package/Tests/Utils/LabelRuleImportExport.test.ts +583 -0
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/MonitorTemplateSyncUtil.test.ts +590 -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/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 +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/Docs/DocsLanguage.ts +1 -0
- package/Types/Exception/EgressGuardException.ts +65 -0
- package/Types/Icon/IconProp.ts +1 -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/VMwareAlertTemplates.ts +1070 -0
- package/Types/Monitor/VMwareMetricCatalog.ts +914 -0
- 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/StatusPage/StatusPageLanguage.ts +1 -0
- package/Types/Telemetry/EntityType.ts +21 -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/Calendar/Calendar.css +78 -0
- package/UI/Components/Calendar/Calendar.tsx +28 -3
- 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 +4 -0
- package/Utils/API.ts +34 -0
- 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/LabelRuleImportExport.ts +496 -0
- package/Utils/Monitor/MonitorTemplateSyncUtil.ts +164 -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/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/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/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 +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.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/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/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 +64 -26
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +124 -1
- 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/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/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/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 +113 -0
- 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 +2 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +18 -0
- 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/MonitorAlert.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +219 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.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/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 +5 -0
- 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 +136 -1
- 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/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 +1 -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/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/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/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/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/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/Calendar/Calendar.js +24 -4
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- 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/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/LabelRuleImportExport.js +356 -0
- package/build/dist/Utils/LabelRuleImportExport.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/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/package.json +1 -1
|
@@ -1,9 +1,212 @@
|
|
|
1
1
|
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import { OnUpdate } from "../Types/Database/Hooks";
|
|
3
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
4
|
+
import UpdateBy from "../Types/Database/UpdateBy";
|
|
5
|
+
import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
6
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
7
|
+
import ObjectID from "../../Types/ObjectID";
|
|
8
|
+
import Typeof from "../../Types/Typeof";
|
|
2
9
|
import Model from "../../Models/DatabaseModels/WorkflowVariable";
|
|
3
10
|
|
|
11
|
+
/*
|
|
12
|
+
* isSecret is declared `string` over a genuinely boolean column, so the value
|
|
13
|
+
* that comes back is `true` from Postgres and can be the string "true" from a
|
|
14
|
+
* request body. Read exactly the way RunWorkflow.getSecretWorkflowVariableValues
|
|
15
|
+
* reads it, so what this service calls secret and what the run logs redact can
|
|
16
|
+
* never disagree.
|
|
17
|
+
*/
|
|
18
|
+
function isSecretValue(value: unknown): boolean {
|
|
19
|
+
return value === true || value === "true";
|
|
20
|
+
}
|
|
21
|
+
|
|
4
22
|
export class Service extends DatabaseService<Model> {
|
|
5
23
|
public constructor() {
|
|
6
24
|
super(Model);
|
|
7
25
|
}
|
|
26
|
+
|
|
27
|
+
/*
|
|
28
|
+
* @UniqueColumnBy(["workflowId", "projectId"]) on `name` is enforced by
|
|
29
|
+
* DatabaseService.checkUniqueColumnBy, which runs on create only - and there
|
|
30
|
+
* is no unique index on WorkflowVariable to catch what it misses. That was
|
|
31
|
+
* harmless while the dashboard offered no way to edit a variable. Now that it
|
|
32
|
+
* does, a rename is the one write that can put two rows with the same name in
|
|
33
|
+
* the same scope, and RunWorkflow.getVariables builds
|
|
34
|
+
* `storageMap.local.variables[variable.name] = variable.content` - a plain
|
|
35
|
+
* dictionary - so the second row would silently overwrite the first and
|
|
36
|
+
* {{local.variables.X}} would resolve to whichever the query happened to
|
|
37
|
+
* return last. Nothing would look broken; the workflow would just quietly run
|
|
38
|
+
* on the wrong value.
|
|
39
|
+
*
|
|
40
|
+
* Two things this cannot close, both shared with the create-side guard it
|
|
41
|
+
* mirrors: DatabaseService._updateBy skips every hook when props.ignoreHooks
|
|
42
|
+
* is set, and check-then-write is not atomic, so two concurrent renames onto
|
|
43
|
+
* the same free name can still both land. Closing either properly means a
|
|
44
|
+
* unique index on (projectId, workflowId, LOWER(name)), which needs a dedupe
|
|
45
|
+
* migration first because the racy create-side check may already have let
|
|
46
|
+
* duplicates through.
|
|
47
|
+
*/
|
|
48
|
+
protected override async onBeforeUpdate(
|
|
49
|
+
updateBy: UpdateBy<Model>,
|
|
50
|
+
): Promise<OnUpdate<Model>> {
|
|
51
|
+
const rawName: unknown = updateBy.data.name;
|
|
52
|
+
|
|
53
|
+
/*
|
|
54
|
+
* Only an update that does not carry the column at all is exempt. An
|
|
55
|
+
* explicitly blank name is still a write to `name` - the column is
|
|
56
|
+
* nullable: false but the empty string satisfies that, and update does not
|
|
57
|
+
* re-run the required check - so two rows blanked in the same scope would
|
|
58
|
+
* both become "" and collide like any other duplicate. Let it through to
|
|
59
|
+
* the lookup rather than treating it as "no rename".
|
|
60
|
+
*/
|
|
61
|
+
const isRename: boolean = rawName !== undefined && rawName !== null;
|
|
62
|
+
|
|
63
|
+
/*
|
|
64
|
+
* sanitizeUpdateData passes plain objects straight through, so `name` is
|
|
65
|
+
* whatever the request body said it was. Reject a non-string here rather
|
|
66
|
+
* than letting toLowerCase() throw a TypeError, which would surface as a
|
|
67
|
+
* 500 and a stack trace instead of a 400 naming the field.
|
|
68
|
+
*/
|
|
69
|
+
if (isRename && typeof rawName !== Typeof.String) {
|
|
70
|
+
throw new BadDataException("Workflow variable name must be text.");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const newName: string = rawName as string;
|
|
74
|
+
|
|
75
|
+
/*
|
|
76
|
+
* Turning the secret flag OFF is the one direction that can expose
|
|
77
|
+
* something. isSecret decides whether RunWorkflow replaces this variable's
|
|
78
|
+
* value with [REDACTED] before a run log is persisted, and content itself
|
|
79
|
+
* is unreadable through the API - so a caller who may write a variable but
|
|
80
|
+
* may not read it could otherwise clear the flag, trigger a run, and read
|
|
81
|
+
* the value out of the log. Marking a variable secret stays freely
|
|
82
|
+
* available; unmarking one does not.
|
|
83
|
+
*/
|
|
84
|
+
const isDeclassifying: boolean =
|
|
85
|
+
updateBy.data.isSecret !== undefined &&
|
|
86
|
+
updateBy.data.isSecret !== null &&
|
|
87
|
+
!isSecretValue(updateBy.data.isSecret);
|
|
88
|
+
|
|
89
|
+
if (!isRename && !isDeclassifying) {
|
|
90
|
+
return { updateBy, carryForward: null };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/*
|
|
94
|
+
* Read the rows this update will actually touch. Two things about this
|
|
95
|
+
* query matter.
|
|
96
|
+
*
|
|
97
|
+
* It is scoped to the caller's tenant here rather than relying on the
|
|
98
|
+
* permission layer, because _updateBy runs this hook BEFORE
|
|
99
|
+
* ModelPermission.checkUpdateQueryPermissions - which is what appends the
|
|
100
|
+
* project clause. Reading unscoped-as-root would make this hook answer
|
|
101
|
+
* questions about another project's rows, and its refusal messages say
|
|
102
|
+
* whether a variable is global and whether a name is taken. A caller
|
|
103
|
+
* holding a variable id from a project they cannot see would get an oracle
|
|
104
|
+
* before any authorization ran.
|
|
105
|
+
*
|
|
106
|
+
* isRoot inside that scope is still right: the conflicting row may be one
|
|
107
|
+
* this caller cannot read - read access is label-gated - and a count that
|
|
108
|
+
* cannot see it reports zero and waves the duplicate through.
|
|
109
|
+
*/
|
|
110
|
+
const tenantId: ObjectID | undefined = updateBy.props.tenantId;
|
|
111
|
+
|
|
112
|
+
const itemsBeingUpdated: Array<Model> = await this.findBy({
|
|
113
|
+
query: tenantId
|
|
114
|
+
? { ...updateBy.query, projectId: tenantId }
|
|
115
|
+
: updateBy.query,
|
|
116
|
+
select: {
|
|
117
|
+
_id: true,
|
|
118
|
+
name: true,
|
|
119
|
+
isSecret: true,
|
|
120
|
+
projectId: true,
|
|
121
|
+
workflowId: true,
|
|
122
|
+
},
|
|
123
|
+
limit: LIMIT_PER_PROJECT,
|
|
124
|
+
skip: 0,
|
|
125
|
+
props: {
|
|
126
|
+
isRoot: true,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
if (isDeclassifying) {
|
|
131
|
+
for (const item of itemsBeingUpdated) {
|
|
132
|
+
if (isSecretValue(item.isSecret)) {
|
|
133
|
+
throw new BadDataException(
|
|
134
|
+
`"${item.name}" is marked secret, and a secret variable cannot be un-marked. Its value is redacted from workflow run logs, and clearing the flag would publish that value to the logs of every later run. Delete the variable and create it again if it should no longer be secret.`,
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (!isRename) {
|
|
141
|
+
return { updateBy, carryForward: null };
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/*
|
|
145
|
+
* Renaming two rows to one name is a conflict the database lookup below
|
|
146
|
+
* cannot see: neither collides with anything that exists yet, they collide
|
|
147
|
+
* with each other once both are written.
|
|
148
|
+
*/
|
|
149
|
+
if (itemsBeingUpdated.length > 1) {
|
|
150
|
+
throw new BadDataException(
|
|
151
|
+
`Cannot rename ${itemsBeingUpdated.length} workflow variables to "${newName}" at once. Variable names must be unique.`,
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
for (const item of itemsBeingUpdated) {
|
|
156
|
+
/*
|
|
157
|
+
* A no-op rename must stay a no-op. Compared case-insensitively because
|
|
158
|
+
* that is how the uniqueness lookup compares, so "TOKEN" -> "token" is a
|
|
159
|
+
* change of casing on the same row and not a collision with itself.
|
|
160
|
+
*/
|
|
161
|
+
if (item.name && item.name.toLowerCase() === newName.toLowerCase()) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/*
|
|
166
|
+
* The scope is what makes the lookup mean anything. projectId comes back
|
|
167
|
+
* from the select above and is non-nullable on the table, so its absence
|
|
168
|
+
* means the select or the row is wrong - and a missing projectId would
|
|
169
|
+
* silently drop the clause and count this name across every project on
|
|
170
|
+
* the instance. Refuse rather than answer the wrong question.
|
|
171
|
+
*/
|
|
172
|
+
if (!item.projectId) {
|
|
173
|
+
throw new BadDataException(
|
|
174
|
+
"This workflow variable cannot be renamed because it is not attached to a project.",
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const conflictCount: number = (
|
|
179
|
+
await this.countBy({
|
|
180
|
+
query: {
|
|
181
|
+
name: QueryHelper.findWithSameText(newName),
|
|
182
|
+
projectId: item.projectId,
|
|
183
|
+
/*
|
|
184
|
+
* Global variables are the rows with a null workflowId, and they
|
|
185
|
+
* share a namespace of their own. Querying `workflowId: undefined`
|
|
186
|
+
* would drop the clause entirely and compare a global variable
|
|
187
|
+
* against every workflow-local one in the project.
|
|
188
|
+
*/
|
|
189
|
+
workflowId: item.workflowId
|
|
190
|
+
? item.workflowId
|
|
191
|
+
: QueryHelper.isNull(),
|
|
192
|
+
_id: QueryHelper.notEquals(item.id as ObjectID),
|
|
193
|
+
},
|
|
194
|
+
props: {
|
|
195
|
+
isRoot: true,
|
|
196
|
+
},
|
|
197
|
+
})
|
|
198
|
+
).toNumber();
|
|
199
|
+
|
|
200
|
+
if (conflictCount > 0) {
|
|
201
|
+
throw new BadDataException(
|
|
202
|
+
item.workflowId
|
|
203
|
+
? `A workflow variable named "${newName}" already exists on this workflow. Variable names must be unique within a workflow.`
|
|
204
|
+
: `A global variable named "${newName}" already exists in this project. Global variable names must be unique.`,
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return { updateBy, carryForward: null };
|
|
210
|
+
}
|
|
8
211
|
}
|
|
9
212
|
export default new Service();
|
|
@@ -9,6 +9,9 @@ import ObjectID from "../../../../Types/ObjectID";
|
|
|
9
9
|
import PositiveNumber from "../../../../Types/PositiveNumber";
|
|
10
10
|
import Project from "../../../../Models/DatabaseModels/Project";
|
|
11
11
|
import CaptureSpan from "../../../Utils/Telemetry/CaptureSpan";
|
|
12
|
+
import PayAsYouGoBillingService, {
|
|
13
|
+
LiveUsageAuthorization,
|
|
14
|
+
} from "../../../Services/PayAsYouGoBillingService";
|
|
12
15
|
|
|
13
16
|
export default class ActiveMonitoringMeteredPlan extends ServerMeteredPlan {
|
|
14
17
|
@CaptureSpan()
|
|
@@ -44,6 +47,19 @@ export default class ActiveMonitoringMeteredPlan extends ServerMeteredPlan {
|
|
|
44
47
|
},
|
|
45
48
|
});
|
|
46
49
|
|
|
50
|
+
/*
|
|
51
|
+
* This runs on every monitor create and delete, so each live check here
|
|
52
|
+
* is a payment-provider read on a request path. Check once, and hand the
|
|
53
|
+
* answer to the usage write instead of letting it read the same payment
|
|
54
|
+
* setup again a moment later.
|
|
55
|
+
*/
|
|
56
|
+
const liveAuthorization: LiveUsageAuthorization | null =
|
|
57
|
+
await PayAsYouGoBillingService.authorizeUsageNow(projectId);
|
|
58
|
+
|
|
59
|
+
if (!liveAuthorization) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
47
63
|
// update this count in project as well.
|
|
48
64
|
const project: Project | null = await ProjectService.findOneById({
|
|
49
65
|
id: projectId,
|
|
@@ -67,6 +83,7 @@ export default class ActiveMonitoringMeteredPlan extends ServerMeteredPlan {
|
|
|
67
83
|
(project.paymentProviderMeteredSubscriptionId as string),
|
|
68
84
|
this,
|
|
69
85
|
count.toNumber(),
|
|
86
|
+
{ liveAuthorization: liveAuthorization },
|
|
70
87
|
);
|
|
71
88
|
}
|
|
72
89
|
}
|
|
@@ -8,6 +8,9 @@ import ObjectID from "../../../../Types/ObjectID";
|
|
|
8
8
|
import Project from "../../../../Models/DatabaseModels/Project";
|
|
9
9
|
import TelemetryUsageBilling from "../../../../Models/DatabaseModels/TelemetryUsageBilling";
|
|
10
10
|
import CaptureSpan from "../../../Utils/Telemetry/CaptureSpan";
|
|
11
|
+
import PayAsYouGoBillingService, {
|
|
12
|
+
LiveUsageAuthorization,
|
|
13
|
+
} from "../../../Services/PayAsYouGoBillingService";
|
|
11
14
|
|
|
12
15
|
export default class TelemetryMeteredPlan extends ServerMeteredPlan {
|
|
13
16
|
private _productType!: ProductType;
|
|
@@ -54,11 +57,37 @@ export default class TelemetryMeteredPlan extends ServerMeteredPlan {
|
|
|
54
57
|
meteredPlanSubscriptionId?: string | undefined;
|
|
55
58
|
},
|
|
56
59
|
): Promise<void> {
|
|
57
|
-
|
|
60
|
+
/*
|
|
61
|
+
* One live read of the payment setup for the whole report. Staging and the
|
|
62
|
+
* usage write each used to repeat it seconds later, for every product type
|
|
63
|
+
* of every project in the billing pass; they are handed this one instead,
|
|
64
|
+
* and still check live when it is not for this project or has aged out.
|
|
65
|
+
*/
|
|
66
|
+
const liveAuthorization: LiveUsageAuthorization | null =
|
|
67
|
+
await PayAsYouGoBillingService.authorizeUsageNow(projectId);
|
|
68
|
+
|
|
69
|
+
if (!liveAuthorization) {
|
|
70
|
+
await TelemetryUsageBillingService.waiveUnreportedUsageBilling({
|
|
71
|
+
projectId: projectId,
|
|
72
|
+
productType: this.productType,
|
|
73
|
+
});
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const billingStartsAt: Date | undefined =
|
|
78
|
+
await PayAsYouGoBillingService.getTelemetryBillingStartDate(projectId);
|
|
79
|
+
if (billingStartsAt) {
|
|
80
|
+
await TelemetryUsageBillingService.waiveUnreportedUsageBilling({
|
|
81
|
+
projectId: projectId,
|
|
82
|
+
productType: this.productType,
|
|
83
|
+
before: billingStartsAt,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
58
86
|
|
|
59
87
|
await TelemetryUsageBillingService.stageTelemetryUsageForProject({
|
|
60
88
|
projectId: projectId,
|
|
61
89
|
productType: this.productType,
|
|
90
|
+
liveAuthorization: liveAuthorization,
|
|
62
91
|
});
|
|
63
92
|
|
|
64
93
|
const usageBillings: Array<TelemetryUsageBilling> =
|
|
@@ -119,6 +148,7 @@ export default class TelemetryMeteredPlan extends ServerMeteredPlan {
|
|
|
119
148
|
(project.paymentProviderMeteredSubscriptionId as string),
|
|
120
149
|
this,
|
|
121
150
|
totalCostInCents,
|
|
151
|
+
{ liveAuthorization: liveAuthorization },
|
|
122
152
|
);
|
|
123
153
|
|
|
124
154
|
for (const usageBilling of usageBillings) {
|
|
@@ -398,6 +398,13 @@ export default class GitHubUtil extends HostedCodeRepository {
|
|
|
398
398
|
permissions?: {
|
|
399
399
|
contents?: "read" | "write";
|
|
400
400
|
pull_requests?: "read" | "write";
|
|
401
|
+
/*
|
|
402
|
+
* Issue READ/WRITE for the interactive app: GitHub routes pull
|
|
403
|
+
* request CONVERSATION comments through the issues API, so posting
|
|
404
|
+
* the app's acknowledgement on a pull request needs this scope just
|
|
405
|
+
* as much as answering a mention on an issue does.
|
|
406
|
+
*/
|
|
407
|
+
issues?: "read" | "write";
|
|
401
408
|
/*
|
|
402
409
|
* Check-run READ access for the Tier 1 CI verification sweep. The
|
|
403
410
|
* GitHub App must have the "Checks: Read-only" permission configured
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
2
|
+
import AIRunType from "../../../../Types/AI/AIRunType";
|
|
3
|
+
import AIRunStatus, {
|
|
4
|
+
AIRunStatusHelper,
|
|
5
|
+
} from "../../../../Types/AI/AIRunStatus";
|
|
6
|
+
import CodeFixTaskType, {
|
|
7
|
+
CodeFixTaskTypeHelper,
|
|
8
|
+
} from "../../../../Types/AI/CodeFixTaskType";
|
|
9
|
+
import CodeFixTaskContext, {
|
|
10
|
+
getGitHubConversationNumber,
|
|
11
|
+
getGitHubTaskContext,
|
|
12
|
+
GitHubTaskContext,
|
|
13
|
+
} from "../../../../Types/AI/CodeFixTaskContext";
|
|
14
|
+
import GitHubCommandType from "../../../../Types/CodeRepository/GitHubCommand";
|
|
15
|
+
import { LIMIT_PER_PROJECT } from "../../../../Types/Database/LimitMax";
|
|
16
|
+
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
17
|
+
import OneUptimeDate from "../../../../Types/Date";
|
|
18
|
+
import AIRun from "../../../../Models/DatabaseModels/AIRun";
|
|
19
|
+
import AIRunService from "../../../Services/AIRunService";
|
|
20
|
+
import FixRunBudget from "../../AI/CodeFix/FixRunBudget";
|
|
21
|
+
import QueryHelper from "../../../Types/Database/QueryHelper";
|
|
22
|
+
import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* Turns a GitHub command that has ALREADY been verified — signed webhook,
|
|
26
|
+
* repository bound to the project, commenter holds write access — into a
|
|
27
|
+
* queued CodeFix AIRun the agent worker can claim.
|
|
28
|
+
*
|
|
29
|
+
* The sibling of SubjectCodeFixRun for conversations instead of incidents. It
|
|
30
|
+
* enforces the same two things every enqueue path must: the project's daily
|
|
31
|
+
* fix-run budget, and at most one live run per piece of work. What is
|
|
32
|
+
* different is the dedupe key. An incident dedupes on its subject row; a
|
|
33
|
+
* GitHub command has no row, so the key is (repository, issue-or-pull-request,
|
|
34
|
+
* command) — which is exactly the granularity a user expects: asking for a
|
|
35
|
+
* review while a revision is running is two different requests, asking for the
|
|
36
|
+
* same review twice is one.
|
|
37
|
+
*/
|
|
38
|
+
export default class GitHubAgentTaskTrigger {
|
|
39
|
+
// Which recipe carries out each command. Conversational commands have none.
|
|
40
|
+
public static getTaskTypeForCommand(
|
|
41
|
+
commandType: GitHubCommandType,
|
|
42
|
+
): CodeFixTaskType | null {
|
|
43
|
+
switch (commandType) {
|
|
44
|
+
case GitHubCommandType.Implement:
|
|
45
|
+
return CodeFixTaskType.GitHubIssueFix;
|
|
46
|
+
case GitHubCommandType.Revise:
|
|
47
|
+
return CodeFixTaskType.GitHubPullRequestRevision;
|
|
48
|
+
case GitHubCommandType.Review:
|
|
49
|
+
return CodeFixTaskType.GitHubPullRequestReview;
|
|
50
|
+
default:
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/*
|
|
56
|
+
* The live run, if any, for this exact piece of work.
|
|
57
|
+
*
|
|
58
|
+
* The conversation number lives inside the JSON taskContext, which the query
|
|
59
|
+
* layer cannot filter on — so this reads the project's non-terminal GitHub
|
|
60
|
+
* runs (bounded and short-lived: they exist only between a comment and its
|
|
61
|
+
* pull request) and matches in memory. The same honest trade
|
|
62
|
+
* SubjectCodeFixRun makes for its per-trace and per-service guards.
|
|
63
|
+
*/
|
|
64
|
+
@CaptureSpan()
|
|
65
|
+
public static async findNonTerminalRunForConversation(data: {
|
|
66
|
+
projectId: ObjectID;
|
|
67
|
+
codeRepositoryId: ObjectID;
|
|
68
|
+
conversationNumber: number;
|
|
69
|
+
taskType: CodeFixTaskType;
|
|
70
|
+
}): Promise<AIRun | null> {
|
|
71
|
+
const activeRuns: Array<AIRun> = await AIRunService.findBy({
|
|
72
|
+
query: {
|
|
73
|
+
projectId: data.projectId,
|
|
74
|
+
runType: AIRunType.CodeFix,
|
|
75
|
+
codeFixTaskType: data.taskType,
|
|
76
|
+
status: QueryHelper.notIn(AIRunStatusHelper.terminalStatuses()),
|
|
77
|
+
},
|
|
78
|
+
select: { _id: true, taskContext: true },
|
|
79
|
+
limit: LIMIT_PER_PROJECT,
|
|
80
|
+
skip: 0,
|
|
81
|
+
props: { isRoot: true },
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
activeRuns.find((run: AIRun): boolean => {
|
|
86
|
+
const github: GitHubTaskContext | null = getGitHubTaskContext(
|
|
87
|
+
run.taskContext,
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
if (!github) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return (
|
|
95
|
+
github.codeRepositoryId === data.codeRepositoryId.toString() &&
|
|
96
|
+
getGitHubConversationNumber(github) === data.conversationNumber
|
|
97
|
+
);
|
|
98
|
+
}) || null
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/*
|
|
103
|
+
* Every live run for one conversation, whatever the recipe — what "@oneuptime
|
|
104
|
+
* cancel" acts on. A user cancelling a thread means "stop whatever you are
|
|
105
|
+
* doing here", not "stop the one recipe I happen to name".
|
|
106
|
+
*/
|
|
107
|
+
@CaptureSpan()
|
|
108
|
+
public static async findNonTerminalRunsForConversation(data: {
|
|
109
|
+
projectId: ObjectID;
|
|
110
|
+
codeRepositoryId: ObjectID;
|
|
111
|
+
conversationNumber: number;
|
|
112
|
+
}): Promise<Array<AIRun>> {
|
|
113
|
+
const activeRuns: Array<AIRun> = await AIRunService.findBy({
|
|
114
|
+
query: {
|
|
115
|
+
projectId: data.projectId,
|
|
116
|
+
runType: AIRunType.CodeFix,
|
|
117
|
+
codeFixTaskType: QueryHelper.any(
|
|
118
|
+
CodeFixTaskTypeHelper.getGitHubTaskTypes(),
|
|
119
|
+
),
|
|
120
|
+
status: QueryHelper.notIn(AIRunStatusHelper.terminalStatuses()),
|
|
121
|
+
},
|
|
122
|
+
select: { _id: true, taskContext: true, status: true },
|
|
123
|
+
limit: LIMIT_PER_PROJECT,
|
|
124
|
+
skip: 0,
|
|
125
|
+
props: { isRoot: true },
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
return activeRuns.filter((run: AIRun): boolean => {
|
|
129
|
+
const github: GitHubTaskContext | null = getGitHubTaskContext(
|
|
130
|
+
run.taskContext,
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
if (!github) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return (
|
|
138
|
+
github.codeRepositoryId === data.codeRepositoryId.toString() &&
|
|
139
|
+
getGitHubConversationNumber(github) === data.conversationNumber
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/*
|
|
145
|
+
* Record the durable intent as a Queued CodeFix AIRun.
|
|
146
|
+
*
|
|
147
|
+
* Created as root: AIRun rows are server-written only (empty create ACL).
|
|
148
|
+
* The caller must already have established that this command is allowed —
|
|
149
|
+
* that the webhook signature verified, that the installation is bound to
|
|
150
|
+
* the project, and that the commenter can write to the repository.
|
|
151
|
+
*
|
|
152
|
+
* Throws BadDataException when a run for this work is already live or when
|
|
153
|
+
* the project is over its daily fix-run budget. The webhook handler turns
|
|
154
|
+
* both into a plain-English reply in the thread rather than a silent drop:
|
|
155
|
+
* a command that produces no visible response reads as a broken integration.
|
|
156
|
+
*/
|
|
157
|
+
@CaptureSpan()
|
|
158
|
+
public static async enqueueGitHubCodeFixRun(data: {
|
|
159
|
+
projectId: ObjectID;
|
|
160
|
+
taskType: CodeFixTaskType;
|
|
161
|
+
github: GitHubTaskContext;
|
|
162
|
+
}): Promise<AIRun> {
|
|
163
|
+
if (!CodeFixTaskTypeHelper.isGitHubTaskType(data.taskType)) {
|
|
164
|
+
throw new BadDataException(
|
|
165
|
+
`${data.taskType} is not a GitHub-triggered task type.`,
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const github: GitHubTaskContext | null = getGitHubTaskContext({
|
|
170
|
+
github: data.github,
|
|
171
|
+
} as CodeFixTaskContext);
|
|
172
|
+
|
|
173
|
+
if (!github) {
|
|
174
|
+
throw new BadDataException(
|
|
175
|
+
"A GitHub run needs a repository and exactly one issue or pull request.",
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
GitHubAgentTaskTrigger.assertTaskTypeMatchesContext(data.taskType, github);
|
|
180
|
+
|
|
181
|
+
const conversationNumber: number = getGitHubConversationNumber(github);
|
|
182
|
+
|
|
183
|
+
const existingRun: AIRun | null =
|
|
184
|
+
await GitHubAgentTaskTrigger.findNonTerminalRunForConversation({
|
|
185
|
+
projectId: data.projectId,
|
|
186
|
+
codeRepositoryId: new ObjectID(github.codeRepositoryId),
|
|
187
|
+
conversationNumber: conversationNumber,
|
|
188
|
+
taskType: data.taskType,
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
if (existingRun) {
|
|
192
|
+
throw new BadDataException(
|
|
193
|
+
"I am already working on this — I will comment here when I am done.",
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
await FixRunBudget.assertWithinBudget(data.projectId, {});
|
|
198
|
+
|
|
199
|
+
const run: AIRun = new AIRun();
|
|
200
|
+
run.projectId = data.projectId;
|
|
201
|
+
run.runType = AIRunType.CodeFix;
|
|
202
|
+
run.codeFixTaskType = data.taskType;
|
|
203
|
+
run.status = AIRunStatus.Queued;
|
|
204
|
+
run.taskContext = { github: github };
|
|
205
|
+
|
|
206
|
+
return AIRunService.create({
|
|
207
|
+
data: run,
|
|
208
|
+
props: { isRoot: true },
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/*
|
|
213
|
+
* A queued run must be EXECUTABLE by the recipe it names.
|
|
214
|
+
*
|
|
215
|
+
* getGitHubTaskContext proves the context is well formed; it does not prove
|
|
216
|
+
* it matches the recipe. A revision with an issue-only context, or one with
|
|
217
|
+
* no head branch pinned, passes every other check and is then claimed by a
|
|
218
|
+
* worker that has nothing to push to — a run that was accepted, told the
|
|
219
|
+
* user "on it", and could never have succeeded. Catch it at the boundary,
|
|
220
|
+
* where the message can still be honest about what went wrong.
|
|
221
|
+
*/
|
|
222
|
+
private static assertTaskTypeMatchesContext(
|
|
223
|
+
taskType: CodeFixTaskType,
|
|
224
|
+
github: GitHubTaskContext,
|
|
225
|
+
): void {
|
|
226
|
+
if (taskType === CodeFixTaskType.GitHubIssueFix) {
|
|
227
|
+
if (github.issueNumber === undefined) {
|
|
228
|
+
throw new BadDataException(
|
|
229
|
+
"A GitHub issue task needs an issue to work on.",
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (github.pullRequestNumber === undefined) {
|
|
237
|
+
throw new BadDataException(
|
|
238
|
+
"A GitHub pull request task needs a pull request to work on.",
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
* Only a revision needs a branch. A review of a pull request from a fork
|
|
244
|
+
* deliberately has none — it works from the base branch plus the diff.
|
|
245
|
+
*/
|
|
246
|
+
if (
|
|
247
|
+
taskType === CodeFixTaskType.GitHubPullRequestRevision &&
|
|
248
|
+
!github.pullRequestHeadRefName
|
|
249
|
+
) {
|
|
250
|
+
throw new BadDataException(
|
|
251
|
+
"I cannot revise this pull request because its branch is not in this repository — it may come from a fork.",
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/*
|
|
257
|
+
* Record the app's acknowledgement comment on the run, so a later status
|
|
258
|
+
* change edits that comment instead of posting another one.
|
|
259
|
+
*
|
|
260
|
+
* Written after the INSERT rather than as part of it because the comment
|
|
261
|
+
* cannot exist before the run does — the comment links to the run's page.
|
|
262
|
+
* A failure here is not worth failing the run over: the worst case is one
|
|
263
|
+
* extra comment when the run finishes.
|
|
264
|
+
*
|
|
265
|
+
* The stored context is re-read and merged rather than overwritten from the
|
|
266
|
+
* caller's in-memory copy. TypeORM replaces a jsonb column wholesale, so
|
|
267
|
+
* writing the caller's object would clobber anything another writer put
|
|
268
|
+
* there in between — a narrow window, but a lost update on a column the
|
|
269
|
+
* outcome sweeper also touches.
|
|
270
|
+
*/
|
|
271
|
+
@CaptureSpan()
|
|
272
|
+
public static async recordAcknowledgementComment(data: {
|
|
273
|
+
aiRunId: ObjectID;
|
|
274
|
+
github: GitHubTaskContext;
|
|
275
|
+
acknowledgementCommentId: number;
|
|
276
|
+
}): Promise<void> {
|
|
277
|
+
const run: AIRun | null = await AIRunService.findOneById({
|
|
278
|
+
id: data.aiRunId,
|
|
279
|
+
select: { _id: true, taskContext: true },
|
|
280
|
+
props: { isRoot: true },
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
const storedContext: CodeFixTaskContext = run?.taskContext || {};
|
|
284
|
+
|
|
285
|
+
await AIRunService.updateOneById({
|
|
286
|
+
id: data.aiRunId,
|
|
287
|
+
data: {
|
|
288
|
+
taskContext: {
|
|
289
|
+
...storedContext,
|
|
290
|
+
github: {
|
|
291
|
+
...data.github,
|
|
292
|
+
...(storedContext.github || {}),
|
|
293
|
+
acknowledgementCommentId: data.acknowledgementCommentId,
|
|
294
|
+
},
|
|
295
|
+
},
|
|
296
|
+
} as never,
|
|
297
|
+
props: { isRoot: true },
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/*
|
|
302
|
+
* Cancel every live run for a conversation.
|
|
303
|
+
*
|
|
304
|
+
* A Queued run is cancelled outright — no worker holds it. A Running one is
|
|
305
|
+
* also marked Cancelled: the worker cannot be reached mid-run, but the CAS
|
|
306
|
+
* transitions on the reporting endpoints mean its late Completed/Error
|
|
307
|
+
* report simply loses the race and does not resurrect the run. The user gets
|
|
308
|
+
* the honest answer either way, which is why the count is returned.
|
|
309
|
+
*/
|
|
310
|
+
@CaptureSpan()
|
|
311
|
+
public static async cancelRunsForConversation(data: {
|
|
312
|
+
projectId: ObjectID;
|
|
313
|
+
codeRepositoryId: ObjectID;
|
|
314
|
+
conversationNumber: number;
|
|
315
|
+
}): Promise<number> {
|
|
316
|
+
const runs: Array<AIRun> =
|
|
317
|
+
await GitHubAgentTaskTrigger.findNonTerminalRunsForConversation(data);
|
|
318
|
+
|
|
319
|
+
let cancelledCount: number = 0;
|
|
320
|
+
|
|
321
|
+
for (const run of runs) {
|
|
322
|
+
if (!run.id || !run.status) {
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
const transitioned: number = await AIRunService.attemptStatusTransition({
|
|
327
|
+
aiRunId: run.id,
|
|
328
|
+
fromStatus: run.status,
|
|
329
|
+
set: {
|
|
330
|
+
status: AIRunStatus.Cancelled,
|
|
331
|
+
completedAt: OneUptimeDate.getCurrentDate(),
|
|
332
|
+
errorMessage: "Cancelled from GitHub.",
|
|
333
|
+
},
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
cancelledCount += transitioned;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return cancelledCount;
|
|
340
|
+
}
|
|
341
|
+
}
|