From 41f4d11c06a7e72cc533d108b5a9f140f7ba7d23 Mon Sep 17 00:00:00 2001 From: David Viejo Date: Tue, 4 Aug 2026 22:06:30 +0200 Subject: [PATCH 1/5] feat(console): improve user and project onboarding Expose exact role permissions and secure first-login user provisioning. Add project setup guidance, preset-aware drop uploads, environment variables, and deployment timing fixes. --- .../temps-agents/src/handlers/definitions.rs | 1 + crates/temps-ai-api-tools/src/caller.rs | 3 + .../src/integration_tests.rs | 1 + crates/temps-ai-chat/src/handlers.rs | 1 + crates/temps-ai-chat/src/pending_actions.rs | 1 + crates/temps-ai-chat/src/service.rs | 1 + .../src/handlers/events_handler.rs | 1 + crates/temps-audit/src/handlers/handlers.rs | 1 + crates/temps-auth/src/apikey_handler.rs | 1 + crates/temps-auth/src/apikey_types.rs | 42 +- crates/temps-auth/src/auth_service.rs | 423 +++++++++++- crates/temps-auth/src/cli_device_handler.rs | 1 + crates/temps-auth/src/handlers.rs | 429 ++++++++++-- crates/temps-auth/src/oidc_handler.rs | 64 ++ crates/temps-auth/src/oidc_service.rs | 2 +- crates/temps-auth/src/permission_guard.rs | 1 + crates/temps-auth/src/permissions.rs | 1 - crates/temps-auth/src/sensitive_action.rs | 1 + crates/temps-auth/src/types.rs | 7 +- crates/temps-auth/src/user_service.rs | 415 +++++++++++- crates/temps-auth/tests/context_tests.rs | 1 + crates/temps-blob/src/handlers/handler.rs | 1 + .../temps-cli/src/commands/serve/console.rs | 3 + crates/temps-cli/src/commands/setup.rs | 1 + .../src/handlers/deployments.rs | 1 + .../src/services/job_processor.rs | 20 +- .../src/handlers/tracking_tests.rs | 1 + crates/temps-entities/src/users.rs | 1 + .../src/handlers/handler.rs | 1 + .../src/sentry/dsn_handlers.rs | 1 + crates/temps-external-plugins/src/handler.rs | 1 + crates/temps-flags/src/handlers/handler.rs | 1 + crates/temps-geo/src/handlers.rs | 1 + crates/temps-kv/src/handlers/handler.rs | 1 + .../src/handlers/log_handler.rs | 2 + ...00001_add_must_change_password_to_users.rs | 49 ++ crates/temps-migrations/src/migration/mod.rs | 2 + crates/temps-notifications/src/handlers.rs | 1 + .../temps-providers/src/handlers/handlers.rs | 1 + .../src/handlers/metrics_handlers.rs | 1 + .../temps-sandbox/src/handlers/sandboxes.rs | 1 + .../src/handlers/project_access.rs | 1 + web/src/App.tsx | 610 ++++++++++++------ .../api/client/@tanstack/react-query.gen.ts | 18 +- web/src/api/client/index.ts | 4 +- web/src/api/client/sdk.gen.ts | 11 +- web/src/api/client/types.gen.ts | 61 ++ web/src/components/dashboard/Sidebar.tsx | 119 +--- .../components/drop/DetectedPresetCard.tsx | 157 +++++ .../components/drop/DetectedPresetGrid.tsx | 88 +++ .../drop/DropEnvironmentVariables.tsx | 160 +++++ web/src/components/presets/PresetIcon.tsx | 40 ++ .../components/presets/preset-icon-paths.ts | 44 ++ .../components/templates/TemplateImage.tsx | 30 +- .../users/RolePermissionDetails.tsx | 126 ++++ web/src/components/users/UsersManagement.tsx | 221 +------ web/src/hooks/useProjectSetup.test.ts | 50 ++ web/src/hooks/useProjectSetup.ts | 183 ++++++ web/src/lib/drop-archive.ts | 36 +- .../lib/drop-environment-variables.test.ts | 37 ++ web/src/lib/drop-environment-variables.ts | 31 + web/src/lib/drop-preset-detection.test.ts | 66 ++ web/src/lib/drop-preset-detection.ts | 32 + web/src/lib/password-policy.test.ts | 44 ++ web/src/lib/password-policy.ts | 91 +++ web/src/lib/role-permissions.test.ts | 43 ++ web/src/lib/role-permissions.ts | 51 ++ web/src/pages/Account.tsx | 58 +- web/src/pages/CreateUser.tsx | 568 ++++++++++++++++ web/src/pages/Drop.tsx | 474 +++++++++----- web/src/pages/Login.tsx | 48 +- web/src/pages/ProjectDetail.tsx | 2 + web/src/pages/ProjectDrop.tsx | 427 +++++++----- web/src/pages/ProjectSetup.tsx | 226 +++++++ web/src/pages/RequiredPasswordChange.tsx | 300 +++++++++ web/src/pages/ResetPassword.tsx | 17 +- web/src/pages/Users.tsx | 7 +- 77 files changed, 4951 insertions(+), 1019 deletions(-) create mode 100644 crates/temps-migrations/src/migration/m20260804_000001_add_must_change_password_to_users.rs create mode 100644 web/src/components/drop/DetectedPresetCard.tsx create mode 100644 web/src/components/drop/DetectedPresetGrid.tsx create mode 100644 web/src/components/drop/DropEnvironmentVariables.tsx create mode 100644 web/src/components/presets/PresetIcon.tsx create mode 100644 web/src/components/presets/preset-icon-paths.ts create mode 100644 web/src/components/users/RolePermissionDetails.tsx create mode 100644 web/src/hooks/useProjectSetup.test.ts create mode 100644 web/src/hooks/useProjectSetup.ts create mode 100644 web/src/lib/drop-environment-variables.test.ts create mode 100644 web/src/lib/drop-environment-variables.ts create mode 100644 web/src/lib/drop-preset-detection.test.ts create mode 100644 web/src/lib/drop-preset-detection.ts create mode 100644 web/src/lib/password-policy.test.ts create mode 100644 web/src/lib/password-policy.ts create mode 100644 web/src/lib/role-permissions.test.ts create mode 100644 web/src/lib/role-permissions.ts create mode 100644 web/src/pages/CreateUser.tsx create mode 100644 web/src/pages/ProjectSetup.tsx create mode 100644 web/src/pages/RequiredPasswordChange.tsx diff --git a/crates/temps-agents/src/handlers/definitions.rs b/crates/temps-agents/src/handlers/definitions.rs index a2e66e391..1297140af 100644 --- a/crates/temps-agents/src/handlers/definitions.rs +++ b/crates/temps-agents/src/handlers/definitions.rs @@ -1613,6 +1613,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-ai-api-tools/src/caller.rs b/crates/temps-ai-api-tools/src/caller.rs index b7bf48548..1138c0e4d 100644 --- a/crates/temps-ai-api-tools/src/caller.rs +++ b/crates/temps-ai-api-tools/src/caller.rs @@ -2513,6 +2513,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, @@ -2553,6 +2554,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, @@ -2606,6 +2608,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-ai-api-tools/src/integration_tests.rs b/crates/temps-ai-api-tools/src/integration_tests.rs index 884b46eca..63a3aa53a 100644 --- a/crates/temps-ai-api-tools/src/integration_tests.rs +++ b/crates/temps-ai-api-tools/src/integration_tests.rs @@ -44,6 +44,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-ai-chat/src/handlers.rs b/crates/temps-ai-chat/src/handlers.rs index 59108f117..c3e3da102 100644 --- a/crates/temps-ai-chat/src/handlers.rs +++ b/crates/temps-ai-chat/src/handlers.rs @@ -1280,6 +1280,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-ai-chat/src/pending_actions.rs b/crates/temps-ai-chat/src/pending_actions.rs index 1eba72d8d..701d614ad 100644 --- a/crates/temps-ai-chat/src/pending_actions.rs +++ b/crates/temps-ai-chat/src/pending_actions.rs @@ -590,6 +590,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-ai-chat/src/service.rs b/crates/temps-ai-chat/src/service.rs index 5e1e244b0..197ac595f 100644 --- a/crates/temps-ai-chat/src/service.rs +++ b/crates/temps-ai-chat/src/service.rs @@ -2170,6 +2170,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-analytics-events/src/handlers/events_handler.rs b/crates/temps-analytics-events/src/handlers/events_handler.rs index 444f48fb7..dc3587b66 100644 --- a/crates/temps-analytics-events/src/handlers/events_handler.rs +++ b/crates/temps-analytics-events/src/handlers/events_handler.rs @@ -1220,6 +1220,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-audit/src/handlers/handlers.rs b/crates/temps-audit/src/handlers/handlers.rs index 935ea0adf..e9a33be51 100644 --- a/crates/temps-audit/src/handlers/handlers.rs +++ b/crates/temps-audit/src/handlers/handlers.rs @@ -154,6 +154,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-auth/src/apikey_handler.rs b/crates/temps-auth/src/apikey_handler.rs index f14f3c4ee..81ddaa21c 100644 --- a/crates/temps-auth/src/apikey_handler.rs +++ b/crates/temps-auth/src/apikey_handler.rs @@ -582,6 +582,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-auth/src/apikey_types.rs b/crates/temps-auth/src/apikey_types.rs index e68d7eb7e..3c6a7ab0a 100644 --- a/crates/temps-auth/src/apikey_types.rs +++ b/crates/temps-auth/src/apikey_types.rs @@ -94,7 +94,9 @@ impl RoleInfo { Role::PlatformAdmin => { "Platform administration (users, settings, system) without deploy access to projects or deployments" } - Role::User => "Standard user access with ability to manage own resources", + Role::User => { + "Manage every existing and future project without user or system administration" + } Role::Reader => "Read-only access to resources", Role::ApiReader => "Read-only API access", Role::Custom => "Custom role with specific permissions", @@ -123,3 +125,41 @@ pub fn get_available_permissions() -> AvailablePermissions { AvailablePermissions { permissions, roles } } + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashSet; + + #[test] + fn role_catalog_exposes_the_exact_permission_set() { + let catalog = get_available_permissions(); + let user = catalog + .roles + .iter() + .find(|role| role.name == "user") + .expect("user role is present"); + let expected: Vec = Role::User + .permissions() + .iter() + .map(ToString::to_string) + .collect(); + + assert_eq!(user.permissions, expected); + assert!(user + .description + .contains("every existing and future project")); + } + + #[test] + fn predefined_roles_do_not_report_duplicate_permissions() { + for role in Role::all() { + let unique: HashSet<_> = role.permissions().iter().collect(); + assert_eq!( + unique.len(), + role.permissions().len(), + "role {role} contains duplicate permissions" + ); + } + } +} diff --git a/crates/temps-auth/src/auth_service.rs b/crates/temps-auth/src/auth_service.rs index eafcba6e9..c6eb65d47 100644 --- a/crates/temps-auth/src/auth_service.rs +++ b/crates/temps-auth/src/auth_service.rs @@ -7,7 +7,7 @@ use cookie::Cookie; use rand::RngExt; use sea_orm::{ ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait, PaginatorTrait, QueryFilter, - Set, TransactionTrait, + QuerySelect, Set, TransactionTrait, }; use serde::Serialize; use std::sync::Arc; @@ -73,6 +73,8 @@ pub enum AuthError { WeakPassword(String), #[error("Account has no password set (likely an SSO-only user)")] NoPasswordSet, + #[error("User {user_id} must change their password before a session can be created")] + PasswordChangeRequired { user_id: i32 }, } #[derive(Error, Debug)] @@ -121,6 +123,15 @@ impl AuthService { } pub async fn create_session(&self, user_id: i32) -> Result { + let user = temps_entities::users::Entity::find_by_id(user_id) + .filter(temps_entities::users::Column::DeletedAt.is_null()) + .one(self.db.as_ref()) + .await? + .ok_or_else(|| AuthError::NotFound(format!("User {user_id} not found or deleted")))?; + if user.must_change_password { + return Err(AuthError::PasswordChangeRequired { user_id }); + } + let session_token = self.generate_session_token(); let expires_at = Utc::now() + Duration::days(7); @@ -289,6 +300,16 @@ impl AuthService { session_token: &str, code: &str, ) -> Result { + let transaction = self + .db + .begin() + .await + .map_err(|source| MfaChallengeError::Database { + operation: "start the MFA challenge transaction", + user_id: None, + source, + })?; + // Get the user from the temporary session. Require mfa_pending so a // real (fully authenticated) session token can never be spent as an // MFA challenge -- the discriminator cuts both ways. @@ -296,7 +317,7 @@ impl AuthService { .filter(temps_entities::sessions::Column::SessionToken.eq(session_token)) .filter(temps_entities::sessions::Column::ExpiresAt.gt(Utc::now())) .filter(temps_entities::sessions::Column::MfaPending.eq(true)) - .one(self.db.as_ref()) + .one(&transaction) .await .map_err(|source| MfaChallengeError::Database { operation: "load the pending session", @@ -306,7 +327,8 @@ impl AuthService { .ok_or(MfaChallengeError::InvalidOrExpiredSession)?; let user = temps_entities::users::Entity::find_by_id(session.user_id) - .one(self.db.as_ref()) + .lock_exclusive() + .one(&transaction) .await .map_err(|source| MfaChallengeError::Database { operation: "load the challenge user", @@ -322,18 +344,45 @@ impl AuthService { return Err(MfaChallengeError::InvalidCode { user_id: user.id }); } - // Delete the temporary session - temps_entities::sessions::Entity::delete_many() + let mut verified_user = user; + if !verified_user.mfa_enabled { + let mut user_update: temps_entities::users::ActiveModel = verified_user.into(); + user_update.mfa_enabled = Set(true); + verified_user = user_update.update(&transaction).await.map_err(|source| { + MfaChallengeError::Database { + operation: "enable MFA for the challenge user", + user_id: Some(session.user_id), + source, + } + })?; + } + + // Consume the challenge in the same transaction as enrollment so a + // failed update never strands the user without a retryable challenge. + let deletion = temps_entities::sessions::Entity::delete_many() .filter(temps_entities::sessions::Column::SessionToken.eq(session_token)) - .exec(self.db.as_ref()) + .filter(temps_entities::sessions::Column::MfaPending.eq(true)) + .exec(&transaction) .await .map_err(|source| MfaChallengeError::Database { operation: "consume the verified pending session", - user_id: Some(user.id), + user_id: Some(verified_user.id), source, })?; + if deletion.rows_affected != 1 { + return Err(MfaChallengeError::InvalidOrExpiredSession); + } - Ok(user) + transaction + .commit() + .await + .map_err(|source| MfaChallengeError::Database { + operation: "commit the verified MFA challenge", + user_id: Some(verified_user.id), + source, + })?; + + Ok(verified_user) } fn verify_totp_code( @@ -410,6 +459,7 @@ impl AuthService { email: Set(request.email.to_lowercase()), name: Set(request.name.clone()), password_hash: Set(Some(password_hash)), + must_change_password: Set(false), email_verified: Set(false), created_at: Set(Utc::now()), updated_at: Set(Utc::now()), @@ -499,6 +549,14 @@ impl AuthService { return Err(UserAuthError::InvalidCredentials); } + // A required password change is completed before role-based MFA + // enrollment. The password-change handler starts a pending MFA + // challenge when the policy applies, without issuing a full session. + if user.must_change_password { + debug!("Temporary password verified for user {}", user.id); + return Ok(user); + } + // SOC2 hardening (bherila/temps#32): operators can require MFA // enrollment for Admin-role accounts via the `require_mfa_for_admins` // setting. This check only runs in the password-login path -- SSO/OIDC @@ -541,6 +599,55 @@ impl AuthService { Ok(user) } + /// Create a short-lived reset credential after the user's temporary + /// password has been verified. No regular session is created while the + /// account is marked as requiring a password change. + pub async fn create_required_password_change_token( + &self, + user_id: i32, + ) -> Result { + let user = temps_entities::users::Entity::find_by_id(user_id) + .one(self.db.as_ref()) + .await? + .ok_or(UserAuthError::UserNotFound)?; + + if !user.must_change_password { + return Err(UserAuthError::PasswordChangeNotRequired { user_id }); + } + + let token = self.generate_token(); + let mut user_update: temps_entities::users::ActiveModel = user.into(); + user_update.password_reset_token = Set(Some(token.clone())); + user_update.password_reset_expires = Set(Some(Utc::now() + Duration::minutes(15))); + user_update.update(self.db.as_ref()).await?; + + Ok(token) + } + + /// Resolve a live first-login password-change credential without + /// consuming it. The handler uses this to evaluate post-change policy + /// before committing the password replacement. + pub async fn required_password_change_user( + &self, + token: &str, + ) -> Result { + let user = temps_entities::users::Entity::find() + .filter(temps_entities::users::Column::PasswordResetToken.eq(token)) + .one(self.db.as_ref()) + .await? + .ok_or(UserAuthError::InvalidToken)?; + + if !user.must_change_password + || user + .password_reset_expires + .is_none_or(|expires_at| expires_at < Utc::now()) + { + return Err(UserAuthError::InvalidToken); + } + + Ok(user) + } + // Request password reset pub async fn request_password_reset(&self, email: &str) -> Result<(), UserAuthError> { // Check if email service is configured @@ -583,9 +690,11 @@ impl AuthService { validate_password_complexity(&request.new_password)?; // Find user by reset token + let transaction = self.db.begin().await?; let user = temps_entities::users::Entity::find() .filter(temps_entities::users::Column::PasswordResetToken.eq(&request.token)) - .one(self.db.as_ref()) + .lock_exclusive() + .one(&transaction) .await? .ok_or(UserAuthError::InvalidToken)?; @@ -598,6 +707,19 @@ impl AuthService { return Err(UserAuthError::InvalidToken); } + if user.must_change_password { + if let Some(current_hash) = user.password_hash.as_deref() { + let parsed_hash = argon2::password_hash::PasswordHash::new(current_hash) + .map_err(|_| UserAuthError::PasswordHashError)?; + if argon2::Argon2::default() + .verify_password(request.new_password.as_bytes(), &parsed_hash) + .is_ok() + { + return Err(UserAuthError::SamePassword); + } + } + } + // Hash new password use argon2::password_hash::{rand_core::OsRng, SaltString}; let argon2 = argon2::Argon2::default(); @@ -613,12 +735,91 @@ impl AuthService { user_update.password_hash = Set(Some(password_hash)); user_update.password_reset_token = Set(None); user_update.password_reset_expires = Set(None); + user_update.must_change_password = Set(false); user_update.updated_at = Set(Utc::now()); - let updated_user = user_update.update(self.db.as_ref()).await?; + let updated_user = user_update.update(&transaction).await?; + transaction.commit().await?; Ok(updated_user) } + /// Complete the first-login password change. Unlike an email reset, this + /// requires the account to still be flagged and rejects reuse of the + /// administrator-provided temporary password. + pub async fn reset_required_password( + &self, + request: ResetPasswordRequest, + ) -> Result { + validate_password_complexity(&request.new_password)?; + + let transaction = self.db.begin().await?; + let user = temps_entities::users::Entity::find() + .filter(temps_entities::users::Column::PasswordResetToken.eq(&request.token)) + .lock_exclusive() + .one(&transaction) + .await? + .ok_or(UserAuthError::InvalidToken)?; + + if !user.must_change_password + || user + .password_reset_expires + .is_none_or(|expires_at| expires_at < Utc::now()) + { + return Err(UserAuthError::InvalidToken); + } + + if let Some(current_hash) = user.password_hash.as_deref() { + let parsed_hash = argon2::password_hash::PasswordHash::new(current_hash) + .map_err(|_| UserAuthError::PasswordHashError)?; + if argon2::Argon2::default() + .verify_password(request.new_password.as_bytes(), &parsed_hash) + .is_ok() + { + return Err(UserAuthError::SamePassword); + } + } + + use argon2::password_hash::{rand_core::OsRng, SaltString}; + let salt = SaltString::generate(&mut OsRng); + let password_hash = argon2::Argon2::default() + .hash_password(request.new_password.as_bytes(), &salt) + .map_err(|_| UserAuthError::PasswordHashError)? + .to_string(); + + let mut user_update: temps_entities::users::ActiveModel = user.into(); + user_update.password_hash = Set(Some(password_hash)); + user_update.password_reset_token = Set(None); + user_update.password_reset_expires = Set(None); + user_update.must_change_password = Set(false); + user_update.updated_at = Set(Utc::now()); + let updated_user = user_update.update(&transaction).await?; + transaction.commit().await?; + Ok(updated_user) + } + + pub async fn requires_mfa_enrollment(&self, user_id: i32) -> Result { + let settings = self.get_settings().await?; + if !settings.require_mfa_for_admins { + return Ok(false); + } + + let user = temps_entities::users::Entity::find_by_id(user_id) + .one(self.db.as_ref()) + .await? + .ok_or(UserAuthError::UserNotFound)?; + if user.mfa_enabled { + return Ok(false); + } + + crate::user_service::UserService::new(self.db.clone()) + .is_admin(user_id) + .await + .map_err(|error| UserAuthError::RoleLookup { + user_id, + reason: error.to_string(), + }) + } + /// In-app password change for an authenticated user. /// /// Distinct from [`reset_password`] — that flow runs out-of-band via an @@ -883,6 +1084,12 @@ pub enum UserAuthError { "MFA is required for the '{role}' role but user {user_id} has not enrolled multi-factor authentication" )] MfaRequiredForRole { user_id: i32, role: String }, + #[error("User {user_id} is not required to change their password")] + PasswordChangeNotRequired { user_id: i32 }, + #[error("New password must differ from the temporary password")] + SamePassword, + #[error("Failed to determine roles for user {user_id}: {reason}")] + RoleLookup { user_id: i32, reason: String }, } /// Detect a Postgres unique-constraint violation regardless of the specific @@ -1607,6 +1814,7 @@ mod tests { let mut user_update: users::ActiveModel = user.clone().into(); user_update.password_reset_token = Set(Some(reset_token.clone())); user_update.password_reset_expires = Set(Some(Utc::now() + Duration::hours(1))); + user_update.must_change_password = Set(true); user_update.update(db.db.as_ref()).await.unwrap(); // Reset password @@ -1626,6 +1834,7 @@ mod tests { assert!(updated_user.password_reset_token.is_none()); assert!(updated_user.password_reset_expires.is_none()); + assert!(!updated_user.must_change_password); // Verify new password works let login = LoginRequest { @@ -1635,6 +1844,198 @@ mod tests { auth_service.login(login).await.unwrap(); } + #[tokio::test] + async fn email_reset_rejects_temporary_password_reuse() { + let (db, auth_service, _) = setup_test_env().await; + let user = + create_test_user(&db.db, "forced-email-reset@example.com", "Temporary123!").await; + let reset_token = Uuid::new_v4().to_string(); + let mut user_update: users::ActiveModel = user.clone().into(); + user_update.password_reset_token = Set(Some(reset_token.clone())); + user_update.password_reset_expires = Set(Some(Utc::now() + Duration::hours(1))); + user_update.must_change_password = Set(true); + user_update.update(db.db.as_ref()).await.unwrap(); + + let result = auth_service + .reset_password(ResetPasswordRequest { + token: reset_token.clone(), + new_password: "Temporary123!".to_string(), + }) + .await; + + assert!(matches!(result, Err(UserAuthError::SamePassword))); + let unchanged = users::Entity::find_by_id(user.id) + .one(db.db.as_ref()) + .await + .unwrap() + .unwrap(); + assert!(unchanged.must_change_password); + assert_eq!( + unchanged.password_reset_token.as_deref(), + Some(reset_token.as_str()) + ); + } + + #[tokio::test] + async fn required_password_change_rejects_temporary_password_reuse() { + let (db, auth_service, _) = setup_test_env().await; + let user = create_test_user(&db.db, "forced-change@example.com", "Temporary123!").await; + let reset_token = Uuid::new_v4().to_string(); + let mut user_update: users::ActiveModel = user.clone().into(); + user_update.password_reset_token = Set(Some(reset_token.clone())); + user_update.password_reset_expires = Set(Some(Utc::now() + Duration::minutes(15))); + user_update.must_change_password = Set(true); + user_update.update(db.db.as_ref()).await.unwrap(); + + let result = auth_service + .reset_required_password(ResetPasswordRequest { + token: reset_token.clone(), + new_password: "Temporary123!".to_string(), + }) + .await; + + assert!(matches!(result, Err(UserAuthError::SamePassword))); + let unchanged = users::Entity::find_by_id(user.id) + .one(db.db.as_ref()) + .await + .unwrap() + .unwrap(); + assert!(unchanged.must_change_password); + assert_eq!( + unchanged.password_reset_token.as_deref(), + Some(reset_token.as_str()) + ); + } + + #[tokio::test] + async fn required_password_change_consumes_token_and_allows_session_creation() { + let (db, auth_service, _) = setup_test_env().await; + let user = + create_test_user(&db.db, "forced-change-success@example.com", "Temporary123!").await; + let reset_token = Uuid::new_v4().to_string(); + let mut user_update: users::ActiveModel = user.clone().into(); + user_update.password_reset_token = Set(Some(reset_token.clone())); + user_update.password_reset_expires = Set(Some(Utc::now() + Duration::minutes(15))); + user_update.must_change_password = Set(true); + user_update.update(db.db.as_ref()).await.unwrap(); + + let updated = auth_service + .reset_required_password(ResetPasswordRequest { + token: reset_token.clone(), + new_password: "DifferentPassword123!".to_string(), + }) + .await + .unwrap(); + + assert!(!updated.must_change_password); + assert!(updated.password_reset_token.is_none()); + assert!(auth_service.create_session(user.id).await.is_ok()); + assert!(matches!( + auth_service + .reset_required_password(ResetPasswordRequest { + token: reset_token, + new_password: "AnotherPassword123!".to_string(), + }) + .await, + Err(UserAuthError::InvalidToken) + )); + } + + #[tokio::test] + async fn required_password_change_token_is_single_use_under_concurrency() { + let (db, auth_service, _) = setup_test_env().await; + let user = + create_test_user(&db.db, "forced-change-race@example.com", "Temporary123!").await; + let reset_token = Uuid::new_v4().to_string(); + let mut user_update: users::ActiveModel = user.into(); + user_update.password_reset_token = Set(Some(reset_token.clone())); + user_update.password_reset_expires = Set(Some(Utc::now() + Duration::minutes(15))); + user_update.must_change_password = Set(true); + user_update.update(db.db.as_ref()).await.unwrap(); + + let first = auth_service.reset_required_password(ResetPasswordRequest { + token: reset_token.clone(), + new_password: "FirstReplacement123!".to_string(), + }); + let second = auth_service.reset_required_password(ResetPasswordRequest { + token: reset_token, + new_password: "SecondReplacement123!".to_string(), + }); + let (first_result, second_result) = tokio::join!(first, second); + + assert_ne!(first_result.is_ok(), second_result.is_ok()); + let rejected = if first_result.is_err() { + first_result + } else { + second_result + }; + assert!(matches!(rejected, Err(UserAuthError::InvalidToken))); + } + + #[tokio::test] + async fn full_session_is_rejected_while_password_change_is_required() { + let (db, auth_service, _) = setup_test_env().await; + let user = create_test_user(&db.db, "no-session@example.com", "Temporary123!").await; + let mut user_update: users::ActiveModel = user.clone().into(); + user_update.must_change_password = Set(true); + user_update.update(db.db.as_ref()).await.unwrap(); + + let result = auth_service.create_session(user.id).await; + + assert!(matches!( + result, + Err(AuthError::PasswordChangeRequired { user_id }) if user_id == user.id + )); + assert_eq!( + sessions::Entity::find() + .filter(sessions::Column::UserId.eq(user.id)) + .count(db.db.as_ref()) + .await + .unwrap(), + 0 + ); + } + + #[tokio::test] + async fn required_password_change_token_is_short_lived_and_only_for_flagged_users() { + let (db, auth_service, _) = setup_test_env().await; + let user = create_test_user(&db.db, "temporary@example.com", "Temporary1!").await; + + let result = auth_service + .create_required_password_change_token(user.id) + .await; + assert!(matches!( + result, + Err(UserAuthError::PasswordChangeNotRequired { user_id }) if user_id == user.id + )); + + let mut user_update: users::ActiveModel = user.clone().into(); + user_update.must_change_password = Set(true); + user_update.update(db.db.as_ref()).await.unwrap(); + + let issued_at = Utc::now(); + let token = auth_service + .create_required_password_change_token(user.id) + .await + .unwrap(); + let updated_user = users::Entity::find_by_id(user.id) + .one(db.db.as_ref()) + .await + .unwrap() + .unwrap(); + + assert_eq!( + updated_user.password_reset_token.as_deref(), + Some(token.as_str()) + ); + let expires_at = updated_user + .password_reset_expires + .expect("required password-change token has an expiry"); + assert!(expires_at > issued_at + Duration::minutes(14)); + assert!(expires_at <= issued_at + Duration::minutes(16)); + assert!(updated_user.must_change_password); + } + #[tokio::test] async fn test_reset_password_expired_token() { let (db, auth_service, _) = setup_test_env().await; @@ -1836,6 +2237,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: Some("JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP".to_string()), mfa_enabled: true, @@ -2366,6 +2768,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-auth/src/cli_device_handler.rs b/crates/temps-auth/src/cli_device_handler.rs index ce140b82d..b7c2e9af7 100644 --- a/crates/temps-auth/src/cli_device_handler.rs +++ b/crates/temps-auth/src/cli_device_handler.rs @@ -834,6 +834,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-auth/src/handlers.rs b/crates/temps-auth/src/handlers.rs index ea0d5d3a5..77512834f 100644 --- a/crates/temps-auth/src/handlers.rs +++ b/crates/temps-auth/src/handlers.rs @@ -8,7 +8,7 @@ use crate::audit::{ use crate::avatar::generate_avatar_data_url; use crate::context::AuthContext; use crate::permissions::Permission; -use crate::user_service::UserServiceError; +use crate::user_service::{normalize_user_email, UserServiceError}; use crate::{permission_guard, RequireAuth}; use axum::extract::Path; use axum::http::header::SET_COOKIE; @@ -58,27 +58,20 @@ fn bounded_audit_identity(identity: &str) -> String { } fn normalized_login_email(email: &str) -> Option { - let normalized = email.to_lowercase(); - if normalized.is_empty() - || normalized.len() > MAX_LOGIN_EMAIL_BYTES - || normalized.chars().any(char::is_whitespace) - || normalized.chars().any(char::is_control) - { - return None; - } - - let (local, domain) = normalized.split_once('@')?; - if local.is_empty() - || local.len() > 64 - || domain.is_empty() - || domain.contains('@') - || domain.starts_with('.') - || domain.ends_with('.') - { - return None; - } + normalize_user_email(email) +} - Some(normalized) +fn parse_user_roles(role_names: &[String]) -> Result, UserServiceError> { + role_names + .iter() + .map(|role| { + RoleType::from_str(role).map_err(|_| { + UserServiceError::Validation(format!( + "Unsupported role '{role}'. Expected one of: admin, user" + )) + }) + }) + .collect() } async fn record_login_failure( @@ -629,6 +622,7 @@ pub async fn verify_step_up( email_status, request_password_reset, reset_password, + change_required_password, verify_email, list_users, create_user, @@ -663,6 +657,8 @@ pub async fn verify_step_up( LoginRequest, EmailRequest, ResetPasswordRequest, + RequiredPasswordChangeRequest, + RequiredPasswordChangeResponse, AuthResponse, EmailStatusResponse, crate::oidc_types::OidcProviderSummary, @@ -723,6 +719,10 @@ pub fn configure_routes() -> Router> { ) .route("/auth/password-reset/request", post(request_password_reset)) .route("/auth/password-reset/verify", post(reset_password)) + .route( + "/auth/password-change-required", + post(change_required_password), + ) .route( "/auth/oidc/login/{slug}", get(crate::oidc_handler::start_oidc_login_by_slug), @@ -800,6 +800,11 @@ pub struct ResetPasswordRequest { pub new_password: String, } +#[derive(Debug, Serialize, Deserialize, ToSchema)] +pub struct RequiredPasswordChangeRequest { + pub new_password: String, +} + // Implement From traits for conversions impl From for crate::auth_service::RegisterRequest { fn from(req: RegisterRequest) -> Self { @@ -835,6 +840,18 @@ pub struct AuthResponse { pub message: String, pub user_id: Option, pub mfa_required: bool, + pub mfa_enrollment_required: bool, + pub mfa_setup: Option, + pub password_change_required: bool, +} + +#[derive(Debug, Serialize, ToSchema)] +pub struct RequiredPasswordChangeResponse { + pub success: bool, + pub message: String, + pub user_id: i32, + pub mfa_enrollment_required: bool, + pub mfa_setup: Option, } #[derive(Debug, Serialize, Deserialize, ToSchema)] @@ -905,6 +922,9 @@ pub async fn register( message: "User created successfully".to_string(), user_id: Some(user.id), mfa_required: false, + mfa_enrollment_required: false, + mfa_setup: None, + password_change_required: false, }), )) } @@ -958,6 +978,79 @@ pub async fn login( match state.auth_service.login(request.into()).await { Ok(user) => { + if user.must_change_password { + let reset_token = state + .auth_service + .create_required_password_change_token(user.id) + .await + .map_err(|error| { + error!( + user_id = user.id, + error = %error, + "Failed to create required password-change session" + ); + problem_new(StatusCode::INTERNAL_SERVER_ERROR) + .with_title("Authentication Error") + .with_detail( + "Could not start the required password change. Please try again.", + ) + })?; + + let encrypted_token = + state.cookie_crypto.encrypt(&reset_token).map_err(|error| { + error!( + user_id = user.id, + error = %error, + "Failed to encrypt required password-change session" + ); + problem_new(StatusCode::INTERNAL_SERVER_ERROR) + .with_title("Authentication Error") + .with_detail( + "Could not secure the required password change. Please try again.", + ) + })?; + + let password_change_cookie = + Cookie::build(("password_change_session", encrypted_token)) + .http_only(true) + .path("/") + .max_age(cookie::time::Duration::minutes(15)) + .same_site(cookie::SameSite::Strict) + .secure(metadata.is_secure) + .build(); + let cookie_header = + password_change_cookie + .to_string() + .parse() + .map_err(|error| { + error!( + user_id = user.id, + error = %error, + "Failed to create required password-change cookie header" + ); + problem_new(StatusCode::INTERNAL_SERVER_ERROR) + .with_title("Authentication Error") + .with_detail( + "Could not secure the required password change. Please try again.", + ) + })?; + let mut headers = HeaderMap::new(); + headers.insert(SET_COOKIE, cookie_header); + + return Ok(( + headers, + Json(AuthResponse { + success: false, + message: "Password change required".to_string(), + user_id: Some(user.id), + mfa_required: false, + mfa_enrollment_required: false, + mfa_setup: None, + password_change_required: true, + }), + )); + } + // Check if user has MFA enabled if user.mfa_enabled { // Create temporary MFA session @@ -1025,6 +1118,9 @@ pub async fn login( message: "MFA authentication required".to_string(), user_id: None, mfa_required: true, + mfa_enrollment_required: false, + mfa_setup: None, + password_change_required: false, }), )) } @@ -1131,6 +1227,9 @@ pub async fn login( message: "Login successful".to_string(), user_id: Some(user.id), mfa_required: false, + mfa_enrollment_required: false, + mfa_setup: None, + password_change_required: false, }), )) } @@ -1176,32 +1275,62 @@ pub async fn login( .with_detail("Invalid email or password.")) } crate::auth_service::UserAuthError::MfaRequiredForRole { user_id, role } => { - // Deliberately the *same* status/title/detail as - // InvalidCredentials above -- this error is only reachable - // after the password has already been verified correct, so - // a distinguishable response here would let an attacker use - // login attempts as an oracle to confirm a guessed admin - // password (and that the account holds the Admin role) - // without ever completing a login. The real reason is only - // ever surfaced server-side via this log line. warn!( user_id, role = %role, email = %login_email, - "Login blocked: MFA is required for this role but is not enrolled" + "Starting required MFA enrollment for role" ); - record_login_failure( - state.as_ref(), - &metadata, - Some(user_id), - &login_email, - "password", - "mfa_required_for_role", - ) - .await; - Err(problem_new(StatusCode::UNAUTHORIZED) - .with_title("Invalid Credentials") - .with_detail("Invalid email or password.")) + let setup = state.user_service.setup_mfa(user_id).await.map_err(|error| { + error!(user_id, error = %error, "Failed to prepare resumable MFA enrollment"); + problem_new(StatusCode::INTERNAL_SERVER_ERROR) + .with_title("MFA Enrollment Failed") + .with_detail("Could not start MFA enrollment. Please try again.") + })?; + let mfa_token = state.auth_service.create_mfa_session(user_id).await.map_err(|error| { + error!(user_id, error = %error, "Failed to create MFA enrollment challenge"); + problem_new(StatusCode::INTERNAL_SERVER_ERROR) + .with_title("MFA Enrollment Failed") + .with_detail("Could not start MFA enrollment. Please try again.") + })?; + let encrypted_token = state.cookie_crypto.encrypt(&mfa_token).map_err(|error| { + error!(user_id, error = %error, "Failed to encrypt MFA enrollment challenge"); + problem_new(StatusCode::INTERNAL_SERVER_ERROR) + .with_title("MFA Enrollment Failed") + .with_detail("Could not start MFA enrollment. Please try again.") + })?; + let mfa_cookie = Cookie::build(("mfa_session", encrypted_token)) + .http_only(true) + .path("/") + .max_age(cookie::time::Duration::minutes(5)) + .same_site(cookie::SameSite::Strict) + .secure(metadata.is_secure) + .build(); + let cookie_header = mfa_cookie.to_string().parse().map_err(|error| { + error!(user_id, error = %error, "Failed to create MFA enrollment cookie"); + problem_new(StatusCode::INTERNAL_SERVER_ERROR) + .with_title("MFA Enrollment Failed") + .with_detail("Could not start MFA enrollment. Please try again.") + })?; + let mut headers = HeaderMap::new(); + headers.insert(SET_COOKIE, cookie_header); + + Ok(( + headers, + Json(AuthResponse { + success: false, + message: "Multi-factor authentication setup required".to_string(), + user_id: Some(user_id), + mfa_required: false, + mfa_enrollment_required: true, + mfa_setup: Some(MfaSetupResponse { + secret_key: setup.secret_key, + qr_code: setup.qr_code, + recovery_codes: setup.recovery_codes, + }), + password_change_required: false, + }), + )) } _ => { // Log the real error server-side (email is PII but legitimate @@ -1284,6 +1413,9 @@ pub async fn request_password_reset( .to_string(), user_id: None, mfa_required: false, + mfa_enrollment_required: false, + mfa_setup: None, + password_change_required: false, })) } } @@ -1333,14 +1465,177 @@ pub async fn reset_password( .to_string(), user_id: None, mfa_required: false, + mfa_enrollment_required: false, + mfa_setup: None, + password_change_required: false, })) } - Err(e) => Err(problem_new(StatusCode::BAD_REQUEST) - .with_title("Password Reset Failed") - .with_detail(e.to_string())), + Err(crate::auth_service::UserAuthError::InvalidToken) => { + Err(problem_new(StatusCode::BAD_REQUEST) + .with_title("Password Reset Failed") + .with_detail("The password reset link is invalid or expired.")) + } + Err(crate::auth_service::UserAuthError::WeakPassword(message)) => { + Err(problem_new(StatusCode::BAD_REQUEST) + .with_title("Password Requirements Not Met") + .with_detail(message)) + } + Err(crate::auth_service::UserAuthError::SamePassword) => { + Err(problem_new(StatusCode::BAD_REQUEST) + .with_title("Choose a Different Password") + .with_detail("Your new password must differ from the temporary password.")) + } + Err(error) => { + error!(error = %error, "Password reset failed internally"); + Err(problem_new(StatusCode::INTERNAL_SERVER_ERROR) + .with_title("Password Reset Failed") + .with_detail("Could not reset the password. Please try again.")) + } } } +#[utoipa::path( + post, + path = "/auth/password-change-required", + request_body = RequiredPasswordChangeRequest, + responses( + (status = 200, description = "Required password change completed", body = RequiredPasswordChangeResponse), + (status = 400, description = "Password does not meet requirements"), + (status = 401, description = "Password-change session is missing or expired"), + (status = 500, description = "Internal server error") + ), + tag = "Authentication" +)] +pub async fn change_required_password( + State(state): State>, + Extension(metadata): Extension, + headers: HeaderMap, + Json(request): Json, +) -> Result { + let encrypted_token = headers + .get_all("Cookie") + .iter() + .filter_map(|value| value.to_str().ok()) + .flat_map(|cookie_header| Cookie::split_parse(cookie_header).filter_map(Result::ok)) + .find_map(|cookie| { + (cookie.name() == "password_change_session").then(|| cookie.value().to_string()) + }) + .ok_or_else(|| { + problem_new(StatusCode::UNAUTHORIZED) + .with_title("Password Change Session Required") + .with_detail("Log in again to restart the required password change.") + })?; + + let token = state + .cookie_crypto + .decrypt(&encrypted_token) + .map_err(|error| { + warn!(error = %error, "Rejected invalid required password-change cookie"); + problem_new(StatusCode::UNAUTHORIZED) + .with_title("Password Change Session Expired") + .with_detail("Log in again to restart the required password change.") + })?; + + let pending_user = state + .auth_service + .required_password_change_user(&token) + .await + .map_err(|error| { + error!(error = %error, "Failed to resolve required password-change session"); + problem_new(StatusCode::UNAUTHORIZED) + .with_title("Password Change Session Expired") + .with_detail("Log in again to restart the required password change.") + })?; + + // Prepare the response cookie before changing the password. If header + // construction fails, the temporary credential remains usable and the + // user can safely retry instead of being locked out. + let clear_cookie = Cookie::build(("password_change_session", "")) + .http_only(true) + .path("/") + .max_age(cookie::time::Duration::seconds(0)) + .same_site(cookie::SameSite::Strict) + .secure(metadata.is_secure) + .build(); + let cookie_header = clear_cookie.to_string().parse().map_err(|error| { + error!(error = %error, "Failed to clear required password-change cookie"); + problem_new(StatusCode::INTERNAL_SERVER_ERROR) + .with_title("Password Change Failed") + .with_detail("Could not prepare the password change. Please try again.") + })?; + let mut response_headers = HeaderMap::new(); + response_headers.append(SET_COOKIE, cookie_header); + + let requires_mfa_enrollment = state + .auth_service + .requires_mfa_enrollment(pending_user.id) + .await + .map_err(|error| { + error!(user_id = pending_user.id, error = %error, "Failed to evaluate MFA enrollment policy"); + problem_new(StatusCode::INTERNAL_SERVER_ERROR) + .with_title("Password Change Failed") + .with_detail("Could not prepare required MFA enrollment. Please try again.") + })?; + + let user = state + .auth_service + .reset_required_password(crate::auth_service::ResetPasswordRequest { + token, + new_password: request.new_password, + }) + .await + .map_err(|error| match error { + crate::auth_service::UserAuthError::WeakPassword(message) => { + problem_new(StatusCode::BAD_REQUEST) + .with_title("Password Requirements Not Met") + .with_detail(message) + } + crate::auth_service::UserAuthError::SamePassword => { + problem_new(StatusCode::BAD_REQUEST) + .with_title("Choose a Different Password") + .with_detail("Your new password must differ from the temporary password.") + } + crate::auth_service::UserAuthError::InvalidToken => { + problem_new(StatusCode::UNAUTHORIZED) + .with_title("Password Change Session Expired") + .with_detail("Log in again to restart the required password change.") + } + internal_error => { + error!(error = %internal_error, "Required password change failed internally"); + problem_new(StatusCode::INTERNAL_SERVER_ERROR) + .with_title("Password Change Failed") + .with_detail("Could not change the password. Please try again.") + } + })?; + + let audit = PasswordResetAudit { + context: AuditContext { + user_id: user.id, + ip_address: Some(metadata.ip_address.to_string()), + user_agent: metadata.user_agent.as_str().to_string(), + }, + username: user.name, + }; + if let Err(error) = state.audit_service.create_audit_log(&audit).await { + error!(user_id = user.id, error = %error, "Failed to audit required password change"); + } + + Ok(( + response_headers, + Json(RequiredPasswordChangeResponse { + success: true, + message: if requires_mfa_enrollment { + "Password changed. Log in to set up multi-factor authentication.".to_string() + } else { + "Password changed. Log in with your new password.".to_string() + }, + user_id: user.id, + mfa_enrollment_required: requires_mfa_enrollment, + mfa_setup: None, + }), + )) +} + #[utoipa::path( get, path = "/auth/verify-email", @@ -1387,6 +1682,9 @@ pub async fn verify_email( message: "Email verified successfully. You can now login.".to_string(), user_id: None, mfa_required: false, + mfa_enrollment_required: false, + mfa_setup: None, + password_change_required: false, })) } Err(e) => Err(problem_new(StatusCode::BAD_REQUEST) @@ -1422,6 +1720,12 @@ impl From for Problem { UserServiceError::MfaNotSetup(user_id) => problem_new(StatusCode::BAD_REQUEST) .with_title("MFA not setup") .with_detail(format!("MFA is not setup for user {}", user_id)), + UserServiceError::MfaAlreadyEnabled(user_id) => problem_new(StatusCode::CONFLICT) + .with_title("MFA already enabled") + .with_detail(format!( + "MFA is already enabled for user {}. Disable it with current MFA verification before setting it up again.", + user_id + )), UserServiceError::AlreadyDeleted(user_id) => problem_new(StatusCode::BAD_REQUEST) .with_title("User already deleted") .with_detail(format!("User {} is already deleted", user_id)), @@ -1746,12 +2050,9 @@ async fn create_user( warn!("No password provided for new user - user will not be able to login with password!"); } - // Convert role strings to RoleTypes - let roles: Vec = create_req - .roles - .iter() - .filter_map(|r| RoleType::from_str(r).ok()) - .collect(); + // Reject the entire request if any role is unknown. Silently discarding a + // role can create a different account than the administrator approved. + let roles = parse_user_roles(&create_req.roles)?; let user = app_state .user_service @@ -1760,6 +2061,7 @@ async fn create_user( create_req.email.clone().unwrap_or("".to_string()), create_req.password.clone(), roles.clone(), + create_req.must_change_password, ) .await?; @@ -1775,7 +2077,7 @@ async fn create_user( let user_audit = UserCreatedAudit { context: audit_context, target_user_id: user.user.id, - username: create_req.username.clone(), + username: user.user.name.clone(), assigned_roles: roles.iter().map(|r| r.to_string()).collect(), }; @@ -2155,6 +2457,7 @@ async fn restore_user( responses( (status = 200, description = "MFA setup data", body = MfaSetupResponse), (status = 401, description = "Unauthorized"), + (status = 409, description = "MFA is already enabled; verify and disable it before re-enrollment"), (status = 500, description = "Internal server error") ), security( @@ -2394,15 +2697,16 @@ async fn disable_mfa( mod tests { use super::{ assign_role, authorize_admin_target, authorize_role_assignment, bounded_audit_identity, - create_user, delete_user, login, normalized_login_email, remove_role, restore_user, - update_user, verify_mfa_challenge, AdminTargetDenied, AssignRoleRequest, CreateUserRequest, - LoginRequest, RoleChangeDenied, UpdateUserRequest, + create_user, delete_user, login, normalized_login_email, parse_user_roles, remove_role, + restore_user, update_user, verify_mfa_challenge, AdminTargetDenied, AssignRoleRequest, + CreateUserRequest, LoginRequest, RoleChangeDenied, UpdateUserRequest, }; use crate::auth_service::UserAuthError; use crate::context::AuthContext; use crate::permissions::{Permission, Role}; use crate::state::AuthState; use crate::types::MfaVerificationRequest; + use crate::user_service::UserServiceError; use crate::RequireAuth; use async_trait::async_trait; use axum::extract::{Path, State}; @@ -2416,6 +2720,7 @@ mod tests { EmailMessage, NotificationData, NotificationError, NotificationService, }; use temps_core::{AuditLogger, RequestMetadata}; + use temps_entities::types::RoleType; use temps_entities::{roles, sessions, user_roles, users}; // Regression tests for the user-management privilege-escalation hole. The @@ -2440,6 +2745,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, @@ -2643,6 +2949,18 @@ mod tests { assert!(std::str::from_utf8(bounded.as_bytes()).is_ok()); } + #[test] + fn create_user_roles_are_strictly_validated() { + assert_eq!( + parse_user_roles(&["user".to_string(), "admin".to_string()]) + .expect("known roles should parse"), + vec![RoleType::User, RoleType::Admin] + ); + + let result = parse_user_roles(&["user".to_string(), "administrator".to_string()]); + assert!(matches!(result, Err(UserServiceError::Validation(_)))); + } + #[tokio::test] async fn invalid_login_identifier_is_audited_without_querying_the_database() { let audit = Arc::new(RecordingAuditLogger::default()); @@ -3063,6 +3381,7 @@ mod tests { // Requesting the admin role is the case the gate must stop a // restricted credential from performing. roles: vec!["admin".to_string()], + must_change_password: true, }), ) .await; diff --git a/crates/temps-auth/src/oidc_handler.rs b/crates/temps-auth/src/oidc_handler.rs index 2312ed4c9..05621d5a5 100644 --- a/crates/temps-auth/src/oidc_handler.rs +++ b/crates/temps-auth/src/oidc_handler.rs @@ -296,6 +296,70 @@ async fn complete_oidc_login( let return_to = OidcService::sanitize_return_to(login_state.return_to); + if user.must_change_password { + let reset_token = state + .auth_service + .create_required_password_change_token(user.id) + .await + .map_err(|error| OidcError::DiscoveryFailed { + issuer: provider.issuer_url.clone(), + reason: format!( + "failed to create required password-change session for user {}: {error}", + user.id + ), + })?; + let encrypted_token = state.cookie_crypto.encrypt(&reset_token).map_err(|error| { + OidcError::DiscoveryFailed { + issuer: provider.issuer_url.clone(), + reason: format!( + "failed to encrypt required password-change session for user {}: {error}", + user.id + ), + } + })?; + let password_change_cookie = Cookie::build(("password_change_session", encrypted_token)) + .http_only(true) + .path("/") + .max_age(cookie::time::Duration::minutes(15)) + .same_site(cookie::SameSite::Strict) + .secure(metadata.is_secure) + .build(); + let cookie_header = password_change_cookie + .to_string() + .parse() + .map_err(|error| OidcError::DiscoveryFailed { + issuer: provider.issuer_url.clone(), + reason: format!( + "failed to build required password-change cookie for user {}: {error}", + user.id + ), + })?; + let mut headers = HeaderMap::new(); + headers.insert(SET_COOKIE, cookie_header); + + if let Err(error) = state + .audit_service + .create_audit_log(&LoginAudit { + context: AuditContext { + user_id: user.id, + ip_address: Some(metadata.ip_address.to_string()), + user_agent: metadata.user_agent.as_str().to_string(), + }, + success: true, + login_method: "oidc-password-change-required".to_string(), + }) + .await + { + error!( + user_id = user.id, + error = %error, + "Failed to audit OIDC required password-change redirect" + ); + } + + return Ok((headers, Redirect::to("/auth/change-password")).into_response()); + } + if user.mfa_enabled { let mfa_token = state .auth_service diff --git a/crates/temps-auth/src/oidc_service.rs b/crates/temps-auth/src/oidc_service.rs index 1d27ffbf8..92ddbcf23 100644 --- a/crates/temps-auth/src/oidc_service.rs +++ b/crates/temps-auth/src/oidc_service.rs @@ -852,7 +852,7 @@ impl OidcService { let created = self .user_service - .create_user(display_name, email.clone(), None, vec![role.clone()]) + .create_user(display_name, email.clone(), None, vec![role.clone()], false) .await .map_err(|e| OidcError::DiscoveryFailed { issuer: provider.issuer_url.clone(), diff --git a/crates/temps-auth/src/permission_guard.rs b/crates/temps-auth/src/permission_guard.rs index ec962c748..beedb77f4 100644 --- a/crates/temps-auth/src/permission_guard.rs +++ b/crates/temps-auth/src/permission_guard.rs @@ -435,6 +435,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-auth/src/permissions.rs b/crates/temps-auth/src/permissions.rs index 20165f6a0..058a94861 100644 --- a/crates/temps-auth/src/permissions.rs +++ b/crates/temps-auth/src/permissions.rs @@ -802,7 +802,6 @@ impl Role { Permission::PlatformInfoRead, Permission::ProjectsCreate, Permission::ProjectsDelete, - Permission::ProjectsDelete, Permission::ProjectsRead, Permission::ProjectsWrite, Permission::SessionMetricsRead, diff --git a/crates/temps-auth/src/sensitive_action.rs b/crates/temps-auth/src/sensitive_action.rs index 857c92ec3..448dd25a5 100644 --- a/crates/temps-auth/src/sensitive_action.rs +++ b/crates/temps-auth/src/sensitive_action.rs @@ -326,6 +326,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: mfa_enabled.then(|| "JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP".to_string()), mfa_enabled, diff --git a/crates/temps-auth/src/types.rs b/crates/temps-auth/src/types.rs index 25e33d5e8..c445be028 100644 --- a/crates/temps-auth/src/types.rs +++ b/crates/temps-auth/src/types.rs @@ -73,6 +73,7 @@ pub struct RouteUser { pub image: String, pub mfa_enabled: bool, pub email_verified: bool, + pub must_change_password: bool, #[schema(format = "int64", example = "1683900000000")] pub created_at: i64, #[schema(format = "int64", example = "1683900000000")] @@ -108,6 +109,8 @@ pub struct CreateUserRequest { pub email: Option, pub password: Option, pub roles: Vec, + #[serde(default)] + pub must_change_password: bool, } #[derive(Deserialize, utoipa::ToSchema)] @@ -167,7 +170,7 @@ pub struct StepUpResponse { pub expires_at: String, } -#[derive(Serialize, utoipa::ToSchema)] +#[derive(Debug, Serialize, Deserialize, utoipa::ToSchema)] pub struct MfaSetupResponse { pub secret_key: String, pub qr_code: String, @@ -190,6 +193,7 @@ impl From for RouteUser { image: generate_avatar_data_url(&db_user.name), mfa_enabled: db_user.mfa_enabled, email_verified: db_user.email_verified, + must_change_password: db_user.must_change_password, created_at: db_user.created_at.timestamp_millis(), updated_at: db_user.updated_at.timestamp_millis(), deleted_at: db_user.deleted_at.map(|d| d.timestamp_millis()), @@ -218,6 +222,7 @@ impl From for RouteUser { image: service_user.image, mfa_enabled: service_user.mfa_enabled, email_verified: service_user.email_verified, + must_change_password: service_user.must_change_password, created_at: service_user.created_at.timestamp_millis(), updated_at: service_user.updated_at.timestamp_millis(), deleted_at: service_user.deleted_at.map(|d| d.timestamp_millis()), diff --git a/crates/temps-auth/src/user_service.rs b/crates/temps-auth/src/user_service.rs index 6b74b5c2a..be9b3b182 100644 --- a/crates/temps-auth/src/user_service.rs +++ b/crates/temps-auth/src/user_service.rs @@ -16,6 +16,50 @@ use thiserror::Error; use totp_rs::{Algorithm, Secret, TOTP}; use tracing::{debug, error, info, warn}; +const MAX_USER_EMAIL_BYTES: usize = 254; +const MAX_USER_NAME_CHARS: usize = 100; + +pub(crate) fn normalize_user_email(email: &str) -> Option { + let normalized = email.trim().to_lowercase(); + if normalized.is_empty() + || normalized.len() > MAX_USER_EMAIL_BYTES + || normalized.chars().any(char::is_whitespace) + || normalized.chars().any(char::is_control) + { + return None; + } + + let (local, domain) = normalized.split_once('@')?; + if local.is_empty() + || local.len() > 64 + || local.starts_with('.') + || local.ends_with('.') + || local.contains("..") + || domain.is_empty() + || domain.contains('@') + || domain.starts_with('.') + || domain.ends_with('.') + { + return None; + } + + let labels: Vec<_> = domain.split('.').collect(); + if labels.len() < 2 + || labels.iter().any(|label| { + label.is_empty() + || label.starts_with('-') + || label.ends_with('-') + || !label + .chars() + .all(|character| character.is_ascii_alphanumeric() || character == '-') + }) + { + return None; + } + + Some(normalized) +} + // First add the custom error type at the top of the file #[derive(Error, Debug)] pub enum UserServiceError { @@ -40,6 +84,9 @@ pub enum UserServiceError { #[error("MFA not set up for user {0}")] MfaNotSetup(i32), + #[error("MFA is already enabled for user {0}")] + MfaAlreadyEnabled(i32), + #[error("User {0} is already deleted")] AlreadyDeleted(i32), @@ -97,6 +144,7 @@ pub struct ServiceUser { pub image: String, pub mfa_enabled: bool, pub email_verified: bool, + pub must_change_password: bool, pub deleted_at: Option, pub created_at: UtcDateTime, pub updated_at: UtcDateTime, @@ -125,6 +173,7 @@ impl From for ServiceUser { image: generate_avatar_data_url(&db_user.name), mfa_enabled: db_user.mfa_enabled, email_verified: db_user.email_verified, + must_change_password: db_user.must_change_password, deleted_at: db_user.deleted_at, created_at: db_user.created_at, updated_at: db_user.updated_at, @@ -391,9 +440,44 @@ impl UserService { email: String, password: Option, roles: Vec, - ) -> anyhow::Result { + must_change_password: bool, + ) -> Result { let now = Utc::now(); + let username = username.trim().to_string(); + let username_chars = username.chars().count(); + if !(1..=MAX_USER_NAME_CHARS).contains(&username_chars) + || username.chars().any(char::is_control) + { + return Err(UserServiceError::Validation(format!( + "Name must contain between 1 and {MAX_USER_NAME_CHARS} characters" + ))); + } + + let email = normalize_user_email(&email).ok_or_else(|| { + UserServiceError::Validation("A valid email address is required".to_string()) + })?; + + if roles.is_empty() { + return Err(UserServiceError::Validation( + "At least one valid role is required".to_string(), + )); + } + + let mut role_names = std::collections::HashSet::new(); + if roles.iter().any(|role| !role_names.insert(role.as_str())) { + return Err(UserServiceError::Validation( + "Duplicate roles are not allowed".to_string(), + )); + } + + if must_change_password && password.is_none() { + return Err(UserServiceError::Validation( + "A temporary password is required when first-login password change is enabled" + .to_string(), + )); + } + // Hash password if provided using Argon2 (same as auth_service for consistency) let password_hash = if let Some(pwd) = password { // Validate password complexity @@ -423,7 +507,38 @@ impl UserService { None }; - // Create the user + let transaction = self.db.begin().await?; + + // Resolve every role before writing the user. This both produces a + // precise error and prevents a missing role from creating an account + // that cannot be administered as intended. + let mut resolved_roles = Vec::with_capacity(roles.len()); + for role_type in roles { + let role = temps_entities::roles::Entity::find() + .filter(temps_entities::roles::Column::Name.eq(role_type.as_str())) + .one(&transaction) + .await? + .ok_or_else(|| { + UserServiceError::RoleNotFound(format!("Role {} not found", role_type.as_str())) + }); + + match role { + Ok(role) => resolved_roles.push(role), + Err(error) => { + transaction.rollback().await.map_err(|rollback_error| { + UserServiceError::Database { + reason: format!( + "failed to roll back user creation after {error}: {rollback_error}" + ), + } + })?; + return Err(error); + } + } + } + + // Create the user and all role assignments atomically. If any write + // fails, dropping the uncommitted transaction rolls back every write. let new_user = temps_entities::users::ActiveModel { name: Set(username.clone()), email: Set(email.clone()), @@ -437,21 +552,14 @@ impl UserService { email_verification_expires: Set(None), password_reset_token: Set(None), password_reset_expires: Set(None), + must_change_password: Set(must_change_password), ..Default::default() }; - let user = new_user.insert(self.db.as_ref()).await?; + let user = new_user.insert(&transaction).await?; // Assign roles - for role_type in roles { - let role = temps_entities::roles::Entity::find() - .filter(temps_entities::roles::Column::Name.eq(role_type.as_str())) - .one(self.db.as_ref()) - .await? - .ok_or_else(|| { - UserServiceError::RoleNotFound(format!("Role {} not found", role_type.as_str())) - })?; - + for role in resolved_roles { let new_user_role = temps_entities::user_roles::ActiveModel { user_id: Set(user.id), role_id: Set(role.id), @@ -460,9 +568,11 @@ impl UserService { ..Default::default() }; - new_user_role.insert(self.db.as_ref()).await?; + new_user_role.insert(&transaction).await?; } + transaction.commit().await?; + info!("Created new user with id: {}", user.id); // Fetch the user with roles to return @@ -594,22 +704,30 @@ impl UserService { } pub async fn setup_mfa(&self, user_id: i32) -> Result { + let transaction = self.db.begin().await?; let user = temps_entities::users::Entity::find_by_id(user_id) - .one(self.db.as_ref()) + .lock_exclusive() + .one(&transaction) .await? .ok_or_else(|| UserServiceError::NotFound(format!("User {} not found", user_id)))?; - // Generate random secret with explicit type + if user.mfa_enabled { + return Err(UserServiceError::MfaAlreadyEnabled(user_id)); + } + + // An unverified enrollment is replaceable as a complete bundle. A + // retry rotates both the TOTP secret and recovery codes, ensuring the + // response always contains usable plaintext recovery credentials. + // Any older concurrent response fails verification instead of enabling + // MFA with recovery codes the user never received. let secret: Vec = (0..20).map(|_| rand::rng().random::()).collect(); let secret_b32 = base32::encode(base32::Alphabet::Rfc4648 { padding: true }, &secret); - // Generate recovery codes let recovery_codes: Vec = (0..8) .map(|_| { - let code: String = (0..6) + (0..6) .map(|_| rand::rng().random_range(0..10).to_string()) - .collect(); - code + .collect() }) .collect(); @@ -663,7 +781,6 @@ impl UserService { let qr_base64 = base64::engine::general_purpose::STANDARD.encode(&bytes); let qr_data_url = format!("data:image/png;base64,{}", qr_base64); - // Update user in database let mut user_update: temps_entities::users::ActiveModel = user.into(); user_update.mfa_secret = Set(Some(secret_b32.clone())); user_update.mfa_enabled = Set(false); @@ -671,8 +788,8 @@ impl UserService { serde_json::to_string(&hashed_recovery_codes) .map_err(UserServiceError::Serialization)?, )); - - user_update.update(self.db.as_ref()).await?; + user_update.update(&transaction).await?; + transaction.commit().await?; Ok(MfaSetupData { secret_key: secret_b32, @@ -827,7 +944,7 @@ impl UserService { .map_err(|e| UserServiceError::Mfa(format!("Failed to verify TOTP code: {}", e))) } - pub async fn disable_mfa(&self, user_id: i32) -> Result<(), UserServiceError> { + async fn disable_mfa(&self, user_id: i32) -> Result<(), UserServiceError> { let transaction = self.db.begin().await?; let user = temps_entities::users::Entity::find_by_id(user_id) .lock_exclusive() @@ -859,7 +976,7 @@ impl UserService { &self, user_id: i32, code: &str, - ) -> anyhow::Result<(), UserServiceError> { + ) -> Result<(), UserServiceError> { // First verify the code if !self.verify_mfa_code(user_id, code).await? { return Err(UserServiceError::Validation( @@ -876,7 +993,7 @@ impl UserService { mod tests { use super::*; use argon2::password_hash::{rand_core::OsRng, PasswordHasher, SaltString}; - use sea_orm::{DatabaseBackend, MockDatabase, MockExecResult}; + use sea_orm::{DatabaseBackend, DbErr, MockDatabase, MockExecResult}; fn user(mfa_enabled: bool, recovery_codes: Option) -> temps_entities::users::Model { let now = Utc::now(); @@ -890,6 +1007,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: mfa_enabled.then(|| "JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP".to_string()), mfa_enabled, @@ -901,6 +1019,179 @@ mod tests { } } + fn role(role_type: RoleType) -> temps_entities::roles::Model { + let now = Utc::now(); + temps_entities::roles::Model { + id: match role_type { + RoleType::Admin => 1, + RoleType::User => 2, + }, + name: role_type.as_str().to_string(), + created_at: now, + updated_at: now, + } + } + + #[test] + fn user_email_is_normalized_and_strictly_validated() { + assert_eq!( + normalize_user_email(" Admin@Example.COM "), + Some("admin@example.com".to_string()) + ); + for invalid in ["", "missing-at.example.com", "@example.com", "user@"] { + assert_eq!(normalize_user_email(invalid), None, "accepted {invalid:?}"); + } + } + + #[tokio::test] + async fn create_user_rejects_invalid_identity_before_database_writes() { + let service = UserService::new(Arc::new( + MockDatabase::new(DatabaseBackend::Postgres).into_connection(), + )); + + let blank_name = service + .create_user( + " ".to_string(), + "valid@example.com".to_string(), + None, + vec![RoleType::User], + false, + ) + .await; + assert!(matches!(blank_name, Err(UserServiceError::Validation(_)))); + + let malformed_email = service + .create_user( + "Valid User".to_string(), + "not-an-email".to_string(), + None, + vec![RoleType::User], + false, + ) + .await; + assert!(matches!( + malformed_email, + Err(UserServiceError::Validation(_)) + )); + } + + #[tokio::test] + async fn create_user_requires_at_least_one_role() { + let service = UserService::new(Arc::new( + MockDatabase::new(DatabaseBackend::Postgres).into_connection(), + )); + + let result = service + .create_user( + "roleless".to_string(), + "roleless@example.com".to_string(), + None, + vec![], + false, + ) + .await; + + assert!(matches!(result, Err(UserServiceError::Validation(_)))); + } + + #[tokio::test] + async fn create_user_rejects_duplicate_roles() { + let service = UserService::new(Arc::new( + MockDatabase::new(DatabaseBackend::Postgres).into_connection(), + )); + + let result = service + .create_user( + "duplicate-role".to_string(), + "duplicate@example.com".to_string(), + None, + vec![RoleType::User, RoleType::User], + false, + ) + .await; + + assert!(matches!(result, Err(UserServiceError::Validation(_)))); + } + + #[tokio::test] + async fn create_user_does_not_insert_account_when_role_is_missing() { + let db = Arc::new( + MockDatabase::new(DatabaseBackend::Postgres) + .append_query_results([Vec::::new()]) + .into_connection(), + ); + let service = UserService::new(db.clone()); + + let result = service + .create_user( + "missing-role".to_string(), + "missing-role@example.com".to_string(), + None, + vec![RoleType::User], + false, + ) + .await; + + assert!(matches!(result, Err(UserServiceError::RoleNotFound(_)))); + drop(service); + let log = Arc::try_unwrap(db) + .expect("service released the database") + .into_transaction_log(); + let statements: Vec<_> = log + .iter() + .flat_map(|transaction| transaction.statements()) + .collect(); + assert!(statements + .iter() + .any(|statement| statement.sql.starts_with("SELECT"))); + assert!(!statements + .iter() + .any(|statement| statement.sql.starts_with("INSERT INTO \"users\""))); + } + + #[tokio::test] + async fn create_user_rolls_back_when_role_assignment_fails() { + let new_user = user(false, None); + let db = Arc::new( + MockDatabase::new(DatabaseBackend::Postgres) + .append_query_results([vec![role(RoleType::User)]]) + .append_query_results([vec![new_user]]) + .append_query_errors([DbErr::Custom( + "simulated role assignment failure".to_string(), + )]) + .into_connection(), + ); + let service = UserService::new(db.clone()); + + let result = service + .create_user( + "atomic-user".to_string(), + "atomic@example.com".to_string(), + None, + vec![RoleType::User], + false, + ) + .await; + + assert!(matches!(result, Err(UserServiceError::Database { .. }))); + drop(service); + let log = Arc::try_unwrap(db) + .expect("service released the database") + .into_transaction_log(); + assert_eq!( + log.len(), + 1, + "all provisioning writes share one transaction" + ); + let statements = log[0].statements(); + assert!(statements + .iter() + .any(|statement| statement.sql.starts_with("INSERT INTO \"users\""))); + assert!(statements + .iter() + .any(|statement| { statement.sql.starts_with("INSERT INTO \"user_roles\"") })); + } + #[tokio::test] async fn verification_fails_closed_when_mfa_is_disabled() { let db = Arc::new( @@ -914,6 +1205,80 @@ mod tests { assert!(matches!(result, Err(UserServiceError::MfaNotSetup(7)))); } + #[tokio::test] + async fn setup_mfa_retry_rotates_complete_unverified_credential_bundle() { + let mut pending = user(false, Some("[\"existing-hash\"]".to_string())); + pending.mfa_secret = Some("JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP".to_string()); + let updated = pending.clone(); + let db = Arc::new( + MockDatabase::new(DatabaseBackend::Postgres) + .append_query_results([vec![pending], vec![updated]]) + .into_connection(), + ); + let service = UserService::new(db.clone()); + + let setup = service + .setup_mfa(7) + .await + .expect("pending MFA setup should be resumable"); + + assert_ne!(setup.secret_key, "JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP"); + assert_eq!(setup.recovery_codes.len(), 8); + assert!(setup.recovery_codes.iter().all( + |code| code.len() == 6 && code.chars().all(|character| character.is_ascii_digit()) + )); + assert!(setup.qr_code.starts_with("data:image/png;base64,")); + + drop(service); + let log = Arc::try_unwrap(db) + .expect("service released the database") + .into_transaction_log(); + let statements: Vec<_> = log + .iter() + .flat_map(|transaction| transaction.statements()) + .collect(); + assert!(statements + .iter() + .any(|statement| statement.sql.contains("FOR UPDATE"))); + assert!(statements + .iter() + .any(|statement| statement.sql.starts_with("UPDATE \"users\""))); + } + + #[tokio::test] + async fn setup_mfa_cannot_replace_enabled_mfa() { + let enabled = user(true, Some("[\"existing-hash\"]".to_string())); + let expected_secret = enabled.mfa_secret.clone(); + let db = Arc::new( + MockDatabase::new(DatabaseBackend::Postgres) + .append_query_results([vec![enabled]]) + .into_connection(), + ); + let service = UserService::new(db.clone()); + + let result = service.setup_mfa(7).await; + + assert!(matches!( + result, + Err(UserServiceError::MfaAlreadyEnabled(7)) + )); + drop(service); + let log = Arc::try_unwrap(db) + .expect("service released the database") + .into_transaction_log(); + let statements: Vec<_> = log + .iter() + .flat_map(|transaction| transaction.statements()) + .collect(); + assert!(statements + .iter() + .any(|statement| statement.sql.contains("FOR UPDATE"))); + assert!(!statements + .iter() + .any(|statement| statement.sql.starts_with("UPDATE \"users\""))); + assert!(expected_secret.is_some()); + } + #[tokio::test] async fn recovery_code_is_consumed_under_an_exclusive_row_lock() { let recovery_code = "RECOVERY-CODE"; diff --git a/crates/temps-auth/tests/context_tests.rs b/crates/temps-auth/tests/context_tests.rs index b903327fc..e85b0ef71 100644 --- a/crates/temps-auth/tests/context_tests.rs +++ b/crates/temps-auth/tests/context_tests.rs @@ -14,6 +14,7 @@ fn create_mock_user() -> users::Model { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-blob/src/handlers/handler.rs b/crates/temps-blob/src/handlers/handler.rs index 504e21216..abb4ff04e 100644 --- a/crates/temps-blob/src/handlers/handler.rs +++ b/crates/temps-blob/src/handlers/handler.rs @@ -1033,6 +1033,7 @@ mod idor_tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-cli/src/commands/serve/console.rs b/crates/temps-cli/src/commands/serve/console.rs index 0d47642e2..07df2f3f9 100644 --- a/crates/temps-cli/src/commands/serve/console.rs +++ b/crates/temps-cli/src/commands/serve/console.rs @@ -368,6 +368,7 @@ async fn ensure_system_user(db: &sea_orm::DatabaseConnection) -> anyhow::Result< email_verification_expires: Set(None), password_reset_token: Set(None), password_reset_expires: Set(None), + must_change_password: Set(false), deleted_at: Set(None), mfa_enabled: Set(false), mfa_secret: Set(None), @@ -3292,6 +3293,7 @@ mod initial_admin_tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, @@ -3355,6 +3357,7 @@ mod ai_tool_allowlist_tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-cli/src/commands/setup.rs b/crates/temps-cli/src/commands/setup.rs index 4b5137c31..2ab74a3ba 100644 --- a/crates/temps-cli/src/commands/setup.rs +++ b/crates/temps-cli/src/commands/setup.rs @@ -299,6 +299,7 @@ async fn ensure_system_user(db: &sea_orm::DatabaseConnection) -> anyhow::Result< email_verification_expires: Set(None), password_reset_token: Set(None), password_reset_expires: Set(None), + must_change_password: Set(false), deleted_at: Set(None), mfa_enabled: Set(false), mfa_secret: Set(None), diff --git a/crates/temps-deployments/src/handlers/deployments.rs b/crates/temps-deployments/src/handlers/deployments.rs index d7c288910..f307fcf82 100644 --- a/crates/temps-deployments/src/handlers/deployments.rs +++ b/crates/temps-deployments/src/handlers/deployments.rs @@ -2761,6 +2761,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-deployments/src/services/job_processor.rs b/crates/temps-deployments/src/services/job_processor.rs index eac3686ff..ed91a3fbc 100644 --- a/crates/temps-deployments/src/services/job_processor.rs +++ b/crates/temps-deployments/src/services/job_processor.rs @@ -90,13 +90,12 @@ impl JobProcessorService { .from(temps_entities::environments::Entity) .and_where(temps_entities::environments::Column::DeletedAt.is_null()) .to_owned(); + let admitted_at = chrono::Utc::now(); let admitted = deployments::Entity::update_many() .col_expr(deployments::Column::State, Expr::value("running")) - .col_expr( - deployments::Column::UpdatedAt, - Expr::value(chrono::Utc::now()), - ) + .col_expr(deployments::Column::StartedAt, Expr::value(admitted_at)) + .col_expr(deployments::Column::UpdatedAt, Expr::value(admitted_at)) .filter(deployments::Column::Id.eq(deployment_id)) .filter(deployments::Column::State.eq("pending")) .filter(deployments::Column::ProjectId.in_subquery(active_projects)) @@ -1719,6 +1718,15 @@ mod tests { .await? .expect("deployment should exist"); assert_eq!(deployment.state, "running"); + assert!( + deployment.started_at.is_some(), + "admitting a deployment must record when it started" + ); + assert_eq!( + deployment.started_at, + Some(deployment.updated_at), + "the running transition timestamps must come from the same atomic update" + ); let mut cancelled: deployments::ActiveModel = deployment.into(); cancelled.state = Set("cancelled".to_string()); @@ -1764,6 +1772,10 @@ mod tests { denied.cancelled_reason.as_deref(), Some("Deployment owner is being deleted") ); + assert!( + denied.started_at.is_none(), + "a deployment denied admission must not receive a start timestamp" + ); Ok(()) } diff --git a/crates/temps-email/src/handlers/tracking_tests.rs b/crates/temps-email/src/handlers/tracking_tests.rs index b6234579e..f386aee7d 100644 --- a/crates/temps-email/src/handlers/tracking_tests.rs +++ b/crates/temps-email/src/handlers/tracking_tests.rs @@ -71,6 +71,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-entities/src/users.rs b/crates/temps-entities/src/users.rs index ee1ed8f0f..8150b8a4c 100644 --- a/crates/temps-entities/src/users.rs +++ b/crates/temps-entities/src/users.rs @@ -20,6 +20,7 @@ pub struct Model { #[serde(skip_serializing)] pub password_reset_token: Option, pub password_reset_expires: Option, + pub must_change_password: bool, // Common fields pub deleted_at: Option, #[serde(skip_serializing)] diff --git a/crates/temps-environments/src/handlers/handler.rs b/crates/temps-environments/src/handlers/handler.rs index b036fae07..db6668cb0 100644 --- a/crates/temps-environments/src/handlers/handler.rs +++ b/crates/temps-environments/src/handlers/handler.rs @@ -2311,6 +2311,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-error-tracking/src/sentry/dsn_handlers.rs b/crates/temps-error-tracking/src/sentry/dsn_handlers.rs index 9b90d834b..d1fc6d4fc 100644 --- a/crates/temps-error-tracking/src/sentry/dsn_handlers.rs +++ b/crates/temps-error-tracking/src/sentry/dsn_handlers.rs @@ -401,6 +401,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-external-plugins/src/handler.rs b/crates/temps-external-plugins/src/handler.rs index 709032325..0ed34a205 100644 --- a/crates/temps-external-plugins/src/handler.rs +++ b/crates/temps-external-plugins/src/handler.rs @@ -156,6 +156,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-flags/src/handlers/handler.rs b/crates/temps-flags/src/handlers/handler.rs index 0e0bc9e3a..9d7da6f1b 100644 --- a/crates/temps-flags/src/handlers/handler.rs +++ b/crates/temps-flags/src/handlers/handler.rs @@ -817,6 +817,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-geo/src/handlers.rs b/crates/temps-geo/src/handlers.rs index 3b714a950..02e7449fa 100644 --- a/crates/temps-geo/src/handlers.rs +++ b/crates/temps-geo/src/handlers.rs @@ -154,6 +154,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-kv/src/handlers/handler.rs b/crates/temps-kv/src/handlers/handler.rs index 22ee09a42..26048da00 100644 --- a/crates/temps-kv/src/handlers/handler.rs +++ b/crates/temps-kv/src/handlers/handler.rs @@ -856,6 +856,7 @@ mod idor_tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-log-aggregator/src/handlers/log_handler.rs b/crates/temps-log-aggregator/src/handlers/log_handler.rs index 23c0e7be9..2facf3c7b 100644 --- a/crates/temps-log-aggregator/src/handlers/log_handler.rs +++ b/crates/temps-log-aggregator/src/handlers/log_handler.rs @@ -758,6 +758,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, @@ -794,6 +795,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-migrations/src/migration/m20260804_000001_add_must_change_password_to_users.rs b/crates/temps-migrations/src/migration/m20260804_000001_add_must_change_password_to_users.rs new file mode 100644 index 000000000..3c114c081 --- /dev/null +++ b/crates/temps-migrations/src/migration/m20260804_000001_add_must_change_password_to_users.rs @@ -0,0 +1,49 @@ +//! Tracks accounts that must replace an administrator-issued temporary password. + +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .alter_table( + Table::alter() + .table(Alias::new("users")) + .add_column_if_not_exists( + ColumnDef::new(Alias::new("must_change_password")) + .boolean() + .not_null() + .default(false), + ) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .alter_table( + Table::alter() + .table(Alias::new("users")) + .drop_column(Alias::new("must_change_password")) + .to_owned(), + ) + .await + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn migration_name_is_stable() { + assert_eq!( + Migration.name(), + "m20260804_000001_add_must_change_password_to_users" + ); + } +} diff --git a/crates/temps-migrations/src/migration/mod.rs b/crates/temps-migrations/src/migration/mod.rs index 5c25655c7..a01d3830d 100644 --- a/crates/temps-migrations/src/migration/mod.rs +++ b/crates/temps-migrations/src/migration/mod.rs @@ -172,6 +172,7 @@ mod m20260802_000002_create_feature_flags; mod m20260803_000001_add_flag_last_evaluated_at; mod m20260803_000001_add_template_slug_to_projects; mod m20260803_000002_add_step_up_expires_at_to_sessions; +mod m20260804_000001_add_must_change_password_to_users; pub struct Migrator; @@ -351,6 +352,7 @@ impl MigratorTrait for Migrator { Box::new(m20260803_000001_add_flag_last_evaluated_at::Migration), Box::new(m20260803_000001_add_template_slug_to_projects::Migration), Box::new(m20260803_000002_add_step_up_expires_at_to_sessions::Migration), + Box::new(m20260804_000001_add_must_change_password_to_users::Migration), ] } } diff --git a/crates/temps-notifications/src/handlers.rs b/crates/temps-notifications/src/handlers.rs index ceae942b3..43a350a8c 100644 --- a/crates/temps-notifications/src/handlers.rs +++ b/crates/temps-notifications/src/handlers.rs @@ -2002,6 +2002,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-providers/src/handlers/handlers.rs b/crates/temps-providers/src/handlers/handlers.rs index bccb50e11..c515fcbab 100644 --- a/crates/temps-providers/src/handlers/handlers.rs +++ b/crates/temps-providers/src/handlers/handlers.rs @@ -2661,6 +2661,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-providers/src/handlers/metrics_handlers.rs b/crates/temps-providers/src/handlers/metrics_handlers.rs index 6bf0596f5..d74316c53 100644 --- a/crates/temps-providers/src/handlers/metrics_handlers.rs +++ b/crates/temps-providers/src/handlers/metrics_handlers.rs @@ -1695,6 +1695,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-sandbox/src/handlers/sandboxes.rs b/crates/temps-sandbox/src/handlers/sandboxes.rs index e12bab2e2..86a298252 100644 --- a/crates/temps-sandbox/src/handlers/sandboxes.rs +++ b/crates/temps-sandbox/src/handlers/sandboxes.rs @@ -2474,6 +2474,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/crates/temps-teams/src/handlers/project_access.rs b/crates/temps-teams/src/handlers/project_access.rs index 8d64f365f..81f475861 100644 --- a/crates/temps-teams/src/handlers/project_access.rs +++ b/crates/temps-teams/src/handlers/project_access.rs @@ -250,6 +250,7 @@ mod tests { email_verification_expires: None, password_reset_token: None, password_reset_expires: None, + must_change_password: false, deleted_at: None, mfa_secret: None, mfa_enabled: false, diff --git a/web/src/App.tsx b/web/src/App.tsx index e9bd48ca4..3f6847246 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -75,7 +75,9 @@ const ServiceDetail = lazy(() => import('./pages/ServiceDetail').then((m) => ({ default: m.ServiceDetail })) ) const ServiceMonitoring = lazy(() => - import('./pages/ServiceMonitoring').then((m) => ({ default: m.ServiceMonitoring })) + import('./pages/ServiceMonitoring').then((m) => ({ + default: m.ServiceMonitoring, + })) ) const ServiceDataBrowser = lazy(() => import('./pages/ServiceDataBrowser').then((m) => ({ @@ -110,6 +112,9 @@ const AddClusterMember = lazy(() => const Users = lazy(() => import('./pages/Users').then((m) => ({ default: m.Users })) ) +const CreateUser = lazy(() => + import('./pages/CreateUser').then((m) => ({ default: m.CreateUser })) +) const UserDetail = lazy(() => import('./pages/UserDetail').then((m) => ({ default: m.UserDetail })) ) @@ -244,6 +249,11 @@ const ForgotPassword = lazy(() => const ResetPassword = lazy(() => import('./pages/ResetPassword').then((m) => ({ default: m.ResetPassword })) ) +const RequiredPasswordChange = lazy(() => + import('./pages/RequiredPasswordChange').then((m) => ({ + default: m.RequiredPasswordChange, + })) +) const NotFound = lazy(() => import('./components/global/NotFound')) // Settings sub-pages @@ -417,225 +427,406 @@ const FullAppRoutes = () => { return ( - - - {/* Wrap sidebar with independent error boundary */} - ( - - )} - onError={(error, errorInfo) => { - console.error('[App] Sidebar error caught by boundary:', error) - console.error('[App] Component stack:', errorInfo.componentStack) - }} - > - - - - {/* App-wide disk-space banner — sits above the header inside the + + + {/* Wrap sidebar with independent error boundary */} + ( + + )} + onError={(error, errorInfo) => { + console.error('[App] Sidebar error caught by boundary:', error) + console.error( + '[App] Component stack:', + errorInfo.componentStack + ) + }} + > + + + + {/* App-wide disk-space banner — sits above the header inside the content column (to the right of the fixed sidebar, so it's never clipped by it), full content width, on every page. */} - - {/* App-wide "newer release published" banner — informational, per- + + {/* App-wide "newer release published" banner — informational, per- version dismissible, links the upgrade docs. */} - - {/* Wrap header with independent error boundary */} - ( - - )} - onError={(error, errorInfo) => { - console.error('[App] Header error caught by boundary:', error) - console.error('[App] Component stack:', errorInfo.componentStack) - }} - > -
- - {/* Wrap page content with error boundary */} - ( - - )} - onError={(error, errorInfo) => { - console.error('[App] Page error caught by boundary:', error) - console.error('[App] Component stack:', errorInfo.componentStack) - }} - > -
- - {extraRoutes?.map((r) => ( - - ))} - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - }> - } /> - } /> - } /> - } /> - } /> - - {/* Observe section */} - {/* ADR-027 Phase 2: global cross-project unified trace waterfall */} - } - /> - } /> - } /> - } /> - } /> - {/* CLI device-authorization approval surface. The route + + {/* Wrap header with independent error boundary */} + ( + + )} + onError={(error, errorInfo) => { + console.error('[App] Header error caught by boundary:', error) + console.error( + '[App] Component stack:', + errorInfo.componentStack + ) + }} + > +
+ + {/* Wrap page content with error boundary */} + ( + + )} + onError={(error, errorInfo) => { + console.error('[App] Page error caught by boundary:', error) + console.error( + '[App] Component stack:', + errorInfo.componentStack + ) + }} + > +
+ + {extraRoutes?.map((r) => ( + + ))} + } + /> + } + /> + } /> + } /> + } /> + } /> + } /> + } /> + } + /> + }> + } + /> + } /> + } + /> + } + /> + } /> + + {/* Observe section */} + {/* ADR-027 Phase 2: global cross-project unified trace waterfall */} + } + /> + } /> + } /> + } + /> + } /> + {/* CLI device-authorization approval surface. The route sits inside the protected layout so unauthenticated visitors get bounced through /login and the captureReturnTo() infrastructure brings them back. */} - } /> - } /> - {/* Settings drill-down: only items NOT surfaced at the + } /> + } /> + {/* Settings drill-down: only items NOT surfaced at the main sidebar root live here. Top-level resources (domains, storage, email, AI, source providers, backups) moved out so they don't trigger the settings sidebar swap. */} - }> - } /> - } /> - } /> - } /> - } /> - {/* Teams sit under /settings alongside Users and API Keys: + }> + } /> + } + /> + } /> + } /> + } /> + } /> + {/* Teams sit under /settings alongside Users and API Keys: the sidebar lists them together, and a top-level route would drop out of the settings layout on click. */} - } /> - } /> - } /> - } /> - } - /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - {/* Security */} - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - - {/* Top-level resources surfaced in the main sidebar */} - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - }> - } /> - } /> - } /> - } /> - } /> - } /> - - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - {/* Backward-compat: old /settings/ links → new top-level */} - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - {/* Projects */} - } /> - } /> - } - /> - } /> - {/* Utility */} - } /> - {/* External plugin routes */} - } /> - } /> - -
-
- - {/* Persistent AI assistant dock (ADR-023): a flex sibling so it pushes + } /> + } /> + } /> + } + /> + } + /> + } /> + } /> + } /> + } /> + } /> + } /> + } + /> + {/* Security */} + } /> + } + /> + } + /> + } + /> + } + /> + } /> + } + /> + } /> + + {/* Top-level resources surfaced in the main sidebar */} + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } + /> + } + /> + } /> + } + /> + } + /> + } + /> + } + /> + } /> + } + /> + } + /> + } + /> + } /> + } /> + } /> + } + > + } /> + } + /> + } + /> + } + /> + } + /> + } + /> + + } + /> + } + /> + } + /> + } + /> + } /> + } + /> + } + /> + } /> + } + /> + } + /> + } /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + {/* Backward-compat: old /settings/ links → new top-level */} + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + {/* Projects */} + } /> + } + /> + } + /> + } + /> + {/* Utility */} + } /> + {/* External plugin routes */} + } + /> + } /> + +
+
+ + {/* Persistent AI assistant dock (ADR-023): a flex sibling so it pushes the layout rather than covering it — stays open and streaming while the user navigates the console. */} - - - {/* Shared AI-autofix setup dialog — mounted once so any surface can + + + {/* Shared AI-autofix setup dialog — mounted once so any surface can open it via `useAutofixOnboarding()` instead of hiding autofix. */} - - - + + + ) @@ -665,7 +856,14 @@ const AppContent = () => { {/* Target of the password-reset email link ({base_url}/auth/reset-password?token=...) — see send_password_reset_email in temps-auth. */} - } /> + } + /> + } + /> {/* Protected routes - layout determined by demo mode */} = [ Pick & { @@ -1750,6 +1750,20 @@ export const listPublicProvidersOptions = (options?: Options>): UseMutationOptions> => { + const mutationOptions: UseMutationOptions> = { + mutationFn: async (fnOptions) => { + const { data } = await changeRequiredPassword({ + ...options, + ...fnOptions, + throwOnError: true + }); + return data; + } + }; + return mutationOptions; +}; + export const requestPasswordResetMutation = (options?: Partial>): UseMutationOptions> => { const mutationOptions: UseMutationOptions> = { mutationFn: async (fnOptions) => { diff --git a/web/src/api/client/index.ts b/web/src/api/client/index.ts index 88eb76c4a..c23bd6359 100644 --- a/web/src/api/client/index.ts +++ b/web/src/api/client/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts -export { acknowledgeAlarm, activateAiProvider, activateApiKey, activateConnection, activateProvider, addClusterMember, addContext, addEnvironmentDomain, addEvents, addManagedDomain, addSessionReplayEvents, addTeamMember, adminDrainNode, adminDrainStatus, adminGetNode, adminListNodeContainers, adminListNodes, adminRemoveNode, adminUndrainNode, applyHostnameMode, archiveConversation, archiveFlag, assignRole, attachScheduleServices, blobCopy, blobDelete, blobDisable, blobDownload, blobEnable, blobHead, blobList, blobPut, blobStatus, blobUpdate, cancel, cancelBackup, cancelDeployment, cancelDomainOrder, cancelPgUpgrade, cancelRun, cancelScheduleRun, changePasswordSelf, changeProjectSource, chatCompletions, checkAnalyticsHasEvents, checkCommitExists, checkDomainStatus, checkExplorerSupport, checkIpBlocked, checkProviderDeletionSafety, chunkUploadOptions, cleanupExpiredBackups, clearPreviewPassword, cliDeviceApprove, cliDeviceDeny, cliDeviceLookup, cliDevicePoll, cliDeviceStart, cliLogout, cmd, cmdKill, cmdLogs, confirmPendingAction, containerMetricsGetHistory, createAgent, createAlert, createAlertRule, createApiKey, createBackupSchedule, createBitbucketProvider, createCloudflareProvider, createConversation, createCustomDomain, createDashboard, createDeploymentToken, createDnsProvider, createDomain, createDsn, createEmailDomain, createEmailProvider, createEnvironment, createEnvironmentVariable, createFlag, createFunnel, createGenericProvider, createGiteaPatProvider, createGithubPatProvider, createGitlabOauthProvider, createGitlabPatProvider, createGitProvider, createGlobalMcp, createGlobalSkill, createIncident, createIpAccessControl, createMcp, createMonitor, createNotificationEmailProvider, createNotificationProvider, createOidcProvider, createOidcRoleMapping, createOrRecreateOrder, createPlan, createPr, createProject, createProjectFromTemplate, createProjectRelease, createProjectSecret, createProviderKey, createRelease, createRoute, createS3Source, createSandbox, createService, createSkill, createSlackProvider, createTeam, createUser, createWebhook, createWebhookProvider, deactivateApiKey, deactivateConnection, deactivateProvider, deleteAgent, deleteAlert, deleteAlertRule, deleteApiKey, deleteBackup, deleteBackupSchedule, deleteConnection, deleteCustomDomain, deleteDashboard, deleteDeploymentToken, deleteDnsProvider, deleteDomain, deleteEmailDomain, deleteEmailProvider, deleteEnvironment, deleteEnvironmentDomain, deleteEnvironmentVariable, deleteExternalImage, deleteFunnel, deleteGitProvider, deleteGlobalMcp, deleteGlobalSkill, deleteIpAccessControl, deleteMcp, deleteMonitor, deleteNotificationProvider, deleteOidcProvider, deleteOidcRoleMapping, deletePreferences, deleteProject, deleteProjectSecret, deleteProviderKey, deleteProviderSafely, deleteReleaseSourceFiles, deleteReleaseSourceMaps, deleteRoute, deleteS3Source, deleteScan, deleteSecret, deleteService, deleteSessionReplay, deleteSkill, deleteSourceMap, deleteStaticBundle, deleteTeam, deleteUser, deleteWebhook, deployFromImage, deployFromImageUpload, deployFromStatic, deployFromUploadedSource, deploymentMetricsGetLatest, deploymentMetricsGetRange, deploymentMetricsToggle, destroySandbox, detachScheduleService, detectPublicPresets, disableBackupSchedule, disableMfa, discoverWorkloads, domain, downloadGlobalSkillArchive, downloadObject, downloadSkillArchive, emailStatus, embeddings, enableBackupSchedule, enrichVisitor, exec, execDetached, executeDeploymentOperation, executeImport, extendTimeout, externalServiceEnablePgStatStatements, externalServiceMetricsByDatabase, externalServiceMetricsCreateAlertRule, externalServiceMetricsDeleteAlertRule, externalServiceMetricsGetAlertRules, externalServiceMetricsGetLatest, externalServiceMetricsGetRange, externalServiceMetricsStatus, externalServiceMetricsToggle, externalServiceMetricsUpdateAlertRule, externalServiceResetPgStatStatements, finalizeOrder, finalizeProjectRelease, findConversation, generateJoinToken, generatePresetDockerfile, getAccessInfo, getActiveVisitors, getActivityGraph, getAdminGate, getAgent, getAggregatedBuckets, getAiAgentBreakdown, getAiAgentPages, getAiAgentTimeline, getAiPageBreakdown, getAiStatusBreakdown, getAlert, getAlertRule, getAllRepositoriesByName, getAnalyticsActiveVisitors, getAnalyticsEventsCount, getAnalyticsSessionEvents, getAnalyticsVisitorSessions, getApiKey, getApiKeyPermissions, getAuditLog, getBackup, getBackupSchedule, getBranchesByRepositoryId, getBucketedIncidents, getBucketedStatus, getChallengeToken, getChatReadiness, getCliStatus, getClusterHealth, getClusterMember, getCmd, getContainerDetail, getContainerEnvironmentVariable, getContainerInfo, getContainerLogs, getContainerLogsById, getContainerMetrics, getConversation, getConversationDetail, getConversations, getCronById, getCronExecutions, getCrossProjectTraceSiblings, getCurrentMonitorStatus, getCurrentUser, getCustomDomain, getDashboard, getDashboardProjectsAnalytics, getDelivery, getDeployment, getDeploymentContainerLogContent, getDeploymentJobLogs, getDeploymentJobs, getDeploymentOperations, getDeploymentOperationStatus, getDeploymentToken, getDiskStatus, getDnsChanges, getDnsProvider, getDomain, getDomainByHost, getDomainById, getDomainByName, getDomainDnsRecords, getDomainOrder, getEmail, getEmailEvents, getEmailLinks, getEmailProvider, getEmailStats, getEmailTracking, getEmailTrackingStatus, getEntityInfo, getEnvironment, getEnvironmentCrons, getEnvironmentDomains, getEnvironments, getEnvironmentVariables, getEnvironmentVariableValue, getErrorDashboardStats, getErrorEvent, getErrorGroup, getErrorStats, getErrorTimeSeries, getEventDetail, getEventEntries, getEventsCount, getEventsTimeline, getEventTypeBreakdown, getEventVisitors, getExternalImage, getFile, getFlag, getFlagSnapshot, getFunnelMetrics, getGenaiTrace, getGeneralStats, getGitProvider, getGlobalEvents, getGlobalEventStats, getGlobalMcp, getGlobalSandboxStatus, getGlobalSkill, getGroupedPageMetrics, getHealth, getHourlyVisits, getHttpChallengeDebug, getImportStatus, getIncident, getIncidentUpdates, getIpAccessControl, getIpGeolocation, getJoinTokenStatus, getLastDeployment, getLatestScan, getLatestScansPerEnvironment, getLiveVisitorsList, getLogContext, getMcp, getMetricsOverTime, getMonitor, getNotificationProvider, getOnDemandCertStatus, getOrCreateDsn, getPageFlow, getPageHourlySessions, getPagePathDetail, getPagePaths, getPagePathsSparklines, getPagePathVisitors, getPendingAction, getPerformanceMetrics, getPgUpgrade, getPgUpgradeLogs, getPipelineStats, getPlatformInfo, getPostgresWalHealth, getPreferences, getPreviewGatewayLogs, getPreviewGatewaySettings, getPreviewGatewayStatus, getPricing, getPrivateIp, getProject, getProjectAlarmsSummary, getProjectBySlug, getProjectDeployments, getProjects, getProjectServiceEnvironmentVariables, getProjectSessionReplays, getProjectsHealth, getProjectsMonitorHealth, getProjectStatistics, getProjectTemplate, getPropertyBreakdown, getPropertyTimeline, getProviderConnections, getProviderMetadata, getProvidersMetadata, getProxyLogById, getProxyLogByRequestId, getProxyLogs, getPublicBranches, getPublicIp, getPublicRepository, getQuota, getRecentActivity, getRemoteExternalImage, getRepositoryBranches, getRepositoryById, getRepositoryByName, getRepositoryPresetByName, getRepositoryPresetLive, getRepositoryTags, getResolvedEnvironmentVariables, getResolvedEnvironmentVariableValue, getRestoreCapabilities, getRestoreRun, getRoute, getRun, getRunWithLogs, getS3Credentials, getS3Source, getSandbox, getSandboxStatus, getScan, getScanByDeployment, getScanVulnerabilities, getService, getServiceBySlug, getServiceEnvironmentVariable, getServiceEnvironmentVariables, getServiceHealthStatus, getServicePreviewEnvironmentVariableNames, getServicePreviewEnvironmentVariablesMasked, getServiceRuntime, getServiceStats, getServiceTypeParameters, getServiceTypes, getSessionDetails, getSessionEvents, getSessionLogs, getSessionReplay, getSessionReplayEvents, getSettings, getSkill, getSlowQueries, getStaticBundle, getStatusOverview, getTagsByRepositoryId, getTeam, getTimeBucketStats, getTodayStats, getTrace, getUnifiedTrace, getUniqueCounts, getUniqueEvents, getUpdateStatus, getUptimeHistory, getUsageByProvider, getUsageRecent, getUsageSummary, getUsageTimeseries, getUsageTopModels, getVisitorByGuid, getVisitorById, getVisitorDetails, getVisitorFacets, getVisitorInfo, getVisitorJourney, getVisitors, getVisitorSessions, getVisitorStats, getWebhook, grantProjectAccess, handleGitProviderOauthCallback, hasAnalyticsEvents, hasErrorGroups, hasPerformanceMetrics, importExternalService, ingestLogs, ingestLogsByPath, ingestMetrics, ingestMetricsByPath, ingestSentryEnvelope, ingestSentryEvent, ingestTraces, ingestTracesByPath, initSessionReplay, inspectDropArchive, jobLogs, jobStatus, killJob, kvDel, kvDisable, kvEnable, kvExpire, kvGet, kvIncr, kvKeys, kvSet, kvStatus, kvTtl, kvUpdate, latestRunForSource, linkCustomDomainToCertificate, linkServiceToProject, listAgentRuns, listAgents, listAiProviders, listAlertRules, listAlerts, listAllConversations, listAllRuns, listApiKeys, listAuditLogs, listAvailableContainers, listBackupAlerts, listBackupChildren, listBackupSchedules, listBackupsForSchedule, listCommitsByRepositoryId, listConnections, listContainers, listContainersAtPath, listConversations, listCustomDomainsForProject, listDashboards, listDeliveries, listDeploymentContainerLogs, listDeploymentTokens, listDnsProviders, listDomains, listDsns, listEmailDomains, listEmailProviders, listEmails, listEnrollmentTokens, listEntities, listErrorEvents, listErrorGroups, listEvents, listEventTypes, listExternalImages, listExternalPlugins, listExternalServiceBackups, listFlags, listFunnels, listGitProviders, listGlobalMcps, listGlobalSkills, listIncidents, listInsights, listIpAccessControl, listJobs, listKnownAiAgents, listManagedDomains, listMcps, listMetricLabelKeys, listMetricLabelValues, listMetricNames, listModels, listMonitors, listNotificationProviders, listOidcProviders, listOidcProviderUsers, listOidcRoleMappings, listOnDemandCerts, listOrders, listPeers, listPendingActions, listPgUpgrades, listPresets, listProjectAccess, listProjectAlarms, listProjectScans, listProjectSecrets, listProjectServices, listProjectTemplates, listProjectTemplateTags, listProviderKeys, listProviderZones, listPublicProviders, listReleaseFiles, listReleases, listRemoteExternalImages, listRepositoriesByConnection, listRepositoriesByProvider, listRestoreRunsForService, listRootContainers, listRoutes, listS3Sources, listSandboxes, listScheduleRunJobs, listScheduleRuns, listScheduleServices, listSecrets, listServiceHealthStatuses, listServiceProjects, listServices, listServiceSchedules, listSkills, listSourceBackups, listSourceFiles, listSourceMaps, listSources, listStaticBundles, listSyncedRepositories, listTeamMembers, listTeamProjects, listTeams, listUsers, listWebhooks, login, logout, lookupDnsARecords, mintEnrollmentToken, mkdir, nodeHeartbeat, nodeMetricsGetRange, observabilityFullEvent, observabilityListEvents, oidcCallback, type Options, patchAdminGate, patchPreviewGatewaySettings, pauseDeployment, pauseSandbox, planRestore, postDnsAck, previewAlert, previewFunnelMetrics, previewHostnameMode, promoteClusterMember, promoteDeployment, provisionDomain, purgeProjectLogs, pushExternalImage, queryData, queryGenaiTraces, queryLogs, queryMetrics, queryTraces, queryTraceSummaries, readFile, reAnalyze, recordConsoleEvent, recordEventMetrics, recordFlagExposure, recordSpeedMetrics, refreshRouteTable, regenerateDsn, registerExternalImage, registerNode, reinstallGitlabWebhook, rejectPendingAction, reloadPlugins, removeClusterMember, removeManagedDomain, removeRole, removeTeamMember, renameConversation, renewDomain, requestPasswordReset, resetPassword, resizeSandbox, resolveAlarm, restartContainer, restartPreviewGateway, restartSandbox, restoreFlag, restoreUser, resumeDeployment, resumeSandbox, retryCluster, retryDelivery, retryPgUpgrade, retryRun, revealGlobalMcpConfig, revealMcpConfig, revealNotificationProviderConfig, revealServiceParameter, revenueCreateIntegration, revenueDeleteIntegration, revenueGlobalEvents, revenueImportInvoicesCsv, revenueImportSubscriptionsCsv, revenueListIntegrations, revenueListProviders, revenueMetricsCustomers, revenueMetricsGlobalMrr, revenueMetricsGlobalSummary, revenueMetricsMrr, revenueMetricsSummary, revenueRecentEvents, revenueRotateToken, revenueUpdateConfig, revenueUpdateSecret, revokeDsn, revokeEnrollmentToken, revokeJoinToken, revokeProjectAccess, rollbackPgUpgrade, rollbackToDeployment, rootfsGc, rootfsReport, rotateApiKey, rotateDeploymentToken, runBackupForSource, runConnectionHealthCheck, runExternalServiceBackup, runScheduleNow, sandboxCreatePreviewLink, saveAgentToken, saveAiProviderCredential, searchLogs, sendEmail, setDefaultS3Source, setFlagEnvironment, setPreviewPassword, setupDns, setupDnsChallenge, setupEmailTracking, setupMfa, sleepEnvironment, smokeTestAgent, sourceSandbox, startAnalysis, startContainer, startFix, startGitProviderOauth, startOidcLoginBySlug, startPgUpgrade, startRestore, startService, statPath, stopContainer, stopSandbox, stopService, streamContainerMetrics, streamEvents, streamRunEvents, syncRepositories, tailDeploymentJobLogs, tailLogs, teardownDeployment, teardownEnvironment, testNotificationProvider, testOidcProvider, testProvider, testProviderConnection, testProviderKeyById, testProviderKeyInline, testS3ConnectionPreview, testS3SourceConnection, trackClick, trackOpen, triggerAgent, triggerProjectPipeline, triggerScan, triggerServiceHealthCheck, triggerWeeklyDigest, unlinkServiceFromProject, updateAgent, updateAiProvider, updateAlert, updateAlertRule, updateApiKey, updateAutomaticDeploy, updateBackupSchedule, updateCloudflareProvider, updateConnectionToken, updateCustomDomain, updateDashboard, updateDeploymentToken, updateEmailProvider, updateEnvironmentSettings, updateEnvironmentSubdomain, updateEnvironmentVariable, updateErrorGroup, updateFlag, updateFunnel, updateGitProviderCredentials, updateGitSettings, updateGlobalMcp, updateGlobalSkill, updateIncidentStatus, updateIpAccessControl, updateManagedDomain, updateMcp, updateNotificationEmailProvider, updateNotificationProvider, updateOidcProvider, updatePreferences, updateProject, updateProjectDeploymentConfig, updateProjectSecret, updateProjectSettings, updateProvider, updateProviderKey, updateRoute, updateS3Source, updateSelf, updateService, updateServiceResources, updateSessionDuration, updateSettings, updateSkill, updateSlackProvider, updateSpeedMetrics, updateTeam, updateTeamMemberRole, updateUser, updateWebhook, updateWebhookProvider, upgradePreviewGateway, upgradeService, uploadGlobalSkill, uploadReleaseFile, uploadSkill, uploadSourceFile, uploadSourceMap, uploadStaticBundle, upsertSecret, validateConnection, validateEmail, verifyAndEnableMfa, verifyDomain, verifyEmail, verifyManagedDomain, verifyMfaChallenge, verifyStepUp, wakeEnvironment, webhookTrigger, workflowDryRun, writeFile, writeFiles } from './sdk.gen'; -export type { AcknowledgeAlarmData, AcknowledgeAlarmErrors, AcknowledgeAlarmResponses, AcmeOrderResponse, ActivateAiProviderData, ActivateAiProviderErrors, ActivateAiProviderResponse, ActivateAiProviderResponses, ActivateApiKeyData, ActivateApiKeyErrors, ActivateApiKeyResponse, ActivateApiKeyResponses, ActivateConnectionData, ActivateConnectionErrors, ActivateConnectionResponses, ActivateProviderData, ActivateProviderErrors, ActivateProviderResponse, ActivateProviderResponses, ActiveVisitor, ActiveVisitorsQuery, ActiveVisitorsResponse, ActivityDay, ActivityEvent, ActivityGraphQuery, ActivityGraphResponse, AddClusterMemberData, AddClusterMemberErrors, AddClusterMemberRequest, AddClusterMemberResponse, AddClusterMemberResponses, AddContextData, AddContextErrors, AddContextRequest, AddContextResponses, AddEnvironmentDomainData, AddEnvironmentDomainErrors, AddEnvironmentDomainRequest, AddEnvironmentDomainResponse, AddEnvironmentDomainResponses, AddEventsData, AddEventsError, AddEventsErrors, AddEventsRequest, AddEventsResponse, AddEventsResponse2, AddEventsResponses, AddManagedDomainApiRequest, AddManagedDomainData, AddManagedDomainErrors, AddManagedDomainResponse, AddManagedDomainResponses, AddSessionReplayEventsData, AddSessionReplayEventsError, AddSessionReplayEventsErrors, AddSessionReplayEventsResponse, AddSessionReplayEventsResponses, AddTeamMemberData, AddTeamMemberErrors, AddTeamMemberResponse, AddTeamMemberResponses, AdminDrainNodeData, AdminDrainNodeErrors, AdminDrainNodeResponse, AdminDrainNodeResponses, AdminDrainStatusData, AdminDrainStatusErrors, AdminDrainStatusResponse, AdminDrainStatusResponses, AdminGateResponse, AdminGateSource, AdminGetNodeData, AdminGetNodeErrors, AdminGetNodeResponse, AdminGetNodeResponses, AdminListNodeContainersData, AdminListNodeContainersErrors, AdminListNodeContainersResponse, AdminListNodeContainersResponses, AdminListNodesData, AdminListNodesErrors, AdminListNodesResponse, AdminListNodesResponses, AdminRemoveNodeData, AdminRemoveNodeErrors, AdminRemoveNodeResponse, AdminRemoveNodeResponses, AdminUndrainNodeData, AdminUndrainNodeErrors, AdminUndrainNodeResponse, AdminUndrainNodeResponses, AgentConfigResponse, AgentRunLogResponse, AgentRunResponse, AgentRunWithLogsResponse, AgentSandboxSettings, AgentSandboxSettingsMasked, AggregatedBucketItem, AggregatedBucketsQuery, AggregatedBucketsResponse, AggregationLevel, AggregationTemporality, AiAgentBreakdownResponse, AiAgentBreakdownRow, AiAgentDescriptor, AiAgentPageRow, AiAgentPagesResponse, AiAgentTimelineResponse, AiAgentTimelineRow, AiChatLimitsSettings, AiConfigSettings, AiPageBreakdownResponse, AiPageBreakdownRow, AiStatusBreakdownResponse, AiStatusBreakdownRow, AlarmListResponse, AlarmResponse, AlarmSummaryResponse, AlertRuleResponse, AllocEntry, AnalyticsSessionEventsResponse, AnnotatedSpan, AnomalyAlgorithm, AnomalyParams, AnomalyPreviewPointResponse, AnomalyPreviewRequest, AnomalyPreviewResponse, ApiKeyListResponse, ApiKeyResponse, ApplyHostnameModeData, ApplyHostnameModeErrors, ApplyHostnameModeRequest, ApplyHostnameModeResponse, ApplyHostnameModeResponses, AppSettings, AppSettingsResponse, ArchiveConversationData, ArchiveConversationErrors, ArchiveConversationResponse, ArchiveConversationResponses, ArchiveFlagData, ArchiveFlagErrors, ArchiveFlagResponse, ArchiveFlagResponse2, ArchiveFlagResponses, ArchiveMode, AssignRoleData, AssignRoleErrors, AssignRoleRequest, AssignRoleResponses, AttachScheduleServicesData, AttachScheduleServicesError, AttachScheduleServicesErrors, AttachScheduleServicesRequest, AttachScheduleServicesResponse, AttachScheduleServicesResponse2, AttachScheduleServicesResponses, AuditLogIpInfo, AuditLogResponse, AuditLogUserInfo, AuthFlavorDto, AuthResponse, AuthStatusResponse, AuthTokenResponse, AutofixerRunResponse, AutofixerRunWithLogsResponse, AutofixRunConfig, AutoWatchParams, AvailableContainerInfo, AvailablePermissions, BackupAlertListResponse, BackupAlertResponse, BackupResponse, BackupScheduleResponse, BitbucketAuthInput, BlobCopyData, BlobCopyError, BlobCopyErrors, BlobCopyResponse, BlobCopyResponses, BlobDeleteData, BlobDeleteError, BlobDeleteErrors, BlobDeleteResponse, BlobDeleteResponses, BlobDisableData, BlobDisableErrors, BlobDisableResponse, BlobDisableResponses, BlobDownloadData, BlobDownloadError, BlobDownloadErrors, BlobDownloadResponses, BlobEnableData, BlobEnableErrors, BlobEnableResponse, BlobEnableResponses, BlobHeadData, BlobHeadError, BlobHeadErrors, BlobHeadResponses, BlobListData, BlobListError, BlobListErrors, BlobListResponse, BlobListResponses, BlobPutData, BlobPutError, BlobPutErrors, BlobPutResponse, BlobPutResponses, BlobResponse, BlobStatusData, BlobStatusErrors, BlobStatusResponse, BlobStatusResponse2, BlobStatusResponses, BlobUpdateData, BlobUpdateErrors, BlobUpdateResponse, BlobUpdateResponses, BranchInfo, BranchListResponse, BrowserCount, BrowsersQuery, BuildConfiguration, BuildLimitsSettings, CancelBackupData, CancelBackupError, CancelBackupErrors, CancelBackupResponse, CancelBackupResponse2, CancelBackupResponses, CancelData, CancelDeploymentData, CancelDeploymentErrors, CancelDeploymentResponse, CancelDeploymentResponses, CancelDomainOrderData, CancelDomainOrderErrors, CancelDomainOrderResponse, CancelDomainOrderResponses, CancelErrors, CancelPgUpgradeData, CancelPgUpgradeErrors, CancelPgUpgradeResponse, CancelPgUpgradeResponses, CancelResponses, CancelRunData, CancelRunErrors, CancelRunResponse, CancelRunResponses, CancelScheduleRunData, CancelScheduleRunError, CancelScheduleRunErrors, CancelScheduleRunResponse, CancelScheduleRunResponses, CertStatusResponse, ChallengeConfig, ChallengeError, ChallengeValidationStatus, ChangePasswordRequest, ChangePasswordSelfData, ChangePasswordSelfErrors, ChangePasswordSelfResponse, ChangePasswordSelfResponses, ChangeProjectSourceData, ChangeProjectSourceErrors, ChangeProjectSourceRequest, ChangeProjectSourceResponse, ChangeProjectSourceResponses, ChatCompletionChoice, ChatCompletionRequest, ChatCompletionResponse, ChatCompletionsData, ChatCompletionsError, ChatCompletionsErrors, ChatCompletionsResponse, ChatCompletionsResponses, ChatMessage, ChatReadinessResponse, CheckAnalyticsHasEventsData, CheckAnalyticsHasEventsErrors, CheckAnalyticsHasEventsResponse, CheckAnalyticsHasEventsResponses, CheckCommitExistsData, CheckCommitExistsErrors, CheckCommitExistsResponse, CheckCommitExistsResponses, CheckDomainStatusData, CheckDomainStatusErrors, CheckDomainStatusResponse, CheckDomainStatusResponses, CheckExplorerSupportData, CheckExplorerSupportErrors, CheckExplorerSupportResponse, CheckExplorerSupportResponses, CheckIpBlockedData, CheckIpBlockedError, CheckIpBlockedErrors, CheckIpBlockedResponses, CheckProviderDeletionSafetyData, CheckProviderDeletionSafetyErrors, CheckProviderDeletionSafetyResponse, CheckProviderDeletionSafetyResponses, ChildBackupEntryResponse, ChildBackupListResponse, ChunkUploadOptionsData, ChunkUploadOptionsResponse, ChunkUploadOptionsResponses, CleanupExpiredBackupsData, CleanupExpiredBackupsError, CleanupExpiredBackupsErrors, CleanupExpiredBackupsRequest, CleanupExpiredBackupsResponse, CleanupExpiredBackupsResponses, ClearPreviewPasswordData, ClearPreviewPasswordErrors, ClearPreviewPasswordResponse, ClearPreviewPasswordResponses, CliDeviceApproveData, CliDeviceApproveErrors, CliDeviceApproveRequest, CliDeviceApproveResponse, CliDeviceApproveResponse2, CliDeviceApproveResponses, CliDeviceDenyData, CliDeviceDenyErrors, CliDeviceDenyResponse, CliDeviceDenyResponses, CliDeviceLookupData, CliDeviceLookupErrors, CliDeviceLookupResponse, CliDeviceLookupResponse2, CliDeviceLookupResponses, CliDevicePollData, CliDevicePollErrors, CliDevicePollRequest, CliDevicePollResponse, CliDevicePollResponse2, CliDevicePollResponses, CliDeviceStartData, CliDeviceStartErrors, CliDeviceStartRequest, CliDeviceStartResponse, CliDeviceStartResponse2, CliDeviceStartResponses, ClientOptions, CliLoginRequest, CliLogoutData, CliLogoutErrors, CliLogoutResponse, CliLogoutResponses, CloudflareConfig, CloudProvider, ClusterCapacity, ClusterDnsSettings, ClusterHealthReportResponse, ClusterMemberHealthResponse, ClusterMemberRequest, CmdBody, CmdData, CmdErrors, CmdInner, CmdKillBody, CmdKillData, CmdKillErrors, CmdKillResponse, CmdKillResponses, CmdLogsData, CmdLogsErrors, CmdLogsResponses, CmdResponse, CmdResponse2, CmdResponses, CommitExistsResponse, CommitInfo, CommitListResponse, Comparator, ComposePublicPort, ConfirmPendingActionData, ConfirmPendingActionErrors, ConfirmPendingActionResponse, ConfirmPendingActionResponses, ConnectionListQuery, ConnectionListResponse, ConnectionResponse, ConnectionTestResult, ConsoleEventPayload, ContainerActionResponse, ContainerDetailResponse, ContainerEnvironmentVariableValueResponse, ContainerInfoResponse, ContainerInventoryItem, ContainerListResponse, ContainerLogSettings, ContainerLogsQuery, ContainerMetricHistoryPoint, ContainerMetricsGetHistoryData, ContainerMetricsGetHistoryErrors, ContainerMetricsGetHistoryResponse, ContainerMetricsGetHistoryResponses, ContainerMetricsHistoryQuery, ContainerMetricsResponse, ContainerResponse, ContainerRuntimeInfo, ContainerStatsSample, ContentPart, ContextLine, ContextLogsRequest, ContextLogsResponse, ConversationDetailResponse, ConversationResponse, ConversationsQueryParams, ConversationSummary, CopyBlobRequest, CostAnalysis, CreateAgentData, CreateAgentErrors, CreateAgentResponse, CreateAgentResponses, CreateAlertData, CreateAlertError, CreateAlertErrors, CreateAlertResponse, CreateAlertResponses, CreateAlertRuleData, CreateAlertRuleErrors, CreateAlertRuleRequest, CreateAlertRuleResponse, CreateAlertRuleResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyRequest, CreateApiKeyResponse, CreateApiKeyResponse2, CreateApiKeyResponses, CreateBackupScheduleData, CreateBackupScheduleError, CreateBackupScheduleErrors, CreateBackupScheduleRequest, CreateBackupScheduleResponse, CreateBackupScheduleResponses, CreateBitbucketProviderData, CreateBitbucketProviderErrors, CreateBitbucketProviderResponse, CreateBitbucketProviderResponses, CreateBitbucketRequest, CreateCloudflareProviderData, CreateCloudflareProviderErrors, CreateCloudflareProviderRequest, CreateCloudflareProviderResponse, CreateCloudflareProviderResponses, CreateConversationData, CreateConversationErrors, CreateConversationRequest, CreateConversationResponse, CreateConversationResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponse, CreateCustomDomainResponses, CreateDashboardData, CreateDashboardError, CreateDashboardErrors, CreateDashboardRequest, CreateDashboardResponse, CreateDashboardResponses, CreateDeploymentTokenData, CreateDeploymentTokenErrors, CreateDeploymentTokenRequest, CreateDeploymentTokenResponse, CreateDeploymentTokenResponse2, CreateDeploymentTokenResponses, CreateDnsProviderData, CreateDnsProviderErrors, CreateDnsProviderRequest, CreateDnsProviderResponse, CreateDnsProviderResponses, CreateDomainData, CreateDomainErrors, CreateDomainRequest, CreateDomainResponse, CreateDomainResponses, CreatedResource, CreateDsnData, CreateDsnErrors, CreateDsnRequest, CreateDsnResponse, CreateDsnResponses, CreateEmailDomainData, CreateEmailDomainErrors, CreateEmailDomainRequest, CreateEmailDomainResponse, CreateEmailDomainResponses, CreateEmailProviderData, CreateEmailProviderErrors, CreateEmailProviderRequest, CreateEmailProviderResponse, CreateEmailProviderResponses, CreateEnvironmentData, CreateEnvironmentErrors, CreateEnvironmentRequest, CreateEnvironmentResponse, CreateEnvironmentResponses, CreateEnvironmentVariableData, CreateEnvironmentVariableErrors, CreateEnvironmentVariableRequest, CreateEnvironmentVariableResponse, CreateEnvironmentVariableResponses, CreateExternalServiceRequest, CreateFlagData, CreateFlagErrors, CreateFlagRequest, CreateFlagResponse, CreateFlagResponses, CreateFunnelData, CreateFunnelErrors, CreateFunnelRequest, CreateFunnelResponse, CreateFunnelResponse2, CreateFunnelResponses, CreateFunnelStep, CreateGenericProviderData, CreateGenericProviderErrors, CreateGenericProviderResponse, CreateGenericProviderResponses, CreateGenericRequest, CreateGiteaPatProviderData, CreateGiteaPatProviderErrors, CreateGiteaPatProviderResponse, CreateGiteaPatProviderResponses, CreateGiteaPatRequest, CreateGithubPatProviderData, CreateGithubPatProviderErrors, CreateGithubPatProviderResponse, CreateGithubPatProviderResponses, CreateGitHubPatRequest, CreateGitlabOauthProviderData, CreateGitlabOauthProviderErrors, CreateGitlabOauthProviderResponse, CreateGitlabOauthProviderResponses, CreateGitLabOAuthRequest, CreateGitlabPatProviderData, CreateGitlabPatProviderErrors, CreateGitlabPatProviderResponse, CreateGitlabPatProviderResponses, CreateGitLabPatRequest, CreateGitProviderData, CreateGitProviderErrors, CreateGitProviderResponse, CreateGitProviderResponses, CreateGlobalMcpData, CreateGlobalMcpErrors, CreateGlobalMcpResponse, CreateGlobalMcpResponses, CreateGlobalSkillData, CreateGlobalSkillErrors, CreateGlobalSkillResponse, CreateGlobalSkillResponses, CreateIncidentData, CreateIncidentErrors, CreateIncidentRequest, CreateIncidentResponse, CreateIncidentResponses, CreateIntegrationBody, CreateIpAccessControlData, CreateIpAccessControlError, CreateIpAccessControlErrors, CreateIpAccessControlRequest, CreateIpAccessControlResponse, CreateIpAccessControlResponses, CreateMcpData, CreateMcpErrors, CreateMcpRequest, CreateMcpResponse, CreateMcpResponses, CreateMetricAlertRequest, CreateMonitorData, CreateMonitorErrors, CreateMonitorRequest, CreateMonitorResponse, CreateMonitorResponses, CreateNotificationEmailProviderData, CreateNotificationEmailProviderErrors, CreateNotificationEmailProviderRequest, CreateNotificationEmailProviderResponse, CreateNotificationEmailProviderResponses, CreateNotificationProviderData, CreateNotificationProviderErrors, CreateNotificationProviderResponse, CreateNotificationProviderResponses, CreateOidcProviderData, CreateOidcProviderErrors, CreateOidcProviderRequest, CreateOidcProviderResponse, CreateOidcProviderResponses, CreateOidcRoleMappingData, CreateOidcRoleMappingRequest, CreateOidcRoleMappingResponse, CreateOidcRoleMappingResponses, CreateOrRecreateOrderData, CreateOrRecreateOrderErrors, CreateOrRecreateOrderResponse, CreateOrRecreateOrderResponses, CreatePlanData, CreatePlanErrors, CreatePlanRequest, CreatePlanResponse, CreatePlanResponse2, CreatePlanResponses, CreatePrData, CreatePrErrors, CreateProjectAccessRequest, CreateProjectData, CreateProjectErrors, CreateProjectFromTemplateData, CreateProjectFromTemplateErrors, CreateProjectFromTemplateRequest, CreateProjectFromTemplateResponse, CreateProjectFromTemplateResponse2, CreateProjectFromTemplateResponses, CreateProjectReleaseData, CreateProjectReleaseErrors, CreateProjectReleaseResponse, CreateProjectReleaseResponses, CreateProjectRequest, CreateProjectResponse, CreateProjectResponses, CreateProjectSecretData, CreateProjectSecretErrors, CreateProjectSecretRequest, CreateProjectSecretResponse, CreateProjectSecretResponses, CreateProviderKeyData, CreateProviderKeyError, CreateProviderKeyErrors, CreateProviderKeyRequest, CreateProviderKeyResponse, CreateProviderKeyResponses, CreateProviderRequest, CreatePrResponse, CreatePrResponse2, CreatePrResponses, CreateReleaseData, CreateReleaseErrors, CreateReleaseResponse, CreateReleaseResponses, CreateRouteData, CreateRouteErrors, CreateRouteRequest, CreateRouteResponse, CreateRouteResponses, CreateS3SourceData, CreateS3SourceError, CreateS3SourceErrors, CreateS3SourceRequest, CreateS3SourceResponse, CreateS3SourceResponses, CreateSandboxBody, CreateSandboxData, CreateSandboxErrors, CreateSandboxResponse, CreateSandboxResponses, CreateServiceData, CreateServiceErrors, CreateServiceResponse, CreateServiceResponses, CreateSkillData, CreateSkillErrors, CreateSkillRequest, CreateSkillResponse, CreateSkillResponses, CreateSlackProviderData, CreateSlackProviderErrors, CreateSlackProviderRequest, CreateSlackProviderResponse, CreateSlackProviderResponses, CreateTeamData, CreateTeamErrors, CreateTeamMemberRequest, CreateTeamRequest, CreateTeamResponse, CreateTeamResponses, CreateUserData, CreateUserErrors, CreateUserRequest, CreateUserResponse, CreateUserResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookProviderData, CreateWebhookProviderErrors, CreateWebhookProviderRequest, CreateWebhookProviderResponse, CreateWebhookProviderResponses, CreateWebhookRequestBody, CreateWebhookResponse, CreateWebhookResponses, CronExecutionInfo, CronInfo, CrossProjectSiblingRef, CrossProjectTraceResponse, CurrentStatusResponse, CustomDomainRequest, CustomDomainResponse, CustomerMovementResponse, DashboardLayout, DashboardProjectsAnalyticsQuery, DashboardProjectsAnalyticsResponse, DashboardSection, DashboardTile, DatabaseMetricsResponse, DatabaseMetricsRow, DataImplication, DataImplicationSeverity, DeactivateApiKeyData, DeactivateApiKeyErrors, DeactivateApiKeyResponse, DeactivateApiKeyResponses, DeactivateConnectionData, DeactivateConnectionErrors, DeactivateConnectionResponses, DeactivateProviderData, DeactivateProviderErrors, DeactivateProviderResponses, DeleteAgentData, DeleteAgentErrors, DeleteAgentResponse, DeleteAgentResponses, DeleteAlertData, DeleteAlertError, DeleteAlertErrors, DeleteAlertResponse, DeleteAlertResponses, DeleteAlertRuleData, DeleteAlertRuleErrors, DeleteAlertRuleResponse, DeleteAlertRuleResponses, DeleteApiKeyData, DeleteApiKeyErrors, DeleteApiKeyResponse, DeleteApiKeyResponses, DeleteBackupData, DeleteBackupError, DeleteBackupErrors, DeleteBackupResponse, DeleteBackupResponses, DeleteBackupScheduleData, DeleteBackupScheduleError, DeleteBackupScheduleErrors, DeleteBackupScheduleResponse, DeleteBackupScheduleResponses, DeleteBlobRequest, DeleteBlobResponse, DeleteConnectionData, DeleteConnectionErrors, DeleteConnectionResponse, DeleteConnectionResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponse, DeleteCustomDomainResponses, DeleteDashboardData, DeleteDashboardError, DeleteDashboardErrors, DeleteDashboardResponse, DeleteDashboardResponses, DeleteDeploymentTokenData, DeleteDeploymentTokenErrors, DeleteDeploymentTokenResponse, DeleteDeploymentTokenResponses, DeleteDnsProviderData, DeleteDnsProviderErrors, DeleteDnsProviderResponse, DeleteDnsProviderResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponse, DeleteDomainResponses, DeleteEmailDomainData, DeleteEmailDomainErrors, DeleteEmailDomainResponse, DeleteEmailDomainResponses, DeleteEmailProviderData, DeleteEmailProviderErrors, DeleteEmailProviderResponse, DeleteEmailProviderResponses, DeleteEnvironmentData, DeleteEnvironmentDomainData, DeleteEnvironmentDomainErrors, DeleteEnvironmentDomainResponse, DeleteEnvironmentDomainResponses, DeleteEnvironmentErrors, DeleteEnvironmentResponse, DeleteEnvironmentResponses, DeleteEnvironmentVariableData, DeleteEnvironmentVariableErrors, DeleteEnvironmentVariableResponse, DeleteEnvironmentVariableResponses, DeleteExternalImageData, DeleteExternalImageErrors, DeleteExternalImageResponse, DeleteExternalImageResponses, DeleteFunnelData, DeleteFunnelErrors, DeleteFunnelResponses, DeleteGitProviderData, DeleteGitProviderErrors, DeleteGitProviderResponse, DeleteGitProviderResponses, DeleteGlobalMcpData, DeleteGlobalMcpErrors, DeleteGlobalMcpResponse, DeleteGlobalMcpResponses, DeleteGlobalSkillData, DeleteGlobalSkillErrors, DeleteGlobalSkillResponse, DeleteGlobalSkillResponses, DeleteIpAccessControlData, DeleteIpAccessControlError, DeleteIpAccessControlErrors, DeleteIpAccessControlResponse, DeleteIpAccessControlResponses, DeleteMcpData, DeleteMcpErrors, DeleteMcpResponse, DeleteMcpResponses, DeleteMonitorData, DeleteMonitorErrors, DeleteMonitorResponse, DeleteMonitorResponses, DeleteNotificationProviderData, DeleteNotificationProviderErrors, DeleteNotificationProviderResponse, DeleteNotificationProviderResponses, DeleteOidcProviderData, DeleteOidcProviderResponse, DeleteOidcProviderResponses, DeleteOidcRoleMappingData, DeleteOidcRoleMappingResponse, DeleteOidcRoleMappingResponses, DeletePreferencesData, DeletePreferencesErrors, DeletePreferencesResponse, DeletePreferencesResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponse, DeleteProjectResponses, DeleteProjectSecretData, DeleteProjectSecretErrors, DeleteProjectSecretResponse, DeleteProjectSecretResponses, DeleteProviderKeyData, DeleteProviderKeyError, DeleteProviderKeyErrors, DeleteProviderKeyResponse, DeleteProviderKeyResponses, DeleteProviderSafelyData, DeleteProviderSafelyErrors, DeleteProviderSafelyResponse, DeleteProviderSafelyResponses, DeleteReleaseSourceFilesData, DeleteReleaseSourceFilesErrors, DeleteReleaseSourceFilesResponse, DeleteReleaseSourceFilesResponses, DeleteReleaseSourceMapsData, DeleteReleaseSourceMapsErrors, DeleteReleaseSourceMapsResponse, DeleteReleaseSourceMapsResponses, DeleteResponse, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponse, DeleteRouteResponses, DeleteS3SourceData, DeleteS3SourceError, DeleteS3SourceErrors, DeleteS3SourceResponse, DeleteS3SourceResponses, DeleteScanData, DeleteScanError, DeleteScanErrors, DeleteScanResponse, DeleteScanResponses, DeleteSecretData, DeleteSecretErrors, DeleteSecretResponse, DeleteSecretResponses, DeleteServiceData, DeleteServiceErrors, DeleteServiceResponse, DeleteServiceResponses, DeleteSessionReplayData, DeleteSessionReplayError, DeleteSessionReplayErrors, DeleteSessionReplayResponses, DeleteSkillData, DeleteSkillErrors, DeleteSkillResponse, DeleteSkillResponses, DeleteSourceMapData, DeleteSourceMapErrors, DeleteSourceMapResponse, DeleteSourceMapResponses, DeleteStaticBundleData, DeleteStaticBundleErrors, DeleteStaticBundleResponse, DeleteStaticBundleResponses, DeleteTeamData, DeleteTeamErrors, DeleteTeamResponse, DeleteTeamResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponse, DeleteUserResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponse, DeleteWebhookResponses, DelRequest, DelResponse, DeployFromImageData, DeployFromImageErrors, DeployFromImageRequest, DeployFromImageResponse, DeployFromImageResponses, DeployFromImageUploadData, DeployFromImageUploadErrors, DeployFromImageUploadQuery, DeployFromImageUploadResponse, DeployFromImageUploadResponses, DeployFromStaticData, DeployFromStaticErrors, DeployFromStaticRequest, DeployFromStaticResponse, DeployFromStaticResponses, DeployFromUploadedSourceData, DeployFromUploadedSourceErrors, DeployFromUploadedSourceResponse, DeployFromUploadedSourceResponses, DeploymentConfig, DeploymentConfigSnapshot, DeploymentConfiguration, DeploymentContainerLogContentResponse, DeploymentContainerLogResponse, DeploymentContainerLogsListResponse, DeploymentEnvironmentResponse, DeploymentJobResponse, DeploymentJobsResponse, DeploymentListResponse, DeploymentMetadata, DeploymentMetricsGetLatestData, DeploymentMetricsGetLatestErrors, DeploymentMetricsGetLatestResponse, DeploymentMetricsGetLatestResponses, DeploymentMetricsGetRangeData, DeploymentMetricsGetRangeErrors, DeploymentMetricsGetRangeResponse, DeploymentMetricsGetRangeResponses, DeploymentMetricsToggleData, DeploymentMetricsToggleErrors, DeploymentMetricsToggleResponses, DeploymentResponse, DeploymentStateResponse, DeploymentStrategy, DeploymentTokenListResponse, DeploymentTokenResponse, DestroySandboxData, DestroySandboxErrors, DestroySandboxResponse, DestroySandboxResponses, DetachScheduleServiceData, DetachScheduleServiceError, DetachScheduleServiceErrors, DetachScheduleServiceResponse, DetachScheduleServiceResponses, DetectionConfig, DetectPublicPresetsData, DetectPublicPresetsErrors, DetectPublicPresetsResponse, DetectPublicPresetsResponses, DeviceCount, DigestSections, Direction, DisableBackupScheduleData, DisableBackupScheduleErrors, DisableBackupScheduleResponse, DisableBackupScheduleResponses, DisableBlobResponse, DisableKvResponse, DisableMfaData, DisableMfaErrors, DisableMfaRequest, DisableMfaResponse, DisableMfaResponses, DiscoverRequest, DiscoverResponse, DiscoverWorkloadsData, DiscoverWorkloadsErrors, DiscoverWorkloadsResponse, DiscoverWorkloadsResponses, DiskInfo, DiskSpaceAlert, DiskSpaceAlertSettings, DiskSpaceCheckResult, DnsAckRequest, DnsAckResponse, DnsChallengeRecordResult, DnsChangesResponse, DnsCompletionResponse, DnsLookupError, DnsLookupRequest, DnsLookupResponse, DnsProviderCredentials, DnsProviderResponse, DnsProviderSettings, DnsProviderSettingsMasked, DnsProviderType, DnsRecord, DnsRecordChange, DnsRecordContent, DnsRecordResponse, DnsRecordSetupResult, DnsRecordStatusResponse, DnsZone, DockerComposePresetConfig, DockerfilePresetConfig, DockerfileVariant, DockerRegistrySettings, DockerRegistrySettingsMasked, DomainAction, DomainChallengeResponse, DomainData, DomainEnvironmentResponse, DomainError, DomainErrors, DomainPlan, DomainResponse, DomainResponse2, DomainResponses, DownloadGlobalSkillArchiveData, DownloadGlobalSkillArchiveErrors, DownloadGlobalSkillArchiveResponse, DownloadGlobalSkillArchiveResponses, DownloadObjectData, DownloadObjectErrors, DownloadObjectResponse, DownloadObjectResponses, DownloadSkillArchiveData, DownloadSkillArchiveErrors, DownloadSkillArchiveResponse, DownloadSkillArchiveResponses, DrainNodeResponse, DrainStatusResponse, DropArchiveUpload, DropInspectionResponse, DropOffPoint, DropPresetCandidate, EmailConfig, EmailDomainResponse, EmailDomainWithDnsResponse, EmailProviderResponse, EmailProviderTypeRoute, EmailRequest, EmailResponse, EmailStatsResponse, EmailStatusData, EmailStatusErrors, EmailStatusResponse, EmailStatusResponse2, EmailStatusResponses, EmailTrackingResponse, EmailTrackingSetupResponse, EmailTrackingStatusResponse, EmbeddingData, EmbeddingInput, EmbeddingRequest, EmbeddingResponse, EmbeddingsData, EmbeddingsError, EmbeddingsErrors, EmbeddingsResponse, EmbeddingsResponses, EmbeddingUsage, EnableBackupScheduleData, EnableBackupScheduleErrors, EnableBackupScheduleResponse, EnableBackupScheduleResponses, EnableBlobRequest, EnableBlobResponse, EnableKvRequest, EnableKvResponse, EnablePgStatStatementsResponse, EndpointDto, EnqueuedJob, EnrichVisitorData, EnrichVisitorErrors, EnrichVisitorRequest, EnrichVisitorResponse, EnrichVisitorResponse2, EnrichVisitorResponses, EnrollmentTokenInfo, EnrollmentTokenListResponse, EntityInfoResponse, EntityResponse, EnvironmentConfiguration, EnvironmentDomainResponse, EnvironmentInfo, EnvironmentResponse, EnvironmentVariable, EnvironmentVariableInfo, EnvironmentVariableResponse, EnvironmentVariableValueResponse, EnvVarInput, EnvVarIntegrationInfo, EnvVarResponse, EnvVarTemplateResponse, ErrorDashboardStatsQuery, ErrorDashboardStatsResponse, ErrorEventResponse, ErrorGroupResponse, ErrorGroupStatsResponse, ErrorResponse, ErrorRow, ErrorTimeSeriesDataResponse, ErrorTimeSeriesQuery, EventActivityBucket, EventBreakdown, EventBrowserStats, EventCount, EventCountryStats, EventDetailQuery, EventDetailResponse, EventEntriesQuery, EventEntriesResponse, EventEntryInfo, EventKind, EventMetricsPayload, EventReferrerStats, EventsCountQuery, EventsResponse, EventTimeline, EventTimelineQuery, EventType, EventTypeBreakdown, EventTypeBreakdownQuery, EventTypeResponse, EventTypesResponse, EventVisitorInfo, EventVisitorsQuery, EventVisitorsResponse, ExecBody, ExecData, ExecDetachedData, ExecDetachedErrors, ExecDetachedResponse, ExecDetachedResponse2, ExecDetachedResponses, ExecErrors, ExecResponse, ExecResponse2, ExecResponses, ExecuteDeploymentOperationData, ExecuteDeploymentOperationErrors, ExecuteDeploymentOperationResponse, ExecuteDeploymentOperationResponses, ExecuteImportData, ExecuteImportErrors, ExecuteImportRequest, ExecuteImportResponse, ExecuteImportResponse2, ExecuteImportResponses, ExecuteOperationRequest, ExpireRequest, ExpireResponse, ExplorerSupportResponse, ExtendTimeoutBody, ExtendTimeoutData, ExtendTimeoutErrors, ExtendTimeoutResponse, ExtendTimeoutResponses, ExternalImageResponse, ExternalServiceBackupResponse, ExternalServiceDetails, ExternalServiceEnablePgStatStatementsData, ExternalServiceEnablePgStatStatementsErrors, ExternalServiceEnablePgStatStatementsResponse, ExternalServiceEnablePgStatStatementsResponses, ExternalServiceInfo, ExternalServiceMetricsByDatabaseData, ExternalServiceMetricsByDatabaseErrors, ExternalServiceMetricsByDatabaseResponse, ExternalServiceMetricsByDatabaseResponses, ExternalServiceMetricsCreateAlertRuleData, ExternalServiceMetricsCreateAlertRuleErrors, ExternalServiceMetricsCreateAlertRuleResponse, ExternalServiceMetricsCreateAlertRuleResponses, ExternalServiceMetricsDeleteAlertRuleData, ExternalServiceMetricsDeleteAlertRuleErrors, ExternalServiceMetricsDeleteAlertRuleResponse, ExternalServiceMetricsDeleteAlertRuleResponses, ExternalServiceMetricsGetAlertRulesData, ExternalServiceMetricsGetAlertRulesErrors, ExternalServiceMetricsGetAlertRulesResponse, ExternalServiceMetricsGetAlertRulesResponses, ExternalServiceMetricsGetLatestData, ExternalServiceMetricsGetLatestErrors, ExternalServiceMetricsGetLatestResponse, ExternalServiceMetricsGetLatestResponses, ExternalServiceMetricsGetRangeData, ExternalServiceMetricsGetRangeErrors, ExternalServiceMetricsGetRangeResponse, ExternalServiceMetricsGetRangeResponses, ExternalServiceMetricsStatusData, ExternalServiceMetricsStatusErrors, ExternalServiceMetricsStatusResponse, ExternalServiceMetricsStatusResponses, ExternalServiceMetricsToggleData, ExternalServiceMetricsToggleErrors, ExternalServiceMetricsToggleResponses, ExternalServiceMetricsUpdateAlertRuleData, ExternalServiceMetricsUpdateAlertRuleErrors, ExternalServiceMetricsUpdateAlertRuleResponse, ExternalServiceMetricsUpdateAlertRuleResponses, ExternalServiceResetPgStatStatementsData, ExternalServiceResetPgStatStatementsErrors, ExternalServiceResetPgStatStatementsResponse, ExternalServiceResetPgStatStatementsResponses, ExternalServiceSummary, FieldResponse, FinalizeOrderData, FinalizeOrderErrors, FinalizeOrderResponse, FinalizeOrderResponses, FinalizeProjectReleaseData, FinalizeProjectReleaseErrors, FinalizeProjectReleaseResponse, FinalizeProjectReleaseResponses, FindConversationData, FindConversationErrors, FindConversationResponse, FindConversationResponses, FiringSeriesEntry, FlagEnvironmentResponse, FlagListResponse, FlagResponse, FlagSnapshot, FlagSnapshotResponse, FlagValueType, ForecastAlgorithm, ForecastParams, FullError, FullEvent, FullRequest, FunnelMetricsResponse, FunnelResponse, GatewayStatus, GenAiEvent, GenAiSpanDetail, GenAiTraceDetailResponse, GenAiTraceSummariesResponse, GenAiTraceSummary, GeneralStatsQuery, GeneralStatsResponse, GenerateDockerfileRequest, GenerateDockerfileResponse, GenerateJoinTokenData, GenerateJoinTokenErrors, GenerateJoinTokenResponse, GenerateJoinTokenResponse2, GenerateJoinTokenResponses, GeneratePresetDockerfileData, GeneratePresetDockerfileErrors, GeneratePresetDockerfileResponse, GeneratePresetDockerfileResponses, GeoLocationResponse, GeoRestrictionsConfig, GetAccessInfoData, GetAccessInfoErrors, GetAccessInfoResponse, GetAccessInfoResponses, GetActiveVisitorsData, GetActiveVisitorsErrors, GetActiveVisitorsResponse, GetActiveVisitorsResponses, GetActivityGraphData, GetActivityGraphErrors, GetActivityGraphResponse, GetActivityGraphResponses, GetAdminGateData, GetAdminGateErrors, GetAdminGateResponse, GetAdminGateResponses, GetAgentData, GetAgentErrors, GetAgentResponse, GetAgentResponses, GetAggregatedBucketsData, GetAggregatedBucketsErrors, GetAggregatedBucketsResponse, GetAggregatedBucketsResponses, GetAiAgentBreakdownData, GetAiAgentBreakdownError, GetAiAgentBreakdownErrors, GetAiAgentBreakdownResponse, GetAiAgentBreakdownResponses, GetAiAgentPagesData, GetAiAgentPagesError, GetAiAgentPagesErrors, GetAiAgentPagesResponse, GetAiAgentPagesResponses, GetAiAgentTimelineData, GetAiAgentTimelineError, GetAiAgentTimelineErrors, GetAiAgentTimelineResponse, GetAiAgentTimelineResponses, GetAiPageBreakdownData, GetAiPageBreakdownError, GetAiPageBreakdownErrors, GetAiPageBreakdownResponse, GetAiPageBreakdownResponses, GetAiStatusBreakdownData, GetAiStatusBreakdownError, GetAiStatusBreakdownErrors, GetAiStatusBreakdownResponse, GetAiStatusBreakdownResponses, GetAlertData, GetAlertError, GetAlertErrors, GetAlertResponse, GetAlertResponses, GetAlertRuleData, GetAlertRuleErrors, GetAlertRuleResponse, GetAlertRuleResponses, GetAllRepositoriesByNameData, GetAllRepositoriesByNameErrors, GetAllRepositoriesByNameResponse, GetAllRepositoriesByNameResponses, GetAnalyticsActiveVisitorsData, GetAnalyticsActiveVisitorsErrors, GetAnalyticsActiveVisitorsResponse, GetAnalyticsActiveVisitorsResponses, GetAnalyticsEventsCountData, GetAnalyticsEventsCountErrors, GetAnalyticsEventsCountResponse, GetAnalyticsEventsCountResponses, GetAnalyticsSessionEventsData, GetAnalyticsSessionEventsErrors, GetAnalyticsSessionEventsResponse, GetAnalyticsSessionEventsResponses, GetAnalyticsVisitorSessionsData, GetAnalyticsVisitorSessionsErrors, GetAnalyticsVisitorSessionsResponse, GetAnalyticsVisitorSessionsResponses, GetApiKeyData, GetApiKeyErrors, GetApiKeyPermissionsData, GetApiKeyPermissionsErrors, GetApiKeyPermissionsResponse, GetApiKeyPermissionsResponses, GetApiKeyResponse, GetApiKeyResponses, GetAuditLogData, GetAuditLogErrors, GetAuditLogResponse, GetAuditLogResponses, GetBackupData, GetBackupError, GetBackupErrors, GetBackupResponse, GetBackupResponses, GetBackupScheduleData, GetBackupScheduleErrors, GetBackupScheduleResponse, GetBackupScheduleResponses, GetBranchesByRepositoryIdData, GetBranchesByRepositoryIdErrors, GetBranchesByRepositoryIdResponse, GetBranchesByRepositoryIdResponses, GetBucketedIncidentsData, GetBucketedIncidentsErrors, GetBucketedIncidentsResponse, GetBucketedIncidentsResponses, GetBucketedStatusData, GetBucketedStatusErrors, GetBucketedStatusResponse, GetBucketedStatusResponses, GetChallengeTokenData, GetChallengeTokenErrors, GetChallengeTokenResponse, GetChallengeTokenResponses, GetChatReadinessData, GetChatReadinessErrors, GetChatReadinessResponse, GetChatReadinessResponses, GetCliStatusData, GetCliStatusErrors, GetCliStatusResponses, GetClusterHealthData, GetClusterHealthErrors, GetClusterHealthResponse, GetClusterHealthResponses, GetClusterMemberData, GetClusterMemberErrors, GetClusterMemberResponse, GetClusterMemberResponses, GetCmdData, GetCmdErrors, GetCmdResponse, GetCmdResponses, GetContainerDetailData, GetContainerDetailErrors, GetContainerDetailResponse, GetContainerDetailResponses, GetContainerEnvironmentVariableData, GetContainerEnvironmentVariableErrors, GetContainerEnvironmentVariableResponse, GetContainerEnvironmentVariableResponses, GetContainerInfoData, GetContainerInfoErrors, GetContainerInfoResponse, GetContainerInfoResponses, GetContainerLogsByIdData, GetContainerLogsByIdErrors, GetContainerLogsData, GetContainerLogsErrors, GetContainerMetricsData, GetContainerMetricsErrors, GetContainerMetricsResponse, GetContainerMetricsResponses, GetConversationData, GetConversationDetailData, GetConversationDetailError, GetConversationDetailErrors, GetConversationDetailResponse, GetConversationDetailResponses, GetConversationErrors, GetConversationResponse, GetConversationResponses, GetConversationsData, GetConversationsError, GetConversationsErrors, GetConversationsResponse, GetConversationsResponses, GetCronByIdData, GetCronByIdErrors, GetCronByIdResponse, GetCronByIdResponses, GetCronExecutionsData, GetCronExecutionsErrors, GetCronExecutionsResponse, GetCronExecutionsResponses, GetCrossProjectTraceSiblingsData, GetCrossProjectTraceSiblingsError, GetCrossProjectTraceSiblingsErrors, GetCrossProjectTraceSiblingsResponse, GetCrossProjectTraceSiblingsResponses, GetCurrentMonitorStatusData, GetCurrentMonitorStatusErrors, GetCurrentMonitorStatusResponse, GetCurrentMonitorStatusResponses, GetCurrentUserData, GetCurrentUserErrors, GetCurrentUserResponse, GetCurrentUserResponses, GetCustomDomainData, GetCustomDomainErrors, GetCustomDomainResponse, GetCustomDomainResponses, GetDashboardData, GetDashboardError, GetDashboardErrors, GetDashboardProjectsAnalyticsData, GetDashboardProjectsAnalyticsErrors, GetDashboardProjectsAnalyticsResponse, GetDashboardProjectsAnalyticsResponses, GetDashboardResponse, GetDashboardResponses, GetDeliveryData, GetDeliveryErrors, GetDeliveryResponse, GetDeliveryResponses, GetDeploymentContainerLogContentData, GetDeploymentContainerLogContentErrors, GetDeploymentContainerLogContentResponse, GetDeploymentContainerLogContentResponses, GetDeploymentData, GetDeploymentErrors, GetDeploymentJobLogsData, GetDeploymentJobLogsErrors, GetDeploymentJobLogsResponse, GetDeploymentJobLogsResponses, GetDeploymentJobsData, GetDeploymentJobsErrors, GetDeploymentJobsResponse, GetDeploymentJobsResponses, GetDeploymentOperationsData, GetDeploymentOperationsErrors, GetDeploymentOperationsResponse, GetDeploymentOperationsResponses, GetDeploymentOperationStatusData, GetDeploymentOperationStatusErrors, GetDeploymentOperationStatusResponse, GetDeploymentOperationStatusResponses, GetDeploymentResponse, GetDeploymentResponses, GetDeploymentsParams, GetDeploymentTokenData, GetDeploymentTokenErrors, GetDeploymentTokenResponse, GetDeploymentTokenResponses, GetDiskStatusData, GetDiskStatusErrors, GetDiskStatusResponse, GetDiskStatusResponses, GetDnsChangesData, GetDnsChangesErrors, GetDnsChangesResponse, GetDnsChangesResponses, GetDnsProviderData, GetDnsProviderErrors, GetDnsProviderResponse, GetDnsProviderResponses, GetDomainByHostData, GetDomainByHostErrors, GetDomainByHostResponse, GetDomainByHostResponses, GetDomainByIdData, GetDomainByIdErrors, GetDomainByIdResponse, GetDomainByIdResponses, GetDomainByNameData, GetDomainByNameErrors, GetDomainByNameResponse, GetDomainByNameResponses, GetDomainData, GetDomainDnsRecordsData, GetDomainDnsRecordsErrors, GetDomainDnsRecordsResponse, GetDomainDnsRecordsResponses, GetDomainErrors, GetDomainOrderData, GetDomainOrderErrors, GetDomainOrderResponse, GetDomainOrderResponses, GetDomainResponse, GetDomainResponses, GetEmailData, GetEmailErrors, GetEmailEventsData, GetEmailEventsErrors, GetEmailEventsResponse, GetEmailEventsResponses, GetEmailLinksData, GetEmailLinksErrors, GetEmailLinksResponse, GetEmailLinksResponses, GetEmailProviderData, GetEmailProviderErrors, GetEmailProviderResponse, GetEmailProviderResponses, GetEmailResponse, GetEmailResponses, GetEmailStatsData, GetEmailStatsErrors, GetEmailStatsResponse, GetEmailStatsResponses, GetEmailTrackingData, GetEmailTrackingErrors, GetEmailTrackingResponse, GetEmailTrackingResponses, GetEmailTrackingStatusData, GetEmailTrackingStatusErrors, GetEmailTrackingStatusResponse, GetEmailTrackingStatusResponses, GetEntityInfoData, GetEntityInfoErrors, GetEntityInfoResponse, GetEntityInfoResponses, GetEnvironmentCronsData, GetEnvironmentCronsErrors, GetEnvironmentCronsResponse, GetEnvironmentCronsResponses, GetEnvironmentData, GetEnvironmentDomainsData, GetEnvironmentDomainsErrors, GetEnvironmentDomainsResponse, GetEnvironmentDomainsResponses, GetEnvironmentErrors, GetEnvironmentResponse, GetEnvironmentResponses, GetEnvironmentsData, GetEnvironmentsErrors, GetEnvironmentsResponse, GetEnvironmentsResponses, GetEnvironmentVariablesData, GetEnvironmentVariablesErrors, GetEnvironmentVariablesQuery, GetEnvironmentVariablesResponse, GetEnvironmentVariablesResponses, GetEnvironmentVariableValueData, GetEnvironmentVariableValueErrors, GetEnvironmentVariableValueResponse, GetEnvironmentVariableValueResponses, GetErrorDashboardStatsData, GetErrorDashboardStatsErrors, GetErrorDashboardStatsResponse, GetErrorDashboardStatsResponses, GetErrorEventData, GetErrorEventErrors, GetErrorEventResponse, GetErrorEventResponses, GetErrorGroupData, GetErrorGroupErrors, GetErrorGroupResponse, GetErrorGroupResponses, GetErrorStatsData, GetErrorStatsErrors, GetErrorStatsResponse, GetErrorStatsResponses, GetErrorTimeSeriesData, GetErrorTimeSeriesErrors, GetErrorTimeSeriesResponse, GetErrorTimeSeriesResponses, GetEventDetailData, GetEventDetailErrors, GetEventDetailResponse, GetEventDetailResponses, GetEventEntriesData, GetEventEntriesErrors, GetEventEntriesResponse, GetEventEntriesResponses, GetEventsCountData, GetEventsCountErrors, GetEventsCountResponse, GetEventsCountResponses, GetEventsTimelineData, GetEventsTimelineErrors, GetEventsTimelineResponse, GetEventsTimelineResponses, GetEventTypeBreakdownData, GetEventTypeBreakdownErrors, GetEventTypeBreakdownResponse, GetEventTypeBreakdownResponses, GetEventVisitorsData, GetEventVisitorsErrors, GetEventVisitorsResponse, GetEventVisitorsResponses, GetExternalImageData, GetExternalImageErrors, GetExternalImageResponse, GetExternalImageResponses, GetFileData, GetFileErrors, GetFileResponse, GetFileResponses, GetFlagData, GetFlagErrors, GetFlagResponse, GetFlagResponses, GetFlagSnapshotData, GetFlagSnapshotErrors, GetFlagSnapshotResponse, GetFlagSnapshotResponses, GetFunnelMetricsData, GetFunnelMetricsErrors, GetFunnelMetricsQuery, GetFunnelMetricsResponse, GetFunnelMetricsResponses, GetGenaiTraceData, GetGenaiTraceError, GetGenaiTraceErrors, GetGenaiTraceResponse, GetGenaiTraceResponses, GetGeneralStatsData, GetGeneralStatsErrors, GetGeneralStatsResponse, GetGeneralStatsResponses, GetGitProviderData, GetGitProviderErrors, GetGitProviderResponse, GetGitProviderResponses, GetGlobalEventsData, GetGlobalEventsErrors, GetGlobalEventsResponse, GetGlobalEventsResponses, GetGlobalEventStatsData, GetGlobalEventStatsErrors, GetGlobalEventStatsResponse, GetGlobalEventStatsResponses, GetGlobalMcpData, GetGlobalMcpErrors, GetGlobalMcpResponse, GetGlobalMcpResponses, GetGlobalSandboxStatusData, GetGlobalSandboxStatusErrors, GetGlobalSandboxStatusResponse, GetGlobalSandboxStatusResponses, GetGlobalSkillData, GetGlobalSkillErrors, GetGlobalSkillResponse, GetGlobalSkillResponses, GetGroupedPageMetricsData, GetGroupedPageMetricsError, GetGroupedPageMetricsErrors, GetGroupedPageMetricsResponse, GetGroupedPageMetricsResponses, GetHealthData, GetHealthError, GetHealthErrors, GetHealthResponse, GetHealthResponses, GetHourlyVisitsData, GetHourlyVisitsErrors, GetHourlyVisitsResponse, GetHourlyVisitsResponses, GetHttpChallengeDebugData, GetHttpChallengeDebugErrors, GetHttpChallengeDebugResponse, GetHttpChallengeDebugResponses, GetImportStatusData, GetImportStatusErrors, GetImportStatusResponse, GetImportStatusResponses, GetIncidentData, GetIncidentErrors, GetIncidentResponse, GetIncidentResponses, GetIncidentUpdatesData, GetIncidentUpdatesErrors, GetIncidentUpdatesResponse, GetIncidentUpdatesResponses, GetIpAccessControlData, GetIpAccessControlError, GetIpAccessControlErrors, GetIpAccessControlResponse, GetIpAccessControlResponses, GetIpGeolocationData, GetIpGeolocationError, GetIpGeolocationErrors, GetIpGeolocationResponse, GetIpGeolocationResponses, GetJoinTokenStatusData, GetJoinTokenStatusErrors, GetJoinTokenStatusResponse, GetJoinTokenStatusResponses, GetLastDeploymentData, GetLastDeploymentErrors, GetLastDeploymentResponse, GetLastDeploymentResponses, GetLatestScanData, GetLatestScanError, GetLatestScanErrors, GetLatestScanResponse, GetLatestScanResponses, GetLatestScansPerEnvironmentData, GetLatestScansPerEnvironmentError, GetLatestScansPerEnvironmentErrors, GetLatestScansPerEnvironmentResponse, GetLatestScansPerEnvironmentResponses, GetLiveVisitorsListData, GetLiveVisitorsListErrors, GetLiveVisitorsListResponse, GetLiveVisitorsListResponses, GetLogContextData, GetLogContextError, GetLogContextErrors, GetLogContextResponse, GetLogContextResponses, GetMcpData, GetMcpErrors, GetMcpResponse, GetMcpResponses, GetMetricsOverTimeData, GetMetricsOverTimeError, GetMetricsOverTimeErrors, GetMetricsOverTimeResponse, GetMetricsOverTimeResponses, GetMonitorData, GetMonitorErrors, GetMonitorResponse, GetMonitorResponses, GetNotificationProviderData, GetNotificationProviderErrors, GetNotificationProviderResponse, GetNotificationProviderResponses, GetOnDemandCertStatusData, GetOnDemandCertStatusErrors, GetOnDemandCertStatusResponse, GetOnDemandCertStatusResponses, GetOrCreateDsnData, GetOrCreateDsnErrors, GetOrCreateDsnRequest, GetOrCreateDsnResponse, GetOrCreateDsnResponses, GetPageFlowData, GetPageFlowErrors, GetPageFlowResponse, GetPageFlowResponses, GetPageHourlySessionsData, GetPageHourlySessionsErrors, GetPageHourlySessionsResponse, GetPageHourlySessionsResponses, GetPagePathDetailData, GetPagePathDetailErrors, GetPagePathDetailResponse, GetPagePathDetailResponses, GetPagePathsData, GetPagePathsErrors, GetPagePathsResponse, GetPagePathsResponses, GetPagePathsSparklinesData, GetPagePathsSparklinesErrors, GetPagePathsSparklinesResponse, GetPagePathsSparklinesResponses, GetPagePathVisitorsData, GetPagePathVisitorsErrors, GetPagePathVisitorsResponse, GetPagePathVisitorsResponses, GetPendingActionData, GetPendingActionErrors, GetPendingActionResponse, GetPendingActionResponses, GetPerformanceMetricsData, GetPerformanceMetricsError, GetPerformanceMetricsErrors, GetPerformanceMetricsResponse, GetPerformanceMetricsResponses, GetPgUpgradeData, GetPgUpgradeErrors, GetPgUpgradeLogsData, GetPgUpgradeLogsErrors, GetPgUpgradeLogsResponse, GetPgUpgradeLogsResponses, GetPgUpgradeResponse, GetPgUpgradeResponses, GetPipelineStatsData, GetPipelineStatsError, GetPipelineStatsErrors, GetPipelineStatsResponse, GetPipelineStatsResponses, GetPlatformInfoData, GetPlatformInfoErrors, GetPlatformInfoResponse, GetPlatformInfoResponses, GetPostgresWalHealthData, GetPostgresWalHealthErrors, GetPostgresWalHealthResponse, GetPostgresWalHealthResponses, GetPreferencesData, GetPreferencesErrors, GetPreferencesResponse, GetPreferencesResponses, GetPreviewGatewayLogsData, GetPreviewGatewayLogsResponse, GetPreviewGatewayLogsResponses, GetPreviewGatewaySettingsData, GetPreviewGatewaySettingsResponse, GetPreviewGatewaySettingsResponses, GetPreviewGatewayStatusData, GetPreviewGatewayStatusResponse, GetPreviewGatewayStatusResponses, GetPricingData, GetPricingError, GetPricingErrors, GetPricingResponse, GetPricingResponses, GetPrivateIpData, GetPrivateIpErrors, GetPrivateIpResponses, GetProjectAlarmsSummaryData, GetProjectAlarmsSummaryErrors, GetProjectAlarmsSummaryResponse, GetProjectAlarmsSummaryResponses, GetProjectBySlugData, GetProjectBySlugErrors, GetProjectBySlugResponse, GetProjectBySlugResponses, GetProjectData, GetProjectDeploymentsData, GetProjectDeploymentsErrors, GetProjectDeploymentsResponse, GetProjectDeploymentsResponses, GetProjectErrors, GetProjectResponse, GetProjectResponses, GetProjectsData, GetProjectSecretsQuery, GetProjectsErrors, GetProjectServiceEnvironmentVariablesData, GetProjectServiceEnvironmentVariablesErrors, GetProjectServiceEnvironmentVariablesResponse, GetProjectServiceEnvironmentVariablesResponses, GetProjectSessionReplaysData, GetProjectSessionReplaysError, GetProjectSessionReplaysErrors, GetProjectSessionReplaysQuery, GetProjectSessionReplaysResponse, GetProjectSessionReplaysResponse2, GetProjectSessionReplaysResponses, GetProjectsHealthData, GetProjectsHealthError, GetProjectsHealthErrors, GetProjectsHealthResponse, GetProjectsHealthResponses, GetProjectsMonitorHealthData, GetProjectsMonitorHealthErrors, GetProjectsMonitorHealthResponse, GetProjectsMonitorHealthResponses, GetProjectsResponse, GetProjectsResponses, GetProjectStatisticsData, GetProjectStatisticsErrors, GetProjectStatisticsResponse, GetProjectStatisticsResponses, GetProjectTemplateData, GetProjectTemplateErrors, GetProjectTemplateResponse, GetProjectTemplateResponses, GetPropertyBreakdownData, GetPropertyBreakdownErrors, GetPropertyBreakdownResponse, GetPropertyBreakdownResponses, GetPropertyTimelineData, GetPropertyTimelineErrors, GetPropertyTimelineResponse, GetPropertyTimelineResponses, GetProviderConnectionsData, GetProviderConnectionsErrors, GetProviderConnectionsResponse, GetProviderConnectionsResponses, GetProviderMetadataData, GetProviderMetadataErrors, GetProviderMetadataResponse, GetProviderMetadataResponses, GetProvidersMetadataData, GetProvidersMetadataErrors, GetProvidersMetadataResponse, GetProvidersMetadataResponses, GetProxyLogByIdData, GetProxyLogByIdError, GetProxyLogByIdErrors, GetProxyLogByIdResponse, GetProxyLogByIdResponses, GetProxyLogByRequestIdData, GetProxyLogByRequestIdError, GetProxyLogByRequestIdErrors, GetProxyLogByRequestIdResponse, GetProxyLogByRequestIdResponses, GetProxyLogsData, GetProxyLogsError, GetProxyLogsErrors, GetProxyLogsResponse, GetProxyLogsResponses, GetPublicBranchesData, GetPublicBranchesErrors, GetPublicBranchesResponse, GetPublicBranchesResponses, GetPublicIpData, GetPublicIpErrors, GetPublicIpResponses, GetPublicRepositoryData, GetPublicRepositoryErrors, GetPublicRepositoryResponse, GetPublicRepositoryResponses, GetQuotaData, GetQuotaError, GetQuotaErrors, GetQuotaResponse, GetQuotaResponses, GetRecentActivityData, GetRecentActivityErrors, GetRecentActivityResponse, GetRecentActivityResponses, GetRemoteExternalImageData, GetRemoteExternalImageErrors, GetRemoteExternalImageResponse, GetRemoteExternalImageResponses, GetRepositoryBranchesData, GetRepositoryBranchesErrors, GetRepositoryBranchesResponse, GetRepositoryBranchesResponses, GetRepositoryByIdData, GetRepositoryByIdErrors, GetRepositoryByIdResponse, GetRepositoryByIdResponses, GetRepositoryByNameData, GetRepositoryByNameErrors, GetRepositoryByNameResponse, GetRepositoryByNameResponses, GetRepositoryPresetByNameData, GetRepositoryPresetByNameErrors, GetRepositoryPresetByNameResponse, GetRepositoryPresetByNameResponses, GetRepositoryPresetLiveData, GetRepositoryPresetLiveErrors, GetRepositoryPresetLiveResponse, GetRepositoryPresetLiveResponses, GetRepositoryTagsData, GetRepositoryTagsErrors, GetRepositoryTagsResponse, GetRepositoryTagsResponses, GetRequest, GetResolvedEnvironmentVariablesData, GetResolvedEnvironmentVariablesErrors, GetResolvedEnvironmentVariablesResponse, GetResolvedEnvironmentVariablesResponses, GetResolvedEnvironmentVariableValueData, GetResolvedEnvironmentVariableValueErrors, GetResolvedEnvironmentVariableValueResponse, GetResolvedEnvironmentVariableValueResponses, GetResponse, GetRestoreCapabilitiesData, GetRestoreCapabilitiesError, GetRestoreCapabilitiesErrors, GetRestoreCapabilitiesResponse, GetRestoreCapabilitiesResponses, GetRestoreRunData, GetRestoreRunError, GetRestoreRunErrors, GetRestoreRunResponse, GetRestoreRunResponses, GetRouteData, GetRouteErrors, GetRouteResponse, GetRouteResponses, GetRunData, GetRunErrors, GetRunResponse, GetRunResponses, GetRunWithLogsData, GetRunWithLogsErrors, GetRunWithLogsResponse, GetRunWithLogsResponses, GetS3CredentialsData, GetS3CredentialsErrors, GetS3CredentialsResponse, GetS3CredentialsResponses, GetS3SourceData, GetS3SourceError, GetS3SourceErrors, GetS3SourceResponse, GetS3SourceResponses, GetSandboxData, GetSandboxErrors, GetSandboxResponse, GetSandboxResponses, GetSandboxStatusData, GetSandboxStatusErrors, GetSandboxStatusResponse, GetSandboxStatusResponses, GetScanByDeploymentData, GetScanByDeploymentError, GetScanByDeploymentErrors, GetScanByDeploymentResponse, GetScanByDeploymentResponses, GetScanData, GetScanError, GetScanErrors, GetScanResponse, GetScanResponses, GetScanVulnerabilitiesData, GetScanVulnerabilitiesError, GetScanVulnerabilitiesErrors, GetScanVulnerabilitiesResponse, GetScanVulnerabilitiesResponses, GetServiceBySlugData, GetServiceBySlugErrors, GetServiceBySlugResponse, GetServiceBySlugResponses, GetServiceData, GetServiceEnvironmentVariableData, GetServiceEnvironmentVariableErrors, GetServiceEnvironmentVariableResponse, GetServiceEnvironmentVariableResponses, GetServiceEnvironmentVariablesData, GetServiceEnvironmentVariablesErrors, GetServiceEnvironmentVariablesResponse, GetServiceEnvironmentVariablesResponses, GetServiceErrors, GetServiceHealthStatusData, GetServiceHealthStatusErrors, GetServiceHealthStatusResponse, GetServiceHealthStatusResponses, GetServicePreviewEnvironmentVariableNamesData, GetServicePreviewEnvironmentVariableNamesErrors, GetServicePreviewEnvironmentVariableNamesResponse, GetServicePreviewEnvironmentVariableNamesResponses, GetServicePreviewEnvironmentVariablesMaskedData, GetServicePreviewEnvironmentVariablesMaskedErrors, GetServicePreviewEnvironmentVariablesMaskedResponse, GetServicePreviewEnvironmentVariablesMaskedResponses, GetServiceResponse, GetServiceResponses, GetServiceRuntimeData, GetServiceRuntimeErrors, GetServiceRuntimeResponse, GetServiceRuntimeResponses, GetServiceStatsData, GetServiceStatsErrors, GetServiceStatsResponse, GetServiceStatsResponses, GetServiceTypeParametersData, GetServiceTypeParametersErrors, GetServiceTypeParametersResponses, GetServiceTypesData, GetServiceTypesErrors, GetServiceTypesResponse, GetServiceTypesResponses, GetSessionDetailsData, GetSessionDetailsErrors, GetSessionDetailsResponse, GetSessionDetailsResponses, GetSessionEventsData, GetSessionEventsErrors, GetSessionEventsResponse, GetSessionEventsResponses, GetSessionLogsData, GetSessionLogsErrors, GetSessionLogsResponse, GetSessionLogsResponses, GetSessionReplayData, GetSessionReplayError, GetSessionReplayErrors, GetSessionReplayEventsData, GetSessionReplayEventsError, GetSessionReplayEventsErrors, GetSessionReplayEventsResponse, GetSessionReplayEventsResponses, GetSessionReplayResponse, GetSessionReplayResponse2, GetSessionReplayResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponse, GetSettingsResponses, GetSkillData, GetSkillErrors, GetSkillResponse, GetSkillResponses, GetSlowQueriesData, GetSlowQueriesErrors, GetSlowQueriesResponse, GetSlowQueriesResponses, GetStaticBundleData, GetStaticBundleErrors, GetStaticBundleResponse, GetStaticBundleResponses, GetStatusOverviewData, GetStatusOverviewErrors, GetStatusOverviewResponse, GetStatusOverviewResponses, GetTagsByRepositoryIdData, GetTagsByRepositoryIdErrors, GetTagsByRepositoryIdResponse, GetTagsByRepositoryIdResponses, GetTeamData, GetTeamErrors, GetTeamResponse, GetTeamResponses, GetTimeBucketStatsData, GetTimeBucketStatsError, GetTimeBucketStatsErrors, GetTimeBucketStatsResponse, GetTimeBucketStatsResponses, GetTodayStatsData, GetTodayStatsError, GetTodayStatsErrors, GetTodayStatsResponse, GetTodayStatsResponses, GetTraceData, GetTraceError, GetTraceErrors, GetTraceResponse, GetTraceResponses, GetUnifiedTraceData, GetUnifiedTraceError, GetUnifiedTraceErrors, GetUnifiedTraceResponse, GetUnifiedTraceResponses, GetUniqueCountsData, GetUniqueCountsErrors, GetUniqueCountsResponse, GetUniqueCountsResponses, GetUniqueEventsData, GetUniqueEventsErrors, GetUniqueEventsQuery, GetUniqueEventsResponse, GetUniqueEventsResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponse, GetUpdateStatusResponses, GetUptimeHistoryData, GetUptimeHistoryErrors, GetUptimeHistoryResponse, GetUptimeHistoryResponses, GetUsageByProviderData, GetUsageByProviderError, GetUsageByProviderErrors, GetUsageByProviderResponse, GetUsageByProviderResponses, GetUsageRecentData, GetUsageRecentError, GetUsageRecentErrors, GetUsageRecentResponse, GetUsageRecentResponses, GetUsageSummaryData, GetUsageSummaryError, GetUsageSummaryErrors, GetUsageSummaryResponse, GetUsageSummaryResponses, GetUsageTimeseriesData, GetUsageTimeseriesError, GetUsageTimeseriesErrors, GetUsageTimeseriesResponse, GetUsageTimeseriesResponses, GetUsageTopModelsData, GetUsageTopModelsError, GetUsageTopModelsErrors, GetUsageTopModelsResponse, GetUsageTopModelsResponses, GetVisitorByGuidData, GetVisitorByGuidErrors, GetVisitorByGuidResponse, GetVisitorByGuidResponses, GetVisitorByIdData, GetVisitorByIdErrors, GetVisitorByIdResponse, GetVisitorByIdResponses, GetVisitorDetailsData, GetVisitorDetailsErrors, GetVisitorDetailsResponse, GetVisitorDetailsResponses, GetVisitorFacetsData, GetVisitorFacetsErrors, GetVisitorFacetsResponse, GetVisitorFacetsResponses, GetVisitorInfoData, GetVisitorInfoErrors, GetVisitorInfoResponse, GetVisitorInfoResponses, GetVisitorJourneyData, GetVisitorJourneyErrors, GetVisitorJourneyResponse, GetVisitorJourneyResponses, GetVisitorsData, GetVisitorsErrors, GetVisitorSessionsData, GetVisitorSessionsError, GetVisitorSessionsErrors, GetVisitorSessionsQuery, GetVisitorSessionsResponse, GetVisitorSessionsResponse2, GetVisitorSessionsResponses, GetVisitorsResponse, GetVisitorsResponses, GetVisitorStatsData, GetVisitorStatsErrors, GetVisitorStatsResponse, GetVisitorStatsResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponse, GetWebhookResponses, GitPushEvent, GitRefResponse, GitSourcePlan, GlobalConversationResponse, GlobalEventStatsResponse, GlobalMrrResponse, GlobalRecentEventResponse, GlobalRevenueSummaryResponse, GrantProjectAccessData, GrantProjectAccessErrors, GrantProjectAccessResponse, GrantProjectAccessResponses, GroupedPageMetric, GroupedPageMetricsQuery, GroupedPageMetricsResponse, HandleGitProviderOauthCallbackData, HandleGitProviderOauthCallbackErrors, HasAnalyticsEventsData, HasAnalyticsEventsErrors, HasAnalyticsEventsResponse, HasAnalyticsEventsResponse2, HasAnalyticsEventsResponses, HasErrorGroupsData, HasErrorGroupsErrors, HasErrorGroupsResponse, HasErrorGroupsResponse2, HasErrorGroupsResponses, HasEventsQuery, HasEventsResponse, HasMetricsQuery, HasMetricsResponse, HasPerformanceMetricsData, HasPerformanceMetricsError, HasPerformanceMetricsErrors, HasPerformanceMetricsResponse, HasPerformanceMetricsResponses, HealthCheckConfiguration, HealthCheckEntryResponse, HealthResponse, HealthStatus, HealthSummary, HeartbeatApiRequest, HeartbeatResponse, HierarchyLevel, HistogramSummary, HostnameChange, HostnamePreviewResponse, HourlyPageSessions, HourlyVisitsQuery, HttpChallengeDebugResponse, ImportCredentials, ImportExecutionStatus, ImportExternalServiceData, ImportExternalServiceErrors, ImportExternalServiceRequest, ImportExternalServiceResponse, ImportExternalServiceResponses, ImportOutcomeResponse, ImportPlan, ImportRowErrorResponse, ImportSelector, ImportSource, ImportSourceCapabilities, ImportSourceInfo, ImportStatusResponse, IncidentBucket, IncidentBucketedResponse, IncidentResponse, IncidentUpdateResponse, IncrRequest, IncrResponse, IngestLogsByPathData, IngestLogsByPathError, IngestLogsByPathErrors, IngestLogsByPathResponses, IngestLogsData, IngestLogsError, IngestLogsErrors, IngestLogsResponses, IngestMetricsByPathData, IngestMetricsByPathError, IngestMetricsByPathErrors, IngestMetricsByPathResponses, IngestMetricsData, IngestMetricsError, IngestMetricsErrors, IngestMetricsResponses, IngestSentryEnvelopeData, IngestSentryEnvelopeErrors, IngestSentryEnvelopeResponses, IngestSentryEventData, IngestSentryEventErrors, IngestSentryEventResponse, IngestSentryEventResponses, IngestTracesByPathData, IngestTracesByPathError, IngestTracesByPathErrors, IngestTracesByPathResponses, IngestTracesData, IngestTracesError, IngestTracesErrors, IngestTracesResponses, InitAuthResponse, InitSessionReplayData, InitSessionReplayError, InitSessionReplayErrors, InitSessionReplayResponse, InitSessionReplayResponses, Insight, InsightSeverity, InsightsResponse, InsightStatus, InspectDropArchiveData, InspectDropArchiveErrors, InspectDropArchiveResponse, InspectDropArchiveResponses, IntegrationResponse, IpAccessControlQuery, IpAccessControlResponse, JobLogsData, JobLogsErrors, JobLogsResponses, JobStatusData, JobStatusErrors, JobStatusResponse, JobStatusResponse2, JobStatusResponses, JobSummaryResponse, JoinTokenStatusResponse, JourneyEvent, JourneySession, KeysRequest, KeysResponse, KillJobBody, KillJobData, KillJobErrors, KillJobResponse, KillJobResponses, KnownAiAgentsResponse, KvDelData, KvDelErrors, KvDelResponse, KvDelResponses, KvDisableData, KvDisableErrors, KvDisableResponse, KvDisableResponses, KvEnableData, KvEnableErrors, KvEnableResponse, KvEnableResponses, KvExpireData, KvExpireErrors, KvExpireResponse, KvExpireResponses, KvGetData, KvGetErrors, KvGetResponse, KvGetResponses, KvIncrData, KvIncrErrors, KvIncrResponse, KvIncrResponses, KvKeysData, KvKeysErrors, KvKeysResponse, KvKeysResponses, KvSetData, KvSetErrors, KvSetResponse, KvSetResponses, KvStatusData, KvStatusErrors, KvStatusResponse, KvStatusResponse2, KvStatusResponses, KvTtlData, KvTtlErrors, KvTtlResponse, KvTtlResponses, KvUpdateData, KvUpdateErrors, KvUpdateResponse, KvUpdateResponses, LatestRunForSourceData, LatestRunForSourceErrors, LatestRunForSourceResponse, LatestRunForSourceResponses, LemonSqueezyConfig, LetsEncryptSettings, LineContext, LinkCustomDomainToCertificateData, LinkCustomDomainToCertificateErrors, LinkCustomDomainToCertificateResponse, LinkCustomDomainToCertificateResponses, LinkServiceRequest, LinkServiceToProjectData, LinkServiceToProjectErrors, LinkServiceToProjectResponse, LinkServiceToProjectResponses, ListAgentRunsData, ListAgentRunsErrors, ListAgentRunsResponse, ListAgentRunsResponses, ListAgentsData, ListAgentsErrors, ListAgentsResponse, ListAgentsResponse2, ListAgentsResponses, ListAiProvidersData, ListAiProvidersErrors, ListAiProvidersResponse, ListAiProvidersResponses, ListAlertRulesData, ListAlertRulesErrors, ListAlertRulesResponse, ListAlertRulesResponses, ListAlertsData, ListAlertsError, ListAlertsErrors, ListAlertsResponse, ListAlertsResponses, ListAllConversationsData, ListAllConversationsErrors, ListAllConversationsResponse, ListAllConversationsResponses, ListAllRunsData, ListAllRunsErrors, ListAllRunsResponse, ListAllRunsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysQuery, ListApiKeysResponse, ListApiKeysResponses, ListAuditLogsData, ListAuditLogsErrors, ListAuditLogsQuery, ListAuditLogsResponse, ListAuditLogsResponses, ListAvailableContainersData, ListAvailableContainersErrors, ListAvailableContainersResponse, ListAvailableContainersResponses, ListBackupAlertsData, ListBackupAlertsError, ListBackupAlertsErrors, ListBackupAlertsResponse, ListBackupAlertsResponses, ListBackupChildrenData, ListBackupChildrenError, ListBackupChildrenErrors, ListBackupChildrenResponse, ListBackupChildrenResponses, ListBackupSchedulesData, ListBackupSchedulesError, ListBackupSchedulesErrors, ListBackupSchedulesResponse, ListBackupSchedulesResponses, ListBackupsForScheduleData, ListBackupsForScheduleErrors, ListBackupsForScheduleResponse, ListBackupsForScheduleResponses, ListBlobsQuery, ListBlobsResponse, ListCommitsByRepositoryIdData, ListCommitsByRepositoryIdErrors, ListCommitsByRepositoryIdResponse, ListCommitsByRepositoryIdResponses, ListConnectionsData, ListConnectionsErrors, ListConnectionsResponse, ListConnectionsResponses, ListContainersAtPathData, ListContainersAtPathErrors, ListContainersAtPathResponse, ListContainersAtPathResponses, ListContainersData, ListContainersErrors, ListContainersResponse, ListContainersResponses, ListConversationsData, ListConversationsErrors, ListConversationsResponse, ListConversationsResponses, ListCustomDomainsForProjectData, ListCustomDomainsForProjectErrors, ListCustomDomainsForProjectResponse, ListCustomDomainsForProjectResponses, ListCustomDomainsResponse, ListDashboardsData, ListDashboardsError, ListDashboardsErrors, ListDashboardsResponse, ListDashboardsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponse, ListDeliveriesResponses, ListDeploymentContainerLogsData, ListDeploymentContainerLogsErrors, ListDeploymentContainerLogsResponse, ListDeploymentContainerLogsResponses, ListDeploymentTokensData, ListDeploymentTokensErrors, ListDeploymentTokensQuery, ListDeploymentTokensResponse, ListDeploymentTokensResponses, ListDnsProvidersData, ListDnsProvidersErrors, ListDnsProvidersResponse, ListDnsProvidersResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponse, ListDomainsResponse2, ListDomainsResponses, ListDsnsData, ListDsnsErrors, ListDsnsResponse, ListDsnsResponses, ListEmailDomainsData, ListEmailDomainsErrors, ListEmailDomainsResponse, ListEmailDomainsResponses, ListEmailProvidersData, ListEmailProvidersErrors, ListEmailProvidersResponse, ListEmailProvidersResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponse, ListEmailsResponses, ListEnrollmentTokensData, ListEnrollmentTokensErrors, ListEnrollmentTokensResponse, ListEnrollmentTokensResponses, ListEntitiesData, ListEntitiesErrors, ListEntitiesQuery, ListEntitiesResponse, ListEntitiesResponses, ListErrorEventsData, ListErrorEventsErrors, ListErrorEventsQuery, ListErrorEventsResponse, ListErrorEventsResponses, ListErrorGroupsData, ListErrorGroupsErrors, ListErrorGroupsQuery, ListErrorGroupsResponse, ListErrorGroupsResponses, ListEventsData, ListEventsResponse, ListEventsResponses, ListEventTypesData, ListEventTypesResponse, ListEventTypesResponses, ListExternalImagesData, ListExternalImagesErrors, ListExternalImagesResponse, ListExternalImagesResponses, ListExternalPluginsData, ListExternalPluginsErrors, ListExternalPluginsResponse, ListExternalPluginsResponses, ListExternalServiceBackupsData, ListExternalServiceBackupsError, ListExternalServiceBackupsErrors, ListExternalServiceBackupsResponse, ListExternalServiceBackupsResponses, ListFlagsData, ListFlagsErrors, ListFlagsResponse, ListFlagsResponses, ListFunnelsData, ListFunnelsErrors, ListFunnelsResponse, ListFunnelsResponses, ListGitProvidersData, ListGitProvidersErrors, ListGitProvidersResponse, ListGitProvidersResponses, ListGlobalMcpsData, ListGlobalMcpsErrors, ListGlobalMcpsResponse, ListGlobalMcpsResponses, ListGlobalSkillsData, ListGlobalSkillsErrors, ListGlobalSkillsResponse, ListGlobalSkillsResponses, ListIncidentsData, ListIncidentsErrors, ListIncidentsResponses, ListInsightsData, ListInsightsError, ListInsightsErrors, ListInsightsResponse, ListInsightsResponses, ListIpAccessControlData, ListIpAccessControlError, ListIpAccessControlErrors, ListIpAccessControlResponse, ListIpAccessControlResponses, ListJobsData, ListJobsErrors, ListJobsResponse, ListJobsResponse2, ListJobsResponses, ListKnownAiAgentsData, ListKnownAiAgentsError, ListKnownAiAgentsErrors, ListKnownAiAgentsResponse, ListKnownAiAgentsResponses, ListManagedDomainsData, ListManagedDomainsErrors, ListManagedDomainsResponse, ListManagedDomainsResponses, ListMcpsData, ListMcpsErrors, ListMcpsResponse, ListMcpsResponse2, ListMcpsResponses, ListMetricLabelKeysData, ListMetricLabelKeysError, ListMetricLabelKeysErrors, ListMetricLabelKeysResponse, ListMetricLabelKeysResponses, ListMetricLabelValuesData, ListMetricLabelValuesError, ListMetricLabelValuesErrors, ListMetricLabelValuesResponse, ListMetricLabelValuesResponses, ListMetricNamesData, ListMetricNamesError, ListMetricNamesErrors, ListMetricNamesResponse, ListMetricNamesResponses, ListModelsData, ListModelsError, ListModelsErrors, ListModelsResponse, ListModelsResponses, ListMonitorsData, ListMonitorsErrors, ListMonitorsResponse, ListMonitorsResponses, ListNotificationProvidersData, ListNotificationProvidersErrors, ListNotificationProvidersResponse, ListNotificationProvidersResponses, ListOidcProvidersData, ListOidcProvidersResponse, ListOidcProvidersResponses, ListOidcProviderUsersData, ListOidcProviderUsersErrors, ListOidcProviderUsersResponse, ListOidcProviderUsersResponses, ListOidcRoleMappingsData, ListOidcRoleMappingsResponse, ListOidcRoleMappingsResponses, ListOnDemandCertsData, ListOnDemandCertsErrors, ListOnDemandCertsResponse, ListOnDemandCertsResponse2, ListOnDemandCertsResponses, ListOrdersData, ListOrdersErrors, ListOrdersResponse, ListOrdersResponse2, ListOrdersResponses, ListPeersData, ListPeersErrors, ListPeersResponse, ListPeersResponses, ListPendingActionsData, ListPendingActionsErrors, ListPendingActionsResponse, ListPendingActionsResponses, ListPgUpgradesData, ListPgUpgradesErrors, ListPgUpgradesResponse, ListPgUpgradesResponses, ListPresetsData, ListPresetsErrors, ListPresetsResponse, ListPresetsResponse2, ListPresetsResponses, ListProjectAccessData, ListProjectAccessErrors, ListProjectAccessResponse, ListProjectAccessResponses, ListProjectAlarmsData, ListProjectAlarmsErrors, ListProjectAlarmsResponse, ListProjectAlarmsResponses, ListProjectScansData, ListProjectScansError, ListProjectScansErrors, ListProjectScansResponse, ListProjectScansResponses, ListProjectSecretsData, ListProjectSecretsErrors, ListProjectSecretsResponse, ListProjectSecretsResponses, ListProjectServicesData, ListProjectServicesErrors, ListProjectServicesResponse, ListProjectServicesResponses, ListProjectTemplatesData, ListProjectTemplatesErrors, ListProjectTemplatesResponse, ListProjectTemplatesResponses, ListProjectTemplateTagsData, ListProjectTemplateTagsErrors, ListProjectTemplateTagsResponse, ListProjectTemplateTagsResponses, ListProviderKeysData, ListProviderKeysError, ListProviderKeysErrors, ListProviderKeysResponse, ListProviderKeysResponses, ListProviderZonesData, ListProviderZonesErrors, ListProviderZonesResponse, ListProviderZonesResponses, ListPublicProvidersData, ListPublicProvidersResponse, ListPublicProvidersResponses, ListReleaseFilesData, ListReleaseFilesErrors, ListReleaseFilesResponse, ListReleaseFilesResponses, ListReleasesData, ListReleasesErrors, ListReleasesResponse, ListReleasesResponses, ListRemoteExternalImagesData, ListRemoteExternalImagesErrors, ListRemoteExternalImagesResponse, ListRemoteExternalImagesResponses, ListRepositoriesByConnectionData, ListRepositoriesByConnectionErrors, ListRepositoriesByConnectionResponse, ListRepositoriesByConnectionResponses, ListRepositoriesByProviderData, ListRepositoriesByProviderErrors, ListRepositoriesByProviderResponse, ListRepositoriesByProviderResponses, ListRestoreRunsForServiceData, ListRestoreRunsForServiceResponse, ListRestoreRunsForServiceResponses, ListRootContainersData, ListRootContainersErrors, ListRootContainersResponse, ListRootContainersResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponse, ListRoutesResponses, ListRunsResponse, ListS3SourcesData, ListS3SourcesError, ListS3SourcesErrors, ListS3SourcesResponse, ListS3SourcesResponses, ListSandboxesData, ListSandboxesResponse, ListSandboxesResponse2, ListSandboxesResponses, ListScansQuery, ListScheduleRunJobsData, ListScheduleRunJobsError, ListScheduleRunJobsErrors, ListScheduleRunJobsResponse, ListScheduleRunJobsResponses, ListScheduleRunsData, ListScheduleRunsError, ListScheduleRunsErrors, ListScheduleRunsResponse, ListScheduleRunsResponses, ListScheduleServicesData, ListScheduleServicesError, ListScheduleServicesErrors, ListScheduleServicesResponse, ListScheduleServicesResponses, ListSecretsData, ListSecretsErrors, ListSecretsResponse, ListSecretsResponse2, ListSecretsResponses, ListServiceHealthStatusesData, ListServiceHealthStatusesErrors, ListServiceHealthStatusesResponse, ListServiceHealthStatusesResponses, ListServiceProjectsData, ListServiceProjectsErrors, ListServiceProjectsResponse, ListServiceProjectsResponses, ListServiceSchedulesData, ListServiceSchedulesError, ListServiceSchedulesErrors, ListServiceSchedulesResponse, ListServiceSchedulesResponses, ListServicesData, ListServicesErrors, ListServicesResponse, ListServicesResponses, ListSkillsData, ListSkillsErrors, ListSkillsResponse, ListSkillsResponse2, ListSkillsResponses, ListSourceBackupsData, ListSourceBackupsError, ListSourceBackupsErrors, ListSourceBackupsResponse, ListSourceBackupsResponses, ListSourceFilesData, ListSourceFilesErrors, ListSourceFilesResponse, ListSourceFilesResponses, ListSourceMapsData, ListSourceMapsErrors, ListSourceMapsResponse, ListSourceMapsResponses, ListSourcesData, ListSourcesErrors, ListSourcesResponse, ListSourcesResponses, ListStaticBundlesData, ListStaticBundlesErrors, ListStaticBundlesResponse, ListStaticBundlesResponses, ListSyncedRepositoriesData, ListSyncedRepositoriesErrors, ListSyncedRepositoriesResponse, ListSyncedRepositoriesResponses, ListTagsResponse, ListTeamMembersData, ListTeamMembersErrors, ListTeamMembersResponse, ListTeamMembersResponses, ListTeamProjectsData, ListTeamProjectsErrors, ListTeamProjectsResponse, ListTeamProjectsResponses, ListTeamsData, ListTeamsErrors, ListTeamsResponse, ListTeamsResponses, ListTemplatesQuery, ListTemplatesResponse, ListUsersData, ListUsersErrors, ListUsersResponse, ListUsersResponses, ListVulnerabilitiesQuery, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponse, ListWebhooksResponses, LiveVisitorInfo, LiveVisitorsListResponse, LocationCount, LocationGranularity, LocationInfo, LoginData, LoginErrors, LoginRequest, LoginResponse, LoginResponses, LogLevel, LogoutData, LogoutErrors, LogoutResponses, LogRecord, LogSearchLine, LogSeverity, LogSource, LogsQuery, LogsResponse, LogStream, LookupDnsARecordsData, LookupDnsARecordsError, LookupDnsARecordsErrors, LookupDnsARecordsResponse, LookupDnsARecordsResponses, ManagedDomainResponse, ManualAction, ManualActionTiming, McpDefinitionResponse, MessageContent, MessagePart, MessageResponse, MeteredMode, MetricAggregation, MetricBucket, MetricDataPoint, MetricsOverTimeResponse, MetricsQuery, MetricsRangeQuery, MetricsStatusResponse, MetricsStoreKind, MetricsSummaryResponse, MetricType, MfaRequiredResponse, MfaSetupResponse, MfaVerificationRequest, MigrationStep, MigrationSummary, MintEnrollmentTokenData, MintEnrollmentTokenErrors, MintEnrollmentTokenRequest, MintEnrollmentTokenResponse, MintEnrollmentTokenResponse2, MintEnrollmentTokenResponses, MiscResult, MkdirBody, MkdirData, MkdirErrors, MkdirResponse, MkdirResponses, ModelInfo, ModelListResponse, ModelPricing, ModelUsage, MonitoringSettings, MonitoringSettingsMasked, MonitorResponse, MonitorStatus, MrrBucketResponse, MultiNodeSettings, MultiNodeSettingsMasked, MxResult, NavEntry, NavSection, NetworkConfiguration, NetworkMode, NixpacksPresetConfig, NixpacksProvider, NodeContainerListResponse, NodeContainerResponse, NodeCostInfo, NodeHeartbeatData, NodeHeartbeatErrors, NodeHeartbeatResponse, NodeHeartbeatResponses, NodeInfoResponse, NodeListResponse, NodeMetricsGetRangeData, NodeMetricsGetRangeErrors, NodeMetricsGetRangeResponse, NodeMetricsGetRangeResponses, NotificationPreferencesResponse, NotificationProviderResponse, ObservabilityCompressionSettings, ObservabilityEvent, ObservabilityFullEventData, ObservabilityFullEventError, ObservabilityFullEventErrors, ObservabilityFullEventResponse, ObservabilityFullEventResponses, ObservabilityListEventsData, ObservabilityListEventsError, ObservabilityListEventsErrors, ObservabilityListEventsResponse, ObservabilityListEventsResponses, ObservabilityRetentionSettings, OidcCallbackData, OidcProviderResponse, OidcProvidersListResponse, OidcProviderSummary, OidcProviderUserResponse, OidcRoleMappingResponse, OidcTestConnectionResponse, OnDemandCertAttemptResponse, OnDemandCertRow, OnDemandTlsSettings, OpenAiError, OpenAiErrorResponse, OperatingSystemCount, OperationResultResponse, OperationResultsResponse, OtelDashboardResponse, OtelDashboardsResponse, OtelMetricAlertRuleResponse, OtelMetricAlertsResponse, OtelMetricLabelKeysResponse, OtelMetricLabelValuesResponse, OtelMetricNamesResponse, OtelMetricsResponse, OutlierAlgorithm, OutlierParams, OverprovisioningAssessment, OverprovisioningVerdict, PageActivityBucket, PageCountryStats, PageFlowEntry, PageFlowQuery, PageFlowResponse, PageHourlySessionsQuery, PageHourlySessionsResponse, PagePathDetailQuery, PagePathDetailResponse, PagePathInfo, PagePathSparkline, PagePathSparklinePoint, PagePathsQuery, PagePathsResponse, PagePathsSparklineQuery, PagePathsSparklineResponse, PagePathVisitorsQuery, PagePathVisitorsResponse, PageReferrerStats, PagesComparisonResponse, PageSessionComparison, PageSessionStats, PageSessionStatsQuery, PageTransition, PageVisit, PageVisitorSession, PaginatedEmailsResponse, PaginatedEntitiesResponse, PaginatedErrorEventsResponse, PaginatedErrorGroupsResponse, PaginatedEventsResponse, PaginatedExternalImagesResponse, PaginatedProjectList, PaginatedStaticBundlesResponse, Pagination, PaginationMeta, PaginationParams, PasswordProtectionConfig, PatchAdminGateData, PatchAdminGateErrors, PatchAdminGateResponse, PatchAdminGateResponses, PatchPreviewGatewaySettingsData, PatchPreviewGatewaySettingsResponse, PatchPreviewGatewaySettingsResponses, PatchSettingsRequest, PathVisitors, PathVisitorsAnalyticsQuery, PathVisitorsResponse, PauseDeploymentData, PauseDeploymentErrors, PauseDeploymentResponse, PauseDeploymentResponses, PauseSandboxData, PauseSandboxErrors, PauseSandboxResponse, PauseSandboxResponses, PeerEntry, PeerListResponse, PendingActionResponse, PerformanceMetricsQuery, PerformanceMetricsResponse, PermissionInfo, PgUpgradeLogResponse, PgUpgradeResponse, PipelineStats, PipelineStatsResponse, PlanComplexity, PlanMetadata, PlanRestoreData, PlanRestoreError, PlanRestoreErrors, PlanRestoreResponse, PlanRestoreResponses, PlanSourceBackup, PlanTarget, PlatformInfo, PluginManifest, PortMapping, PostDnsAckData, PostDnsAckErrors, PostDnsAckResponse, PostDnsAckResponses, PostgresWalHealth, PresetConfigSchema, PresetInfo, PresetResponse, PreviewAlertData, PreviewAlertError, PreviewAlertErrors, PreviewAlertResponse, PreviewAlertResponses, PreviewFunnelMetricsData, PreviewFunnelMetricsErrors, PreviewFunnelMetricsResponse, PreviewFunnelMetricsResponses, PreviewGatewaySettings, PreviewGatewaySettingsMasked, PreviewGatewaySettingsResponse, PreviewHostnameModeData, PreviewHostnameModeErrors, PreviewHostnameModeResponse, PreviewHostnameModeResponses, PreviewShareLinkBody, PreviewShareLinkResponse, PricingResponse, ProblemDetails, ProjectAccessResponse, ProjectConfiguration, ProjectDashboardAnalytics, ProjectDsnResponse, ProjectHealthSummary, ProjectInfo, ProjectMonitorHealth, ProjectPresetResponse, ProjectQuery, ProjectRef, ProjectResponse, ProjectSecretEnvironmentInfo, ProjectSecretResponse, ProjectServiceInfo, ProjectsHealthResponse, ProjectsMonitorHealthResponse, ProjectStatisticsResponse, ProjectStatsBreakdown, ProjectType, ProjectUsageInfoResponse, PromoteClusterMemberData, PromoteClusterMemberErrors, PromoteClusterMemberResponses, PromoteDeploymentData, PromoteDeploymentErrors, PromoteDeploymentRequest, PromoteDeploymentResponse, PromoteDeploymentResponses, PropertyBreakdownItem, PropertyBreakdownQuery, PropertyBreakdownResponse, PropertyColumn, PropertyTimelineItem, PropertyTimelineQuery, PropertyTimelineResponse, Protocol, ProviderCatalogDto, ProviderCatalogResponse, ProviderConfig, ProviderConfigMasked, ProviderDeletionCheckResponse, ProviderDescriptor, ProviderKeyResponse, ProviderMetadata, ProviderResponse, ProviderUsage, ProvisionDomainData, ProvisionDomainErrors, ProvisionDomainResponse, ProvisionDomainResponses, ProvisionResponse, ProxyLogResponse, ProxyLogsPaginatedResponse, PublicHostnameStrategy, PublicPresetResponse, PublicRepositoryInfo, PurgeLogsRequest, PurgeProjectLogsData, PurgeProjectLogsError, PurgeProjectLogsErrors, PurgeProjectLogsResponses, PushedExternalImageResponse, PushExternalImageData, PushExternalImageErrors, PushExternalImageResponse, PushExternalImageResponses, PushImageRequest, QueryDataData, QueryDataErrors, QueryDataRequest, QueryDataResponse, QueryDataResponse2, QueryDataResponses, QueryGenaiTracesData, QueryGenaiTracesError, QueryGenaiTracesErrors, QueryGenaiTracesResponse, QueryGenaiTracesResponses, QueryLogsData, QueryLogsError, QueryLogsErrors, QueryLogsResponse, QueryLogsResponses, QueryMetricsData, QueryMetricsError, QueryMetricsErrors, QueryMetricsResponse, QueryMetricsResponses, QueryTracesData, QueryTracesError, QueryTracesErrors, QueryTracesResponse, QueryTracesResponses, QueryTraceSummariesData, QueryTraceSummariesError, QueryTraceSummariesErrors, QueryTraceSummariesResponse, QueryTraceSummariesResponses, QuotaResponse, RateLimitConfig, RateLimitSettings, ReachabilityStatus, ReadFileData, ReadFileErrors, ReadFileResponse, ReadFileResponse2, ReadFileResponses, ReAnalyzeData, ReAnalyzeErrors, ReAnalyzeResponses, RecentActivityQuery, RecentActivityResponse, RecentEventResponse, RecentQueryParams, RecordConsoleEventData, RecordConsoleEventErrors, RecordConsoleEventResponses, RecordEventMetricsData, RecordEventMetricsErrors, RecordEventMetricsResponse, RecordEventMetricsResponses, RecordExposureRequest, RecordExposureResponse, RecordFlagExposureData, RecordFlagExposureErrors, RecordFlagExposureResponse, RecordFlagExposureResponses, RecordListResponse, RecordSpeedMetricsData, RecordSpeedMetricsError, RecordSpeedMetricsErrors, RecordSpeedMetricsResponse, RecordSpeedMetricsResponses, RecoveryTarget, ReferrerCount, ReferrersAnalyticsQuery, RefreshRouteTableData, RefreshRouteTableErrors, RefreshRouteTableResponse, RefreshRouteTableResponses, RegenerateDsnData, RegenerateDsnErrors, RegenerateDsnRequest, RegenerateDsnResponse, RegenerateDsnResponses, RegisterExternalImageData, RegisterExternalImageErrors, RegisterExternalImageResponse, RegisterExternalImageResponses, RegisterImageRequest, RegisterNodeApiRequest, RegisterNodeData, RegisterNodeErrors, RegisterNodeResponse, RegisterNodeResponse2, RegisterNodeResponses, RegisterRequest, ReinstallGitlabWebhookData, ReinstallGitlabWebhookErrors, ReinstallGitlabWebhookResponse, ReinstallGitlabWebhookResponses, ReinstallWebhookResponse, RejectPendingActionData, RejectPendingActionErrors, RejectPendingActionResponse, RejectPendingActionResponses, ReleaseListResponse, ReloadPluginsData, ReloadPluginsErrors, ReloadPluginsResponse, ReloadPluginsResponses, ReloadResponse, RemoteDeploymentResponse, RemoveClusterMemberData, RemoveClusterMemberErrors, RemoveClusterMemberResponse, RemoveClusterMemberResponses, RemoveManagedDomainData, RemoveManagedDomainErrors, RemoveManagedDomainResponse, RemoveManagedDomainResponses, RemoveNodeResponse, RemoveRoleData, RemoveRoleErrors, RemoveRoleResponse, RemoveRoleResponses, RemoveTeamMemberData, RemoveTeamMemberErrors, RemoveTeamMemberResponse, RemoveTeamMemberResponses, RenameConversationData, RenameConversationErrors, RenameConversationRequest, RenameConversationResponse, RenameConversationResponses, RenewDomainData, RenewDomainErrors, RenewDomainResponse, RenewDomainResponses, RepositoryListQuery, RepositoryListResponse, RepositoryPresetResponse, RepositoryResponse, RepositorySyncStartedResponse, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponse, RequestPasswordResetResponses, RequestRow, ResetPasswordData, ResetPasswordErrors, ResetPasswordRequest, ResetPasswordResponse, ResetPasswordResponses, ResetPgStatStatementsRequest, ResetPgStatStatementsResponse, ResizeSandboxBody, ResizeSandboxData, ResizeSandboxErrors, ResizeSandboxResponse, ResizeSandboxResponses, ResolveAlarmData, ResolveAlarmErrors, ResolveAlarmResponses, ResolvedEnvVarResponse, ResolvedEnvVarSource, ResourceCounts, ResourceFootprint, ResourceInfo, ResourceLimitApplyResult, ResourceLimits, ResourceLimitsResponse, ResourceLimitsUpdateResponse, ResourcesBody, RestartContainerData, RestartContainerErrors, RestartContainerResponse, RestartContainerResponses, RestartPreviewGatewayData, RestartPreviewGatewayResponse, RestartPreviewGatewayResponses, RestartSandboxData, RestartSandboxErrors, RestartSandboxResponse, RestartSandboxResponses, RestoreCapabilities, RestoreCapabilitiesResponse, RestoreFlagData, RestoreFlagErrors, RestoreFlagResponse, RestoreFlagResponses, RestorePlan, RestoreRequestMode, RestoreRunView, RestoreUserData, RestoreUserErrors, RestoreUserResponse, RestoreUserResponses, ResumeDeploymentData, ResumeDeploymentErrors, ResumeDeploymentResponse, ResumeDeploymentResponses, ResumeSandboxData, ResumeSandboxErrors, ResumeSandboxResponse, ResumeSandboxResponses, RetentionCleanupFailure, RetentionCleanupReport, RetryClusterData, RetryClusterErrors, RetryClusterRequest, RetryClusterResponse, RetryClusterResponses, RetryDeliveryData, RetryDeliveryErrors, RetryDeliveryResponse, RetryDeliveryResponses, RetryPgUpgradeData, RetryPgUpgradeErrors, RetryPgUpgradeResponse, RetryPgUpgradeResponses, RetryRunData, RetryRunErrors, RetryRunResponse, RetryRunResponses, RevealGlobalMcpConfigData, RevealGlobalMcpConfigErrors, RevealGlobalMcpConfigResponse, RevealGlobalMcpConfigResponses, RevealMcpConfigData, RevealMcpConfigErrors, RevealMcpConfigResponse, RevealMcpConfigResponses, RevealNotificationProviderConfigData, RevealNotificationProviderConfigErrors, RevealNotificationProviderConfigResponse, RevealNotificationProviderConfigResponses, RevealServiceParameterData, RevealServiceParameterErrors, RevealServiceParameterResponse, RevealServiceParameterResponses, RevenueCreateIntegrationData, RevenueCreateIntegrationErrors, RevenueCreateIntegrationResponse, RevenueCreateIntegrationResponses, RevenueDeleteIntegrationData, RevenueDeleteIntegrationResponse, RevenueDeleteIntegrationResponses, RevenueGlobalEventsData, RevenueGlobalEventsResponse, RevenueGlobalEventsResponses, RevenueImportInvoicesCsvData, RevenueImportInvoicesCsvErrors, RevenueImportInvoicesCsvResponse, RevenueImportInvoicesCsvResponses, RevenueImportSubscriptionsCsvData, RevenueImportSubscriptionsCsvErrors, RevenueImportSubscriptionsCsvResponse, RevenueImportSubscriptionsCsvResponses, RevenueListIntegrationsData, RevenueListIntegrationsResponse, RevenueListIntegrationsResponses, RevenueListProvidersData, RevenueListProvidersResponse, RevenueListProvidersResponses, RevenueMetricsCustomersData, RevenueMetricsCustomersResponse, RevenueMetricsCustomersResponses, RevenueMetricsGlobalMrrData, RevenueMetricsGlobalMrrResponse, RevenueMetricsGlobalMrrResponses, RevenueMetricsGlobalSummaryData, RevenueMetricsGlobalSummaryResponse, RevenueMetricsGlobalSummaryResponses, RevenueMetricsMrrData, RevenueMetricsMrrResponse, RevenueMetricsMrrResponses, RevenueMetricsSummaryData, RevenueMetricsSummaryResponse, RevenueMetricsSummaryResponses, RevenueRecentEventsData, RevenueRecentEventsResponse, RevenueRecentEventsResponses, RevenueRotateTokenData, RevenueRotateTokenResponse, RevenueRotateTokenResponses, RevenueRow, RevenueUpdateConfigData, RevenueUpdateConfigErrors, RevenueUpdateConfigResponse, RevenueUpdateConfigResponses, RevenueUpdateSecretData, RevenueUpdateSecretErrors, RevenueUpdateSecretResponse, RevenueUpdateSecretResponses, RevokeDsnData, RevokeDsnErrors, RevokeDsnResponse, RevokeDsnResponses, RevokeEnrollmentTokenData, RevokeEnrollmentTokenErrors, RevokeEnrollmentTokenResponse, RevokeEnrollmentTokenResponses, RevokeJoinTokenData, RevokeJoinTokenErrors, RevokeJoinTokenResponse, RevokeJoinTokenResponses, RevokeProjectAccessData, RevokeProjectAccessErrors, RevokeProjectAccessResponse, RevokeProjectAccessResponses, RiskLevel, RoleInfo, RollbackPgUpgradeData, RollbackPgUpgradeErrors, RollbackPgUpgradeResponse, RollbackPgUpgradeResponses, RollbackToDeploymentData, RollbackToDeploymentErrors, RollbackToDeploymentResponse, RollbackToDeploymentResponses, RootfsCacheEntry, RootfsGcData, RootfsGcReport, RootfsGcResponses, RootfsReport, RootfsReportData, RootfsReportResponses, RootfsVmEntry, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponse, RotateApiKeyResponses, RotateDeploymentTokenData, RotateDeploymentTokenErrors, RotateDeploymentTokenResponse, RotateDeploymentTokenResponses, RouteRefreshResponse, RouteResponse, RouteRole, RouteUser, RouteUserWithRoles, RunBackupForSourceData, RunBackupForSourceError, RunBackupForSourceErrors, RunBackupForSourceResponse, RunBackupForSourceResponses, RunBackupRequest, RunConnectionHealthCheckData, RunConnectionHealthCheckErrors, RunConnectionHealthCheckResponse, RunConnectionHealthCheckResponses, RunExternalServiceBackupData, RunExternalServiceBackupError, RunExternalServiceBackupErrors, RunExternalServiceBackupRequest, RunExternalServiceBackupResponse, RunExternalServiceBackupResponses, RunScheduleNowData, RunScheduleNowError, RunScheduleNowErrors, RunScheduleNowResponse, RunScheduleNowResponses, S3ConnectionTestResponse, S3CredentialsResponse, S3SourceResponse, S3SourceResponseWritable, SandboxCreatePreviewLinkData, SandboxCreatePreviewLinkErrors, SandboxCreatePreviewLinkResponse, SandboxCreatePreviewLinkResponses, SandboxDomainResponse, SandboxEvent, SandboxEventsResponse, SandboxInner, SandboxResponse, SandboxRoute, SandboxStatusResponse, SaveAgentTokenData, SaveAgentTokenErrors, SaveAgentTokenRequest, SaveAgentTokenResponse, SaveAgentTokenResponse2, SaveAgentTokenResponses, SaveAiProviderCredentialData, SaveAiProviderCredentialErrors, SaveAiProviderCredentialResponse, SaveAiProviderCredentialResponses, SaveCredentialRequest, SaveCredentialResponse, ScalewayCredentialsRequest, ScanResponse, ScheduleRunEntry, ScheduleRunJobEntry, ScheduleRunListResponse, ScheduleRunResponse, ScheduleRunSummary, ScheduleRunSummaryList, ScreenshotSettings, SearchLogsData, SearchLogsError, SearchLogsErrors, SearchLogsRequest, SearchLogsResponse, SearchLogsResponse2, SearchLogsResponses, SearchMode, Seasonality, SecretResponse, SecurityConfig, SecurityHeadersConfig, SecurityHeadersSettings, SendEmailData, SendEmailErrors, SendEmailRequestBody, SendEmailResponse, SendEmailResponseBody, SendEmailResponses, SendMessageRequest, SensitiveConfigValueResponse, SensitiveMcpConfigValueResponse, SensitiveValueResponse, SentryChunkUploadResponse, SentryCreateReleaseRequest, SentryEventRequest, SentryEventResponse, SentryReleaseFileResponse, SentryReleaseProjectRef, SentryReleaseResponse, SeriesStateEntry, ServiceAccessInfo, ServiceAction, ServiceAlertRuleResponse, ServiceBackupEntryResponse, ServiceBackupListResponse, ServiceCreateAlertRuleRequest, ServiceHealthResponse, ServiceHealthStatusBatchResponse, ServiceHealthStatusEntryResponse, ServiceMemberInfo, ServiceParameter, ServicePlan, ServiceResourceLimits, ServiceRuntimeReport, ServiceStatsReport, ServiceTypeInfo, ServiceTypeRoute, ServiceUpdateAlertRuleRequest, SesCredentialsRequest, SessionDetails, SessionDetailsQuery, SessionEvent, SessionEventDto, SessionEventsQuery, SessionEventsResponse, SessionLogsQuery, SessionLogsResponse, SessionReplayEventsRequest, SessionReplayInfoDto, SessionReplayInitRequest, SessionReplayInitResponse, SessionReplayWithEventsDto, SessionReplayWithVisitorDto, SessionRequestLog, SessionSummary, SetDefaultS3SourceData, SetDefaultS3SourceError, SetDefaultS3SourceErrors, SetDefaultS3SourceResponse, SetDefaultS3SourceResponses, SetFlagEnvironmentData, SetFlagEnvironmentErrors, SetFlagEnvironmentRequest, SetFlagEnvironmentResponse, SetFlagEnvironmentResponses, SetPreviewPasswordBody, SetPreviewPasswordData, SetPreviewPasswordErrors, SetPreviewPasswordResponse, SetPreviewPasswordResponse2, SetPreviewPasswordResponses, SetRequest, SetResponse, SettingsUpdateResponse, SetupDnsChallengeData, SetupDnsChallengeErrors, SetupDnsChallengeRequest, SetupDnsChallengeResponse, SetupDnsChallengeResponse2, SetupDnsChallengeResponses, SetupDnsData, SetupDnsErrors, SetupDnsRequest, SetupDnsResponse, SetupDnsResponse2, SetupDnsResponses, SetupEmailTrackingData, SetupEmailTrackingErrors, SetupEmailTrackingResponse, SetupEmailTrackingResponses, SetupMfaData, SetupMfaErrors, SetupMfaResponse, SetupMfaResponses, SiblingRef, SkillDefinitionResponse, SlackConfig, SleepEnvironmentData, SleepEnvironmentErrors, SleepEnvironmentResponse, SleepEnvironmentResponses, SlowQueriesResponse, SlowQueryRow, SmartFilter, SmokeTestAgentData, SmokeTestAgentErrors, SmokeTestAgentResponse, SmokeTestAgentResponses, SmokeTestResponse, SmtpCredentialsRequest, SmtpEncryptionRoute, SmtpResult, SourceArchiveUpload, SourceBackupEntry, SourceBackupIndexResponse, SourceBody, SourceFileListResponse, SourceFileResponse, SourceMapListResponse, SourceMapResponse, SourceSandboxData, SourceSandboxErrors, SourceSandboxResponse, SourceSandboxResponses, SourceType, SpanEvent, SpanKind, SpanRecord, SpanRow, SpanStatusCode, SpeedMetricsPayload, SpeedSegmentFilters, StaleSlot, StartAnalysisData, StartAnalysisErrors, StartAnalysisRequest, StartAnalysisResponse, StartAnalysisResponses, StartContainerData, StartContainerErrors, StartContainerResponse, StartContainerResponses, StartFixData, StartFixErrors, StartFixResponses, StartGitProviderOauthData, StartGitProviderOauthErrors, StartOidcLoginBySlugData, StartOidcLoginBySlugErrors, StartPgUpgradeData, StartPgUpgradeErrors, StartPgUpgradeRequest, StartPgUpgradeResponse, StartPgUpgradeResponses, StartRestoreData, StartRestoreError, StartRestoreErrors, StartRestoreRequest, StartRestoreResponse, StartRestoreResponses, StartServiceData, StartServiceErrors, StartServiceResponse, StartServiceResponses, StaticBundleResponse, StaticParams, StaticPresetConfig, StatPathData, StatPathErrors, StatPathResponse, StatPathResponses, StatResponse, StatsFilters, StatusBucket, StatusBucketedResponse, StatusCodeCount, StatusCodesQuery, StatusPageOverview, StepConversionResponse, StepResourceType, StepResult, StepUpResponse, StopContainerData, StopContainerErrors, StopContainerResponse, StopContainerResponses, StopSandboxData, StopSandboxErrors, StopSandboxResponse, StopSandboxResponses, StopSequence, StopServiceData, StopServiceErrors, StopServiceResponse, StopServiceResponses, StorageQuota, StreamContainerMetricsData, StreamContainerMetricsErrors, StreamContainerMetricsResponses, StreamEventsData, StreamEventsErrors, StreamEventsResponses, StreamRunEventsData, StreamRunEventsErrors, StreamRunEventsResponses, StripeConfig, SyncedRepositoryListQuery, SyncRepositoriesData, SyncRepositoriesErrors, SyncRepositoriesResponse, SyncRepositoriesResponses, SyntaxResult, TagInfo, TagListResponse, TailDeploymentJobLogsData, TailDeploymentJobLogsErrors, TailLogsData, TailLogsError, TailLogsErrors, TailLogsRequest, TailLogsResponses, TargetRecommendation, TeamListResponse, TeamMemberResponse, TeamResponse, TeamRole, TeardownDeploymentData, TeardownDeploymentErrors, TeardownDeploymentResponse, TeardownDeploymentResponses, TeardownEnvironmentData, TeardownEnvironmentErrors, TeardownEnvironmentResponse, TeardownEnvironmentResponses, TemplateResponse, TestEmailRequest, TestEmailResponse, TestNotificationProviderData, TestNotificationProviderErrors, TestNotificationProviderResponse, TestNotificationProviderResponses, TestOidcProviderData, TestOidcProviderResponse, TestOidcProviderResponses, TestProviderConnectionData, TestProviderConnectionErrors, TestProviderConnectionResponse, TestProviderConnectionResponses, TestProviderData, TestProviderErrors, TestProviderKeyByIdData, TestProviderKeyByIdError, TestProviderKeyByIdErrors, TestProviderKeyByIdResponse, TestProviderKeyByIdResponses, TestProviderKeyInlineData, TestProviderKeyInlineError, TestProviderKeyInlineErrors, TestProviderKeyInlineResponse, TestProviderKeyInlineResponses, TestProviderKeyRequest, TestProviderKeyResponse, TestProviderResponse, TestProviderResponse2, TestProviderResponses, TestS3ConnectionPreviewData, TestS3ConnectionPreviewError, TestS3ConnectionPreviewErrors, TestS3ConnectionPreviewResponse, TestS3ConnectionPreviewResponses, TestS3SourceConnectionData, TestS3SourceConnectionError, TestS3SourceConnectionErrors, TestS3SourceConnectionResponse, TestS3SourceConnectionResponses, TimeBucketStats, TimeBucketStatsResponse, TimeseriesBucket, TimeseriesQueryParams, TlsMode, TodayStatsResponse, ToggleDeploymentMetricsRequest, ToggleServiceMetricsRequest, TokenRenewalRequest, ToolCallEvent, ToolInfo, ToolResultEvent, TopModelsQueryParams, TraceProjectRef, TracesResponse, TraceSummariesResponse, TraceSummary, TrackClickData, TrackClickErrors, TrackedLinkResponse, TrackingEventResponse, TrackOpenData, TrackOpenErrors, TrackOpenResponses, TriggerAgentData, TriggerAgentErrors, TriggerAgentRequest, TriggerAgentResponse, TriggerAgentResponses, TriggerDigestResponse, TriggerPipelinePayload, TriggerPipelineResponse, TriggerProjectPipelineData, TriggerProjectPipelineErrors, TriggerProjectPipelineResponse, TriggerProjectPipelineResponses, TriggerScanData, TriggerScanError, TriggerScanErrors, TriggerScanRequest, TriggerScanResponse, TriggerScanResponse2, TriggerScanResponses, TriggerServiceHealthCheckData, TriggerServiceHealthCheckErrors, TriggerServiceHealthCheckResponse, TriggerServiceHealthCheckResponses, TriggerWeeklyDigestData, TriggerWeeklyDigestErrors, TriggerWeeklyDigestResponse, TriggerWeeklyDigestResponses, TtlRequest, TtlResponse, TxtRecord, UiManifest, UiRoute, UndrainNodeResponse, UnifiedTrace, UniqueCountsQuery, UniqueCountsResponse, UnlinkServiceFromProjectData, UnlinkServiceFromProjectErrors, UnlinkServiceFromProjectResponse, UnlinkServiceFromProjectResponses, UnsupportedFeature, UpdateAdminGateRequest, UpdateAgentData, UpdateAgentErrors, UpdateAgentResponse, UpdateAgentResponses, UpdateAiProviderData, UpdateAiProviderErrors, UpdateAiProviderRequest, UpdateAiProviderResponse, UpdateAiProviderResponse2, UpdateAiProviderResponses, UpdateAlertData, UpdateAlertError, UpdateAlertErrors, UpdateAlertResponse, UpdateAlertResponses, UpdateAlertRuleData, UpdateAlertRuleErrors, UpdateAlertRuleRequest, UpdateAlertRuleResponse, UpdateAlertRuleResponses, UpdateApiKeyData, UpdateApiKeyErrors, UpdateApiKeyRequest, UpdateApiKeyResponse, UpdateApiKeyResponses, UpdateAutomaticDeployData, UpdateAutomaticDeployErrors, UpdateAutomaticDeployRequest, UpdateAutomaticDeployResponse, UpdateAutomaticDeployResponses, UpdateBackupScheduleData, UpdateBackupScheduleError, UpdateBackupScheduleErrors, UpdateBackupScheduleRequest, UpdateBackupScheduleResponse, UpdateBackupScheduleResponses, UpdateBlobRequest, UpdateBlobResponse, UpdateCloudflareProviderData, UpdateCloudflareProviderErrors, UpdateCloudflareProviderRequest, UpdateCloudflareProviderResponse, UpdateCloudflareProviderResponses, UpdateConfigBody, UpdateConnectionTokenData, UpdateConnectionTokenErrors, UpdateConnectionTokenResponse, UpdateConnectionTokenResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainRequest, UpdateCustomDomainResponse, UpdateCustomDomainResponses, UpdateDashboardData, UpdateDashboardError, UpdateDashboardErrors, UpdateDashboardRequest, UpdateDashboardResponse, UpdateDashboardResponses, UpdateDeploymentConfigRequest, UpdateDeploymentTokenData, UpdateDeploymentTokenErrors, UpdateDeploymentTokenRequest, UpdateDeploymentTokenResponse, UpdateDeploymentTokenResponses, UpdateDnsProviderRequest, UpdateEmailProviderData, UpdateEmailProviderErrors, UpdateEmailProviderRequest, UpdateEmailProviderResponse, UpdateEmailProviderResponses, UpdateEnvironmentSettingsData, UpdateEnvironmentSettingsErrors, UpdateEnvironmentSettingsRequest, UpdateEnvironmentSettingsResponse, UpdateEnvironmentSettingsResponses, UpdateEnvironmentSubdomainData, UpdateEnvironmentSubdomainErrors, UpdateEnvironmentSubdomainRequest, UpdateEnvironmentSubdomainResponse, UpdateEnvironmentSubdomainResponses, UpdateEnvironmentVariableData, UpdateEnvironmentVariableErrors, UpdateEnvironmentVariableRequest, UpdateEnvironmentVariableResponse, UpdateEnvironmentVariableResponses, UpdateErrorGroupData, UpdateErrorGroupErrors, UpdateErrorGroupRequest, UpdateErrorGroupResponses, UpdateExternalServiceRequest, UpdateFlagData, UpdateFlagErrors, UpdateFlagRequest, UpdateFlagResponse, UpdateFlagResponses, UpdateFunnelData, UpdateFunnelErrors, UpdateFunnelResponses, UpdateGitProviderCredentialsData, UpdateGitProviderCredentialsErrors, UpdateGitProviderCredentialsResponse, UpdateGitProviderCredentialsResponses, UpdateGitSettingsData, UpdateGitSettingsErrors, UpdateGitSettingsRequest, UpdateGitSettingsResponse, UpdateGitSettingsResponses, UpdateGlobalMcpData, UpdateGlobalMcpErrors, UpdateGlobalMcpResponse, UpdateGlobalMcpResponses, UpdateGlobalSkillData, UpdateGlobalSkillErrors, UpdateGlobalSkillResponse, UpdateGlobalSkillResponses, UpdateIncidentStatusData, UpdateIncidentStatusErrors, UpdateIncidentStatusRequest, UpdateIncidentStatusResponse, UpdateIncidentStatusResponses, UpdateIpAccessControlData, UpdateIpAccessControlError, UpdateIpAccessControlErrors, UpdateIpAccessControlRequest, UpdateIpAccessControlResponse, UpdateIpAccessControlResponses, UpdateKvRequest, UpdateKvResponse, UpdateManagedDomainApiRequest, UpdateManagedDomainData, UpdateManagedDomainErrors, UpdateManagedDomainResponse, UpdateManagedDomainResponses, UpdateMcpData, UpdateMcpErrors, UpdateMcpRequest, UpdateMcpResponse, UpdateMcpResponses, UpdateMemberRoleRequest, UpdateMetricAlertRequest, UpdateNotificationEmailProviderData, UpdateNotificationEmailProviderErrors, UpdateNotificationEmailProviderRequest, UpdateNotificationEmailProviderResponse, UpdateNotificationEmailProviderResponses, UpdateNotificationProviderData, UpdateNotificationProviderErrors, UpdateNotificationProviderResponse, UpdateNotificationProviderResponses, UpdateOidcProviderData, UpdateOidcProviderRequest, UpdateOidcProviderResponse, UpdateOidcProviderResponses, UpdatePreferencesData, UpdatePreferencesErrors, UpdatePreferencesRequest, UpdatePreferencesResponse, UpdatePreferencesResponses, UpdateProjectData, UpdateProjectDeploymentConfigData, UpdateProjectDeploymentConfigErrors, UpdateProjectDeploymentConfigResponse, UpdateProjectDeploymentConfigResponses, UpdateProjectErrors, UpdateProjectResponse, UpdateProjectResponses, UpdateProjectSecretData, UpdateProjectSecretErrors, UpdateProjectSecretRequest, UpdateProjectSecretResponse, UpdateProjectSecretResponses, UpdateProjectSettingsData, UpdateProjectSettingsErrors, UpdateProjectSettingsRequest, UpdateProjectSettingsResponse, UpdateProjectSettingsResponses, UpdateProviderCredentialsRequest, UpdateProviderData, UpdateProviderErrors, UpdateProviderKeyData, UpdateProviderKeyError, UpdateProviderKeyErrors, UpdateProviderKeyRequest, UpdateProviderKeyResponse, UpdateProviderKeyResponses, UpdateProviderRequest, UpdateProviderResponse, UpdateProviderResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteRequest, UpdateRouteResponse, UpdateRouteResponses, UpdateS3SourceData, UpdateS3SourceError, UpdateS3SourceErrors, UpdateS3SourceRequest, UpdateS3SourceResponse, UpdateS3SourceResponses, UpdateSecretBody, UpdateSelfData, UpdateSelfErrors, UpdateSelfRequest, UpdateSelfResponse, UpdateSelfResponses, UpdateServiceData, UpdateServiceErrors, UpdateServiceResourcesData, UpdateServiceResourcesErrors, UpdateServiceResourcesResponse, UpdateServiceResourcesResponses, UpdateServiceResponse, UpdateServiceResponses, UpdateSessionDurationData, UpdateSessionDurationError, UpdateSessionDurationErrors, UpdateSessionDurationRequest, UpdateSessionDurationResponse, UpdateSessionDurationResponse2, UpdateSessionDurationResponses, UpdateSettingsData, UpdateSettingsErrors, UpdateSettingsResponse, UpdateSettingsResponses, UpdateSkillData, UpdateSkillErrors, UpdateSkillRequest, UpdateSkillResponse, UpdateSkillResponses, UpdateSlackProviderData, UpdateSlackProviderErrors, UpdateSlackProviderRequest, UpdateSlackProviderResponse, UpdateSlackProviderResponses, UpdateSpeedMetricsData, UpdateSpeedMetricsError, UpdateSpeedMetricsErrors, UpdateSpeedMetricsPayload, UpdateSpeedMetricsResponse, UpdateSpeedMetricsResponses, UpdateStatusResponse, UpdateTeamData, UpdateTeamErrors, UpdateTeamMemberRoleData, UpdateTeamMemberRoleErrors, UpdateTeamMemberRoleResponse, UpdateTeamMemberRoleResponses, UpdateTeamRequest, UpdateTeamResponse, UpdateTeamResponses, UpdateTokenRequest, UpdateTokenResponse, UpdateUserData, UpdateUserErrors, UpdateUserRequest, UpdateUserResponse, UpdateUserResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookProviderData, UpdateWebhookProviderErrors, UpdateWebhookProviderRequest, UpdateWebhookProviderResponse, UpdateWebhookProviderResponses, UpdateWebhookRequestBody, UpdateWebhookResponse, UpdateWebhookResponses, UpgradeExternalServiceRequest, UpgradePreviewGatewayData, UpgradePreviewGatewayResponse, UpgradePreviewGatewayResponses, UpgradeRequest, UpgradeServiceData, UpgradeServiceErrors, UpgradeServiceResponse, UpgradeServiceResponses, UploadGlobalSkillData, UploadGlobalSkillErrors, UploadGlobalSkillResponse, UploadGlobalSkillResponses, UploadReleaseFileData, UploadReleaseFileErrors, UploadReleaseFileResponse, UploadReleaseFileResponses, UploadSkillData, UploadSkillErrors, UploadSkillResponse, UploadSkillResponses, UploadSourceFileData, UploadSourceFileErrors, UploadSourceFileResponse, UploadSourceFileResponses, UploadSourceMapData, UploadSourceMapErrors, UploadSourceMapResponse, UploadSourceMapResponses, UploadStaticBundleData, UploadStaticBundleErrors, UploadStaticBundleResponse, UploadStaticBundleResponses, UpsertAgentRequest, UpsertSecretData, UpsertSecretErrors, UpsertSecretRequest, UpsertSecretResponse, UpsertSecretResponses, UptimeDataPoint, UptimeHistoryResponse, UsageFilter, UsageInfo, UsageLogEntry, UsageLogPage, UsageQueryParams, UsageSource, UsageSummary, UserResponse, ValidateConnectionData, ValidateConnectionErrors, ValidateConnectionResponse, ValidateConnectionResponses, ValidateEmailData, ValidateEmailErrors, ValidateEmailRequest, ValidateEmailResponse, ValidateEmailResponse2, ValidateEmailResponses, ValidationLevel, ValidationReport, ValidationResponse, ValidationResult, ValidationStatus, ValidationSummary, VerifyAndEnableMfaData, VerifyAndEnableMfaErrors, VerifyAndEnableMfaResponse, VerifyAndEnableMfaResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponse, VerifyDomainResponses, VerifyEmailData, VerifyEmailErrors, VerifyEmailResponse, VerifyEmailResponses, VerifyManagedDomainData, VerifyManagedDomainErrors, VerifyManagedDomainResponse, VerifyManagedDomainResponses, VerifyMfaChallengeData, VerifyMfaChallengeErrors, VerifyMfaChallengeResponse, VerifyMfaChallengeResponses, VerifyMfaRequest, VerifyStepUpData, VerifyStepUpErrors, VerifyStepUpRequest, VerifyStepUpResponse, VerifyStepUpResponses, ViewItem, ViewsOverTime, ViewsOverTimeQuery, VisitorDetails, VisitorFacets, VisitorFacetsQuery, VisitorFacetValue, VisitorInfo, VisitorJourneyQuery, VisitorJourneyResponse, VisitorLocationsQuery, VisitorRecord, VisitorSegmentFilters, VisitorSessionsQuery, VisitorSessionsResponse, VisitorsListQuery, VisitorsResponse, VisitorStats, VisitorWithGeolocation, VolumeMount, VolumeType, VulnerabilityResponse, WakeEnvironmentData, WakeEnvironmentErrors, WakeEnvironmentResponse, WakeEnvironmentResponses, WalWarning, WalWarningSeverity, WebhookConfig, WebhookDeliveryResponse, WebhookResponse, WebhookTriggerData, WebhookTriggerErrors, WebhookTriggerRequest, WebhookTriggerResponse, WebhookTriggerResponse2, WebhookTriggerResponses, WorkflowDryRunData, WorkflowDryRunErrors, WorkflowDryRunRequest, WorkflowDryRunResponse, WorkflowDryRunResponses, WorkloadDescriptor, WorkloadId, WorkloadStatus, WorkloadType, WriteFileBody, WriteFileData, WriteFileErrors, WriteFileResponse, WriteFileResponses, WriteFilesBody, WriteFilesData, WriteFilesErrors, WriteFilesResponse, WriteFilesResponse2, WriteFilesResponses, ZoneListResponse } from './types.gen'; +export { acknowledgeAlarm, activateAiProvider, activateApiKey, activateConnection, activateProvider, addClusterMember, addContext, addEnvironmentDomain, addEvents, addManagedDomain, addSessionReplayEvents, addTeamMember, adminDrainNode, adminDrainStatus, adminGetNode, adminListNodeContainers, adminListNodes, adminRemoveNode, adminUndrainNode, applyHostnameMode, archiveConversation, archiveFlag, assignRole, attachScheduleServices, blobCopy, blobDelete, blobDisable, blobDownload, blobEnable, blobHead, blobList, blobPut, blobStatus, blobUpdate, cancel, cancelBackup, cancelDeployment, cancelDomainOrder, cancelPgUpgrade, cancelRun, cancelScheduleRun, changePasswordSelf, changeProjectSource, changeRequiredPassword, chatCompletions, checkAnalyticsHasEvents, checkCommitExists, checkDomainStatus, checkExplorerSupport, checkIpBlocked, checkProviderDeletionSafety, chunkUploadOptions, cleanupExpiredBackups, clearPreviewPassword, cliDeviceApprove, cliDeviceDeny, cliDeviceLookup, cliDevicePoll, cliDeviceStart, cliLogout, cmd, cmdKill, cmdLogs, confirmPendingAction, containerMetricsGetHistory, createAgent, createAlert, createAlertRule, createApiKey, createBackupSchedule, createBitbucketProvider, createCloudflareProvider, createConversation, createCustomDomain, createDashboard, createDeploymentToken, createDnsProvider, createDomain, createDsn, createEmailDomain, createEmailProvider, createEnvironment, createEnvironmentVariable, createFlag, createFunnel, createGenericProvider, createGiteaPatProvider, createGithubPatProvider, createGitlabOauthProvider, createGitlabPatProvider, createGitProvider, createGlobalMcp, createGlobalSkill, createIncident, createIpAccessControl, createMcp, createMonitor, createNotificationEmailProvider, createNotificationProvider, createOidcProvider, createOidcRoleMapping, createOrRecreateOrder, createPlan, createPr, createProject, createProjectFromTemplate, createProjectRelease, createProjectSecret, createProviderKey, createRelease, createRoute, createS3Source, createSandbox, createService, createSkill, createSlackProvider, createTeam, createUser, createWebhook, createWebhookProvider, deactivateApiKey, deactivateConnection, deactivateProvider, deleteAgent, deleteAlert, deleteAlertRule, deleteApiKey, deleteBackup, deleteBackupSchedule, deleteConnection, deleteCustomDomain, deleteDashboard, deleteDeploymentToken, deleteDnsProvider, deleteDomain, deleteEmailDomain, deleteEmailProvider, deleteEnvironment, deleteEnvironmentDomain, deleteEnvironmentVariable, deleteExternalImage, deleteFunnel, deleteGitProvider, deleteGlobalMcp, deleteGlobalSkill, deleteIpAccessControl, deleteMcp, deleteMonitor, deleteNotificationProvider, deleteOidcProvider, deleteOidcRoleMapping, deletePreferences, deleteProject, deleteProjectSecret, deleteProviderKey, deleteProviderSafely, deleteReleaseSourceFiles, deleteReleaseSourceMaps, deleteRoute, deleteS3Source, deleteScan, deleteSecret, deleteService, deleteSessionReplay, deleteSkill, deleteSourceMap, deleteStaticBundle, deleteTeam, deleteUser, deleteWebhook, deployFromImage, deployFromImageUpload, deployFromStatic, deployFromUploadedSource, deploymentMetricsGetLatest, deploymentMetricsGetRange, deploymentMetricsToggle, destroySandbox, detachScheduleService, detectPublicPresets, disableBackupSchedule, disableMfa, discoverWorkloads, domain, downloadGlobalSkillArchive, downloadObject, downloadSkillArchive, emailStatus, embeddings, enableBackupSchedule, enrichVisitor, exec, execDetached, executeDeploymentOperation, executeImport, extendTimeout, externalServiceEnablePgStatStatements, externalServiceMetricsByDatabase, externalServiceMetricsCreateAlertRule, externalServiceMetricsDeleteAlertRule, externalServiceMetricsGetAlertRules, externalServiceMetricsGetLatest, externalServiceMetricsGetRange, externalServiceMetricsStatus, externalServiceMetricsToggle, externalServiceMetricsUpdateAlertRule, externalServiceResetPgStatStatements, finalizeOrder, finalizeProjectRelease, findConversation, generateJoinToken, generatePresetDockerfile, getAccessInfo, getActiveVisitors, getActivityGraph, getAdminGate, getAgent, getAggregatedBuckets, getAiAgentBreakdown, getAiAgentPages, getAiAgentTimeline, getAiPageBreakdown, getAiStatusBreakdown, getAlert, getAlertRule, getAllRepositoriesByName, getAnalyticsActiveVisitors, getAnalyticsEventsCount, getAnalyticsSessionEvents, getAnalyticsVisitorSessions, getApiKey, getApiKeyPermissions, getAuditLog, getBackup, getBackupSchedule, getBranchesByRepositoryId, getBucketedIncidents, getBucketedStatus, getChallengeToken, getChatReadiness, getCliStatus, getClusterHealth, getClusterMember, getCmd, getContainerDetail, getContainerEnvironmentVariable, getContainerInfo, getContainerLogs, getContainerLogsById, getContainerMetrics, getConversation, getConversationDetail, getConversations, getCronById, getCronExecutions, getCrossProjectTraceSiblings, getCurrentMonitorStatus, getCurrentUser, getCustomDomain, getDashboard, getDashboardProjectsAnalytics, getDelivery, getDeployment, getDeploymentContainerLogContent, getDeploymentJobLogs, getDeploymentJobs, getDeploymentOperations, getDeploymentOperationStatus, getDeploymentToken, getDiskStatus, getDnsChanges, getDnsProvider, getDomain, getDomainByHost, getDomainById, getDomainByName, getDomainDnsRecords, getDomainOrder, getEmail, getEmailEvents, getEmailLinks, getEmailProvider, getEmailStats, getEmailTracking, getEmailTrackingStatus, getEntityInfo, getEnvironment, getEnvironmentCrons, getEnvironmentDomains, getEnvironments, getEnvironmentVariables, getEnvironmentVariableValue, getErrorDashboardStats, getErrorEvent, getErrorGroup, getErrorStats, getErrorTimeSeries, getEventDetail, getEventEntries, getEventsCount, getEventsTimeline, getEventTypeBreakdown, getEventVisitors, getExternalImage, getFile, getFlag, getFlagSnapshot, getFunnelMetrics, getGenaiTrace, getGeneralStats, getGitProvider, getGlobalEvents, getGlobalEventStats, getGlobalMcp, getGlobalSandboxStatus, getGlobalSkill, getGroupedPageMetrics, getHealth, getHourlyVisits, getHttpChallengeDebug, getImportStatus, getIncident, getIncidentUpdates, getIpAccessControl, getIpGeolocation, getJoinTokenStatus, getLastDeployment, getLatestScan, getLatestScansPerEnvironment, getLiveVisitorsList, getLogContext, getMcp, getMetricsOverTime, getMonitor, getNotificationProvider, getOnDemandCertStatus, getOrCreateDsn, getPageFlow, getPageHourlySessions, getPagePathDetail, getPagePaths, getPagePathsSparklines, getPagePathVisitors, getPendingAction, getPerformanceMetrics, getPgUpgrade, getPgUpgradeLogs, getPipelineStats, getPlatformInfo, getPostgresWalHealth, getPreferences, getPreviewGatewayLogs, getPreviewGatewaySettings, getPreviewGatewayStatus, getPricing, getPrivateIp, getProject, getProjectAlarmsSummary, getProjectBySlug, getProjectDeployments, getProjects, getProjectServiceEnvironmentVariables, getProjectSessionReplays, getProjectsHealth, getProjectsMonitorHealth, getProjectStatistics, getProjectTemplate, getPropertyBreakdown, getPropertyTimeline, getProviderConnections, getProviderMetadata, getProvidersMetadata, getProxyLogById, getProxyLogByRequestId, getProxyLogs, getPublicBranches, getPublicIp, getPublicRepository, getQuota, getRecentActivity, getRemoteExternalImage, getRepositoryBranches, getRepositoryById, getRepositoryByName, getRepositoryPresetByName, getRepositoryPresetLive, getRepositoryTags, getResolvedEnvironmentVariables, getResolvedEnvironmentVariableValue, getRestoreCapabilities, getRestoreRun, getRoute, getRun, getRunWithLogs, getS3Credentials, getS3Source, getSandbox, getSandboxStatus, getScan, getScanByDeployment, getScanVulnerabilities, getService, getServiceBySlug, getServiceEnvironmentVariable, getServiceEnvironmentVariables, getServiceHealthStatus, getServicePreviewEnvironmentVariableNames, getServicePreviewEnvironmentVariablesMasked, getServiceRuntime, getServiceStats, getServiceTypeParameters, getServiceTypes, getSessionDetails, getSessionEvents, getSessionLogs, getSessionReplay, getSessionReplayEvents, getSettings, getSkill, getSlowQueries, getStaticBundle, getStatusOverview, getTagsByRepositoryId, getTeam, getTimeBucketStats, getTodayStats, getTrace, getUnifiedTrace, getUniqueCounts, getUniqueEvents, getUpdateStatus, getUptimeHistory, getUsageByProvider, getUsageRecent, getUsageSummary, getUsageTimeseries, getUsageTopModels, getVisitorByGuid, getVisitorById, getVisitorDetails, getVisitorFacets, getVisitorInfo, getVisitorJourney, getVisitors, getVisitorSessions, getVisitorStats, getWebhook, grantProjectAccess, handleGitProviderOauthCallback, hasAnalyticsEvents, hasErrorGroups, hasPerformanceMetrics, importExternalService, ingestLogs, ingestLogsByPath, ingestMetrics, ingestMetricsByPath, ingestSentryEnvelope, ingestSentryEvent, ingestTraces, ingestTracesByPath, initSessionReplay, inspectDropArchive, jobLogs, jobStatus, killJob, kvDel, kvDisable, kvEnable, kvExpire, kvGet, kvIncr, kvKeys, kvSet, kvStatus, kvTtl, kvUpdate, latestRunForSource, linkCustomDomainToCertificate, linkServiceToProject, listAgentRuns, listAgents, listAiProviders, listAlertRules, listAlerts, listAllConversations, listAllRuns, listApiKeys, listAuditLogs, listAvailableContainers, listBackupAlerts, listBackupChildren, listBackupSchedules, listBackupsForSchedule, listCommitsByRepositoryId, listConnections, listContainers, listContainersAtPath, listConversations, listCustomDomainsForProject, listDashboards, listDeliveries, listDeploymentContainerLogs, listDeploymentTokens, listDnsProviders, listDomains, listDsns, listEmailDomains, listEmailProviders, listEmails, listEnrollmentTokens, listEntities, listErrorEvents, listErrorGroups, listEvents, listEventTypes, listExternalImages, listExternalPlugins, listExternalServiceBackups, listFlags, listFunnels, listGitProviders, listGlobalMcps, listGlobalSkills, listIncidents, listInsights, listIpAccessControl, listJobs, listKnownAiAgents, listManagedDomains, listMcps, listMetricLabelKeys, listMetricLabelValues, listMetricNames, listModels, listMonitors, listNotificationProviders, listOidcProviders, listOidcProviderUsers, listOidcRoleMappings, listOnDemandCerts, listOrders, listPeers, listPendingActions, listPgUpgrades, listPresets, listProjectAccess, listProjectAlarms, listProjectScans, listProjectSecrets, listProjectServices, listProjectTemplates, listProjectTemplateTags, listProviderKeys, listProviderZones, listPublicProviders, listReleaseFiles, listReleases, listRemoteExternalImages, listRepositoriesByConnection, listRepositoriesByProvider, listRestoreRunsForService, listRootContainers, listRoutes, listS3Sources, listSandboxes, listScheduleRunJobs, listScheduleRuns, listScheduleServices, listSecrets, listServiceHealthStatuses, listServiceProjects, listServices, listServiceSchedules, listSkills, listSourceBackups, listSourceFiles, listSourceMaps, listSources, listStaticBundles, listSyncedRepositories, listTeamMembers, listTeamProjects, listTeams, listUsers, listWebhooks, login, logout, lookupDnsARecords, mintEnrollmentToken, mkdir, nodeHeartbeat, nodeMetricsGetRange, observabilityFullEvent, observabilityListEvents, oidcCallback, type Options, patchAdminGate, patchPreviewGatewaySettings, pauseDeployment, pauseSandbox, planRestore, postDnsAck, previewAlert, previewFunnelMetrics, previewHostnameMode, promoteClusterMember, promoteDeployment, provisionDomain, purgeProjectLogs, pushExternalImage, queryData, queryGenaiTraces, queryLogs, queryMetrics, queryTraces, queryTraceSummaries, readFile, reAnalyze, recordConsoleEvent, recordEventMetrics, recordFlagExposure, recordSpeedMetrics, refreshRouteTable, regenerateDsn, registerExternalImage, registerNode, reinstallGitlabWebhook, rejectPendingAction, reloadPlugins, removeClusterMember, removeManagedDomain, removeRole, removeTeamMember, renameConversation, renewDomain, requestPasswordReset, resetPassword, resizeSandbox, resolveAlarm, restartContainer, restartPreviewGateway, restartSandbox, restoreFlag, restoreUser, resumeDeployment, resumeSandbox, retryCluster, retryDelivery, retryPgUpgrade, retryRun, revealGlobalMcpConfig, revealMcpConfig, revealNotificationProviderConfig, revealServiceParameter, revenueCreateIntegration, revenueDeleteIntegration, revenueGlobalEvents, revenueImportInvoicesCsv, revenueImportSubscriptionsCsv, revenueListIntegrations, revenueListProviders, revenueMetricsCustomers, revenueMetricsGlobalMrr, revenueMetricsGlobalSummary, revenueMetricsMrr, revenueMetricsSummary, revenueRecentEvents, revenueRotateToken, revenueUpdateConfig, revenueUpdateSecret, revokeDsn, revokeEnrollmentToken, revokeJoinToken, revokeProjectAccess, rollbackPgUpgrade, rollbackToDeployment, rootfsGc, rootfsReport, rotateApiKey, rotateDeploymentToken, runBackupForSource, runConnectionHealthCheck, runExternalServiceBackup, runScheduleNow, sandboxCreatePreviewLink, saveAgentToken, saveAiProviderCredential, searchLogs, sendEmail, setDefaultS3Source, setFlagEnvironment, setPreviewPassword, setupDns, setupDnsChallenge, setupEmailTracking, setupMfa, sleepEnvironment, smokeTestAgent, sourceSandbox, startAnalysis, startContainer, startFix, startGitProviderOauth, startOidcLoginBySlug, startPgUpgrade, startRestore, startService, statPath, stopContainer, stopSandbox, stopService, streamContainerMetrics, streamEvents, streamRunEvents, syncRepositories, tailDeploymentJobLogs, tailLogs, teardownDeployment, teardownEnvironment, testNotificationProvider, testOidcProvider, testProvider, testProviderConnection, testProviderKeyById, testProviderKeyInline, testS3ConnectionPreview, testS3SourceConnection, trackClick, trackOpen, triggerAgent, triggerProjectPipeline, triggerScan, triggerServiceHealthCheck, triggerWeeklyDigest, unlinkServiceFromProject, updateAgent, updateAiProvider, updateAlert, updateAlertRule, updateApiKey, updateAutomaticDeploy, updateBackupSchedule, updateCloudflareProvider, updateConnectionToken, updateCustomDomain, updateDashboard, updateDeploymentToken, updateEmailProvider, updateEnvironmentSettings, updateEnvironmentSubdomain, updateEnvironmentVariable, updateErrorGroup, updateFlag, updateFunnel, updateGitProviderCredentials, updateGitSettings, updateGlobalMcp, updateGlobalSkill, updateIncidentStatus, updateIpAccessControl, updateManagedDomain, updateMcp, updateNotificationEmailProvider, updateNotificationProvider, updateOidcProvider, updatePreferences, updateProject, updateProjectDeploymentConfig, updateProjectSecret, updateProjectSettings, updateProvider, updateProviderKey, updateRoute, updateS3Source, updateSelf, updateService, updateServiceResources, updateSessionDuration, updateSettings, updateSkill, updateSlackProvider, updateSpeedMetrics, updateTeam, updateTeamMemberRole, updateUser, updateWebhook, updateWebhookProvider, upgradePreviewGateway, upgradeService, uploadGlobalSkill, uploadReleaseFile, uploadSkill, uploadSourceFile, uploadSourceMap, uploadStaticBundle, upsertSecret, validateConnection, validateEmail, verifyAndEnableMfa, verifyDomain, verifyEmail, verifyManagedDomain, verifyMfaChallenge, verifyStepUp, wakeEnvironment, webhookTrigger, workflowDryRun, writeFile, writeFiles } from './sdk.gen'; +export type { AcknowledgeAlarmData, AcknowledgeAlarmErrors, AcknowledgeAlarmResponses, AcmeOrderResponse, ActivateAiProviderData, ActivateAiProviderErrors, ActivateAiProviderResponse, ActivateAiProviderResponses, ActivateApiKeyData, ActivateApiKeyErrors, ActivateApiKeyResponse, ActivateApiKeyResponses, ActivateConnectionData, ActivateConnectionErrors, ActivateConnectionResponses, ActivateProviderData, ActivateProviderErrors, ActivateProviderResponse, ActivateProviderResponses, ActiveVisitor, ActiveVisitorsQuery, ActiveVisitorsResponse, ActivityDay, ActivityEvent, ActivityGraphQuery, ActivityGraphResponse, AddClusterMemberData, AddClusterMemberErrors, AddClusterMemberRequest, AddClusterMemberResponse, AddClusterMemberResponses, AddContextData, AddContextErrors, AddContextRequest, AddContextResponses, AddEnvironmentDomainData, AddEnvironmentDomainErrors, AddEnvironmentDomainRequest, AddEnvironmentDomainResponse, AddEnvironmentDomainResponses, AddEventsData, AddEventsError, AddEventsErrors, AddEventsRequest, AddEventsResponse, AddEventsResponse2, AddEventsResponses, AddManagedDomainApiRequest, AddManagedDomainData, AddManagedDomainErrors, AddManagedDomainResponse, AddManagedDomainResponses, AddSessionReplayEventsData, AddSessionReplayEventsError, AddSessionReplayEventsErrors, AddSessionReplayEventsResponse, AddSessionReplayEventsResponses, AddTeamMemberData, AddTeamMemberErrors, AddTeamMemberResponse, AddTeamMemberResponses, AdminDrainNodeData, AdminDrainNodeErrors, AdminDrainNodeResponse, AdminDrainNodeResponses, AdminDrainStatusData, AdminDrainStatusErrors, AdminDrainStatusResponse, AdminDrainStatusResponses, AdminGateResponse, AdminGateSource, AdminGetNodeData, AdminGetNodeErrors, AdminGetNodeResponse, AdminGetNodeResponses, AdminListNodeContainersData, AdminListNodeContainersErrors, AdminListNodeContainersResponse, AdminListNodeContainersResponses, AdminListNodesData, AdminListNodesErrors, AdminListNodesResponse, AdminListNodesResponses, AdminRemoveNodeData, AdminRemoveNodeErrors, AdminRemoveNodeResponse, AdminRemoveNodeResponses, AdminUndrainNodeData, AdminUndrainNodeErrors, AdminUndrainNodeResponse, AdminUndrainNodeResponses, AgentConfigResponse, AgentRunLogResponse, AgentRunResponse, AgentRunWithLogsResponse, AgentSandboxSettings, AgentSandboxSettingsMasked, AggregatedBucketItem, AggregatedBucketsQuery, AggregatedBucketsResponse, AggregationLevel, AggregationTemporality, AiAgentBreakdownResponse, AiAgentBreakdownRow, AiAgentDescriptor, AiAgentPageRow, AiAgentPagesResponse, AiAgentTimelineResponse, AiAgentTimelineRow, AiChatLimitsSettings, AiConfigSettings, AiPageBreakdownResponse, AiPageBreakdownRow, AiStatusBreakdownResponse, AiStatusBreakdownRow, AlarmListResponse, AlarmResponse, AlarmSummaryResponse, AlertRuleResponse, AllocEntry, AnalyticsSessionEventsResponse, AnnotatedSpan, AnomalyAlgorithm, AnomalyParams, AnomalyPreviewPointResponse, AnomalyPreviewRequest, AnomalyPreviewResponse, ApiKeyListResponse, ApiKeyResponse, ApplyHostnameModeData, ApplyHostnameModeErrors, ApplyHostnameModeRequest, ApplyHostnameModeResponse, ApplyHostnameModeResponses, AppSettings, AppSettingsResponse, ArchiveConversationData, ArchiveConversationErrors, ArchiveConversationResponse, ArchiveConversationResponses, ArchiveFlagData, ArchiveFlagErrors, ArchiveFlagResponse, ArchiveFlagResponse2, ArchiveFlagResponses, ArchiveMode, AssignRoleData, AssignRoleErrors, AssignRoleRequest, AssignRoleResponses, AttachScheduleServicesData, AttachScheduleServicesError, AttachScheduleServicesErrors, AttachScheduleServicesRequest, AttachScheduleServicesResponse, AttachScheduleServicesResponse2, AttachScheduleServicesResponses, AuditLogIpInfo, AuditLogResponse, AuditLogUserInfo, AuthFlavorDto, AuthResponse, AuthStatusResponse, AuthTokenResponse, AutofixerRunResponse, AutofixerRunWithLogsResponse, AutofixRunConfig, AutoWatchParams, AvailableContainerInfo, AvailablePermissions, BackupAlertListResponse, BackupAlertResponse, BackupResponse, BackupScheduleResponse, BitbucketAuthInput, BlobCopyData, BlobCopyError, BlobCopyErrors, BlobCopyResponse, BlobCopyResponses, BlobDeleteData, BlobDeleteError, BlobDeleteErrors, BlobDeleteResponse, BlobDeleteResponses, BlobDisableData, BlobDisableErrors, BlobDisableResponse, BlobDisableResponses, BlobDownloadData, BlobDownloadError, BlobDownloadErrors, BlobDownloadResponses, BlobEnableData, BlobEnableErrors, BlobEnableResponse, BlobEnableResponses, BlobHeadData, BlobHeadError, BlobHeadErrors, BlobHeadResponses, BlobListData, BlobListError, BlobListErrors, BlobListResponse, BlobListResponses, BlobPutData, BlobPutError, BlobPutErrors, BlobPutResponse, BlobPutResponses, BlobResponse, BlobStatusData, BlobStatusErrors, BlobStatusResponse, BlobStatusResponse2, BlobStatusResponses, BlobUpdateData, BlobUpdateErrors, BlobUpdateResponse, BlobUpdateResponses, BranchInfo, BranchListResponse, BrowserCount, BrowsersQuery, BuildConfiguration, BuildLimitsSettings, CancelBackupData, CancelBackupError, CancelBackupErrors, CancelBackupResponse, CancelBackupResponse2, CancelBackupResponses, CancelData, CancelDeploymentData, CancelDeploymentErrors, CancelDeploymentResponse, CancelDeploymentResponses, CancelDomainOrderData, CancelDomainOrderErrors, CancelDomainOrderResponse, CancelDomainOrderResponses, CancelErrors, CancelPgUpgradeData, CancelPgUpgradeErrors, CancelPgUpgradeResponse, CancelPgUpgradeResponses, CancelResponses, CancelRunData, CancelRunErrors, CancelRunResponse, CancelRunResponses, CancelScheduleRunData, CancelScheduleRunError, CancelScheduleRunErrors, CancelScheduleRunResponse, CancelScheduleRunResponses, CertStatusResponse, ChallengeConfig, ChallengeError, ChallengeValidationStatus, ChangePasswordRequest, ChangePasswordSelfData, ChangePasswordSelfErrors, ChangePasswordSelfResponse, ChangePasswordSelfResponses, ChangeProjectSourceData, ChangeProjectSourceErrors, ChangeProjectSourceRequest, ChangeProjectSourceResponse, ChangeProjectSourceResponses, ChangeRequiredPasswordData, ChangeRequiredPasswordErrors, ChangeRequiredPasswordResponse, ChangeRequiredPasswordResponses, ChatCompletionChoice, ChatCompletionRequest, ChatCompletionResponse, ChatCompletionsData, ChatCompletionsError, ChatCompletionsErrors, ChatCompletionsResponse, ChatCompletionsResponses, ChatMessage, ChatReadinessResponse, CheckAnalyticsHasEventsData, CheckAnalyticsHasEventsErrors, CheckAnalyticsHasEventsResponse, CheckAnalyticsHasEventsResponses, CheckCommitExistsData, CheckCommitExistsErrors, CheckCommitExistsResponse, CheckCommitExistsResponses, CheckDomainStatusData, CheckDomainStatusErrors, CheckDomainStatusResponse, CheckDomainStatusResponses, CheckExplorerSupportData, CheckExplorerSupportErrors, CheckExplorerSupportResponse, CheckExplorerSupportResponses, CheckIpBlockedData, CheckIpBlockedError, CheckIpBlockedErrors, CheckIpBlockedResponses, CheckProviderDeletionSafetyData, CheckProviderDeletionSafetyErrors, CheckProviderDeletionSafetyResponse, CheckProviderDeletionSafetyResponses, ChildBackupEntryResponse, ChildBackupListResponse, ChunkUploadOptionsData, ChunkUploadOptionsResponse, ChunkUploadOptionsResponses, CleanupExpiredBackupsData, CleanupExpiredBackupsError, CleanupExpiredBackupsErrors, CleanupExpiredBackupsRequest, CleanupExpiredBackupsResponse, CleanupExpiredBackupsResponses, ClearPreviewPasswordData, ClearPreviewPasswordErrors, ClearPreviewPasswordResponse, ClearPreviewPasswordResponses, CliDeviceApproveData, CliDeviceApproveErrors, CliDeviceApproveRequest, CliDeviceApproveResponse, CliDeviceApproveResponse2, CliDeviceApproveResponses, CliDeviceDenyData, CliDeviceDenyErrors, CliDeviceDenyResponse, CliDeviceDenyResponses, CliDeviceLookupData, CliDeviceLookupErrors, CliDeviceLookupResponse, CliDeviceLookupResponse2, CliDeviceLookupResponses, CliDevicePollData, CliDevicePollErrors, CliDevicePollRequest, CliDevicePollResponse, CliDevicePollResponse2, CliDevicePollResponses, CliDeviceStartData, CliDeviceStartErrors, CliDeviceStartRequest, CliDeviceStartResponse, CliDeviceStartResponse2, CliDeviceStartResponses, ClientOptions, CliLoginRequest, CliLogoutData, CliLogoutErrors, CliLogoutResponse, CliLogoutResponses, CloudflareConfig, CloudProvider, ClusterCapacity, ClusterDnsSettings, ClusterHealthReportResponse, ClusterMemberHealthResponse, ClusterMemberRequest, CmdBody, CmdData, CmdErrors, CmdInner, CmdKillBody, CmdKillData, CmdKillErrors, CmdKillResponse, CmdKillResponses, CmdLogsData, CmdLogsErrors, CmdLogsResponses, CmdResponse, CmdResponse2, CmdResponses, CommitExistsResponse, CommitInfo, CommitListResponse, Comparator, ComposePublicPort, ConfirmPendingActionData, ConfirmPendingActionErrors, ConfirmPendingActionResponse, ConfirmPendingActionResponses, ConnectionListQuery, ConnectionListResponse, ConnectionResponse, ConnectionTestResult, ConsoleEventPayload, ContainerActionResponse, ContainerDetailResponse, ContainerEnvironmentVariableValueResponse, ContainerInfoResponse, ContainerInventoryItem, ContainerListResponse, ContainerLogSettings, ContainerLogsQuery, ContainerMetricHistoryPoint, ContainerMetricsGetHistoryData, ContainerMetricsGetHistoryErrors, ContainerMetricsGetHistoryResponse, ContainerMetricsGetHistoryResponses, ContainerMetricsHistoryQuery, ContainerMetricsResponse, ContainerResponse, ContainerRuntimeInfo, ContainerStatsSample, ContentPart, ContextLine, ContextLogsRequest, ContextLogsResponse, ConversationDetailResponse, ConversationResponse, ConversationsQueryParams, ConversationSummary, CopyBlobRequest, CostAnalysis, CreateAgentData, CreateAgentErrors, CreateAgentResponse, CreateAgentResponses, CreateAlertData, CreateAlertError, CreateAlertErrors, CreateAlertResponse, CreateAlertResponses, CreateAlertRuleData, CreateAlertRuleErrors, CreateAlertRuleRequest, CreateAlertRuleResponse, CreateAlertRuleResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyRequest, CreateApiKeyResponse, CreateApiKeyResponse2, CreateApiKeyResponses, CreateBackupScheduleData, CreateBackupScheduleError, CreateBackupScheduleErrors, CreateBackupScheduleRequest, CreateBackupScheduleResponse, CreateBackupScheduleResponses, CreateBitbucketProviderData, CreateBitbucketProviderErrors, CreateBitbucketProviderResponse, CreateBitbucketProviderResponses, CreateBitbucketRequest, CreateCloudflareProviderData, CreateCloudflareProviderErrors, CreateCloudflareProviderRequest, CreateCloudflareProviderResponse, CreateCloudflareProviderResponses, CreateConversationData, CreateConversationErrors, CreateConversationRequest, CreateConversationResponse, CreateConversationResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponse, CreateCustomDomainResponses, CreateDashboardData, CreateDashboardError, CreateDashboardErrors, CreateDashboardRequest, CreateDashboardResponse, CreateDashboardResponses, CreateDeploymentTokenData, CreateDeploymentTokenErrors, CreateDeploymentTokenRequest, CreateDeploymentTokenResponse, CreateDeploymentTokenResponse2, CreateDeploymentTokenResponses, CreateDnsProviderData, CreateDnsProviderErrors, CreateDnsProviderRequest, CreateDnsProviderResponse, CreateDnsProviderResponses, CreateDomainData, CreateDomainErrors, CreateDomainRequest, CreateDomainResponse, CreateDomainResponses, CreatedResource, CreateDsnData, CreateDsnErrors, CreateDsnRequest, CreateDsnResponse, CreateDsnResponses, CreateEmailDomainData, CreateEmailDomainErrors, CreateEmailDomainRequest, CreateEmailDomainResponse, CreateEmailDomainResponses, CreateEmailProviderData, CreateEmailProviderErrors, CreateEmailProviderRequest, CreateEmailProviderResponse, CreateEmailProviderResponses, CreateEnvironmentData, CreateEnvironmentErrors, CreateEnvironmentRequest, CreateEnvironmentResponse, CreateEnvironmentResponses, CreateEnvironmentVariableData, CreateEnvironmentVariableErrors, CreateEnvironmentVariableRequest, CreateEnvironmentVariableResponse, CreateEnvironmentVariableResponses, CreateExternalServiceRequest, CreateFlagData, CreateFlagErrors, CreateFlagRequest, CreateFlagResponse, CreateFlagResponses, CreateFunnelData, CreateFunnelErrors, CreateFunnelRequest, CreateFunnelResponse, CreateFunnelResponse2, CreateFunnelResponses, CreateFunnelStep, CreateGenericProviderData, CreateGenericProviderErrors, CreateGenericProviderResponse, CreateGenericProviderResponses, CreateGenericRequest, CreateGiteaPatProviderData, CreateGiteaPatProviderErrors, CreateGiteaPatProviderResponse, CreateGiteaPatProviderResponses, CreateGiteaPatRequest, CreateGithubPatProviderData, CreateGithubPatProviderErrors, CreateGithubPatProviderResponse, CreateGithubPatProviderResponses, CreateGitHubPatRequest, CreateGitlabOauthProviderData, CreateGitlabOauthProviderErrors, CreateGitlabOauthProviderResponse, CreateGitlabOauthProviderResponses, CreateGitLabOAuthRequest, CreateGitlabPatProviderData, CreateGitlabPatProviderErrors, CreateGitlabPatProviderResponse, CreateGitlabPatProviderResponses, CreateGitLabPatRequest, CreateGitProviderData, CreateGitProviderErrors, CreateGitProviderResponse, CreateGitProviderResponses, CreateGlobalMcpData, CreateGlobalMcpErrors, CreateGlobalMcpResponse, CreateGlobalMcpResponses, CreateGlobalSkillData, CreateGlobalSkillErrors, CreateGlobalSkillResponse, CreateGlobalSkillResponses, CreateIncidentData, CreateIncidentErrors, CreateIncidentRequest, CreateIncidentResponse, CreateIncidentResponses, CreateIntegrationBody, CreateIpAccessControlData, CreateIpAccessControlError, CreateIpAccessControlErrors, CreateIpAccessControlRequest, CreateIpAccessControlResponse, CreateIpAccessControlResponses, CreateMcpData, CreateMcpErrors, CreateMcpRequest, CreateMcpResponse, CreateMcpResponses, CreateMetricAlertRequest, CreateMonitorData, CreateMonitorErrors, CreateMonitorRequest, CreateMonitorResponse, CreateMonitorResponses, CreateNotificationEmailProviderData, CreateNotificationEmailProviderErrors, CreateNotificationEmailProviderRequest, CreateNotificationEmailProviderResponse, CreateNotificationEmailProviderResponses, CreateNotificationProviderData, CreateNotificationProviderErrors, CreateNotificationProviderResponse, CreateNotificationProviderResponses, CreateOidcProviderData, CreateOidcProviderErrors, CreateOidcProviderRequest, CreateOidcProviderResponse, CreateOidcProviderResponses, CreateOidcRoleMappingData, CreateOidcRoleMappingRequest, CreateOidcRoleMappingResponse, CreateOidcRoleMappingResponses, CreateOrRecreateOrderData, CreateOrRecreateOrderErrors, CreateOrRecreateOrderResponse, CreateOrRecreateOrderResponses, CreatePlanData, CreatePlanErrors, CreatePlanRequest, CreatePlanResponse, CreatePlanResponse2, CreatePlanResponses, CreatePrData, CreatePrErrors, CreateProjectAccessRequest, CreateProjectData, CreateProjectErrors, CreateProjectFromTemplateData, CreateProjectFromTemplateErrors, CreateProjectFromTemplateRequest, CreateProjectFromTemplateResponse, CreateProjectFromTemplateResponse2, CreateProjectFromTemplateResponses, CreateProjectReleaseData, CreateProjectReleaseErrors, CreateProjectReleaseResponse, CreateProjectReleaseResponses, CreateProjectRequest, CreateProjectResponse, CreateProjectResponses, CreateProjectSecretData, CreateProjectSecretErrors, CreateProjectSecretRequest, CreateProjectSecretResponse, CreateProjectSecretResponses, CreateProviderKeyData, CreateProviderKeyError, CreateProviderKeyErrors, CreateProviderKeyRequest, CreateProviderKeyResponse, CreateProviderKeyResponses, CreateProviderRequest, CreatePrResponse, CreatePrResponse2, CreatePrResponses, CreateReleaseData, CreateReleaseErrors, CreateReleaseResponse, CreateReleaseResponses, CreateRouteData, CreateRouteErrors, CreateRouteRequest, CreateRouteResponse, CreateRouteResponses, CreateS3SourceData, CreateS3SourceError, CreateS3SourceErrors, CreateS3SourceRequest, CreateS3SourceResponse, CreateS3SourceResponses, CreateSandboxBody, CreateSandboxData, CreateSandboxErrors, CreateSandboxResponse, CreateSandboxResponses, CreateServiceData, CreateServiceErrors, CreateServiceResponse, CreateServiceResponses, CreateSkillData, CreateSkillErrors, CreateSkillRequest, CreateSkillResponse, CreateSkillResponses, CreateSlackProviderData, CreateSlackProviderErrors, CreateSlackProviderRequest, CreateSlackProviderResponse, CreateSlackProviderResponses, CreateTeamData, CreateTeamErrors, CreateTeamMemberRequest, CreateTeamRequest, CreateTeamResponse, CreateTeamResponses, CreateUserData, CreateUserErrors, CreateUserRequest, CreateUserResponse, CreateUserResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookProviderData, CreateWebhookProviderErrors, CreateWebhookProviderRequest, CreateWebhookProviderResponse, CreateWebhookProviderResponses, CreateWebhookRequestBody, CreateWebhookResponse, CreateWebhookResponses, CronExecutionInfo, CronInfo, CrossProjectSiblingRef, CrossProjectTraceResponse, CurrentStatusResponse, CustomDomainRequest, CustomDomainResponse, CustomerMovementResponse, DashboardLayout, DashboardProjectsAnalyticsQuery, DashboardProjectsAnalyticsResponse, DashboardSection, DashboardTile, DatabaseMetricsResponse, DatabaseMetricsRow, DataImplication, DataImplicationSeverity, DeactivateApiKeyData, DeactivateApiKeyErrors, DeactivateApiKeyResponse, DeactivateApiKeyResponses, DeactivateConnectionData, DeactivateConnectionErrors, DeactivateConnectionResponses, DeactivateProviderData, DeactivateProviderErrors, DeactivateProviderResponses, DeleteAgentData, DeleteAgentErrors, DeleteAgentResponse, DeleteAgentResponses, DeleteAlertData, DeleteAlertError, DeleteAlertErrors, DeleteAlertResponse, DeleteAlertResponses, DeleteAlertRuleData, DeleteAlertRuleErrors, DeleteAlertRuleResponse, DeleteAlertRuleResponses, DeleteApiKeyData, DeleteApiKeyErrors, DeleteApiKeyResponse, DeleteApiKeyResponses, DeleteBackupData, DeleteBackupError, DeleteBackupErrors, DeleteBackupResponse, DeleteBackupResponses, DeleteBackupScheduleData, DeleteBackupScheduleError, DeleteBackupScheduleErrors, DeleteBackupScheduleResponse, DeleteBackupScheduleResponses, DeleteBlobRequest, DeleteBlobResponse, DeleteConnectionData, DeleteConnectionErrors, DeleteConnectionResponse, DeleteConnectionResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponse, DeleteCustomDomainResponses, DeleteDashboardData, DeleteDashboardError, DeleteDashboardErrors, DeleteDashboardResponse, DeleteDashboardResponses, DeleteDeploymentTokenData, DeleteDeploymentTokenErrors, DeleteDeploymentTokenResponse, DeleteDeploymentTokenResponses, DeleteDnsProviderData, DeleteDnsProviderErrors, DeleteDnsProviderResponse, DeleteDnsProviderResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponse, DeleteDomainResponses, DeleteEmailDomainData, DeleteEmailDomainErrors, DeleteEmailDomainResponse, DeleteEmailDomainResponses, DeleteEmailProviderData, DeleteEmailProviderErrors, DeleteEmailProviderResponse, DeleteEmailProviderResponses, DeleteEnvironmentData, DeleteEnvironmentDomainData, DeleteEnvironmentDomainErrors, DeleteEnvironmentDomainResponse, DeleteEnvironmentDomainResponses, DeleteEnvironmentErrors, DeleteEnvironmentResponse, DeleteEnvironmentResponses, DeleteEnvironmentVariableData, DeleteEnvironmentVariableErrors, DeleteEnvironmentVariableResponse, DeleteEnvironmentVariableResponses, DeleteExternalImageData, DeleteExternalImageErrors, DeleteExternalImageResponse, DeleteExternalImageResponses, DeleteFunnelData, DeleteFunnelErrors, DeleteFunnelResponses, DeleteGitProviderData, DeleteGitProviderErrors, DeleteGitProviderResponse, DeleteGitProviderResponses, DeleteGlobalMcpData, DeleteGlobalMcpErrors, DeleteGlobalMcpResponse, DeleteGlobalMcpResponses, DeleteGlobalSkillData, DeleteGlobalSkillErrors, DeleteGlobalSkillResponse, DeleteGlobalSkillResponses, DeleteIpAccessControlData, DeleteIpAccessControlError, DeleteIpAccessControlErrors, DeleteIpAccessControlResponse, DeleteIpAccessControlResponses, DeleteMcpData, DeleteMcpErrors, DeleteMcpResponse, DeleteMcpResponses, DeleteMonitorData, DeleteMonitorErrors, DeleteMonitorResponse, DeleteMonitorResponses, DeleteNotificationProviderData, DeleteNotificationProviderErrors, DeleteNotificationProviderResponse, DeleteNotificationProviderResponses, DeleteOidcProviderData, DeleteOidcProviderResponse, DeleteOidcProviderResponses, DeleteOidcRoleMappingData, DeleteOidcRoleMappingResponse, DeleteOidcRoleMappingResponses, DeletePreferencesData, DeletePreferencesErrors, DeletePreferencesResponse, DeletePreferencesResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponse, DeleteProjectResponses, DeleteProjectSecretData, DeleteProjectSecretErrors, DeleteProjectSecretResponse, DeleteProjectSecretResponses, DeleteProviderKeyData, DeleteProviderKeyError, DeleteProviderKeyErrors, DeleteProviderKeyResponse, DeleteProviderKeyResponses, DeleteProviderSafelyData, DeleteProviderSafelyErrors, DeleteProviderSafelyResponse, DeleteProviderSafelyResponses, DeleteReleaseSourceFilesData, DeleteReleaseSourceFilesErrors, DeleteReleaseSourceFilesResponse, DeleteReleaseSourceFilesResponses, DeleteReleaseSourceMapsData, DeleteReleaseSourceMapsErrors, DeleteReleaseSourceMapsResponse, DeleteReleaseSourceMapsResponses, DeleteResponse, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponse, DeleteRouteResponses, DeleteS3SourceData, DeleteS3SourceError, DeleteS3SourceErrors, DeleteS3SourceResponse, DeleteS3SourceResponses, DeleteScanData, DeleteScanError, DeleteScanErrors, DeleteScanResponse, DeleteScanResponses, DeleteSecretData, DeleteSecretErrors, DeleteSecretResponse, DeleteSecretResponses, DeleteServiceData, DeleteServiceErrors, DeleteServiceResponse, DeleteServiceResponses, DeleteSessionReplayData, DeleteSessionReplayError, DeleteSessionReplayErrors, DeleteSessionReplayResponses, DeleteSkillData, DeleteSkillErrors, DeleteSkillResponse, DeleteSkillResponses, DeleteSourceMapData, DeleteSourceMapErrors, DeleteSourceMapResponse, DeleteSourceMapResponses, DeleteStaticBundleData, DeleteStaticBundleErrors, DeleteStaticBundleResponse, DeleteStaticBundleResponses, DeleteTeamData, DeleteTeamErrors, DeleteTeamResponse, DeleteTeamResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponse, DeleteUserResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponse, DeleteWebhookResponses, DelRequest, DelResponse, DeployFromImageData, DeployFromImageErrors, DeployFromImageRequest, DeployFromImageResponse, DeployFromImageResponses, DeployFromImageUploadData, DeployFromImageUploadErrors, DeployFromImageUploadQuery, DeployFromImageUploadResponse, DeployFromImageUploadResponses, DeployFromStaticData, DeployFromStaticErrors, DeployFromStaticRequest, DeployFromStaticResponse, DeployFromStaticResponses, DeployFromUploadedSourceData, DeployFromUploadedSourceErrors, DeployFromUploadedSourceResponse, DeployFromUploadedSourceResponses, DeploymentConfig, DeploymentConfigSnapshot, DeploymentConfiguration, DeploymentContainerLogContentResponse, DeploymentContainerLogResponse, DeploymentContainerLogsListResponse, DeploymentEnvironmentResponse, DeploymentJobResponse, DeploymentJobsResponse, DeploymentListResponse, DeploymentMetadata, DeploymentMetricsGetLatestData, DeploymentMetricsGetLatestErrors, DeploymentMetricsGetLatestResponse, DeploymentMetricsGetLatestResponses, DeploymentMetricsGetRangeData, DeploymentMetricsGetRangeErrors, DeploymentMetricsGetRangeResponse, DeploymentMetricsGetRangeResponses, DeploymentMetricsToggleData, DeploymentMetricsToggleErrors, DeploymentMetricsToggleResponses, DeploymentResponse, DeploymentStateResponse, DeploymentStrategy, DeploymentTokenListResponse, DeploymentTokenResponse, DestroySandboxData, DestroySandboxErrors, DestroySandboxResponse, DestroySandboxResponses, DetachScheduleServiceData, DetachScheduleServiceError, DetachScheduleServiceErrors, DetachScheduleServiceResponse, DetachScheduleServiceResponses, DetectionConfig, DetectPublicPresetsData, DetectPublicPresetsErrors, DetectPublicPresetsResponse, DetectPublicPresetsResponses, DeviceCount, DigestSections, Direction, DisableBackupScheduleData, DisableBackupScheduleErrors, DisableBackupScheduleResponse, DisableBackupScheduleResponses, DisableBlobResponse, DisableKvResponse, DisableMfaData, DisableMfaErrors, DisableMfaRequest, DisableMfaResponse, DisableMfaResponses, DiscoverRequest, DiscoverResponse, DiscoverWorkloadsData, DiscoverWorkloadsErrors, DiscoverWorkloadsResponse, DiscoverWorkloadsResponses, DiskInfo, DiskSpaceAlert, DiskSpaceAlertSettings, DiskSpaceCheckResult, DnsAckRequest, DnsAckResponse, DnsChallengeRecordResult, DnsChangesResponse, DnsCompletionResponse, DnsLookupError, DnsLookupRequest, DnsLookupResponse, DnsProviderCredentials, DnsProviderResponse, DnsProviderSettings, DnsProviderSettingsMasked, DnsProviderType, DnsRecord, DnsRecordChange, DnsRecordContent, DnsRecordResponse, DnsRecordSetupResult, DnsRecordStatusResponse, DnsZone, DockerComposePresetConfig, DockerfilePresetConfig, DockerfileVariant, DockerRegistrySettings, DockerRegistrySettingsMasked, DomainAction, DomainChallengeResponse, DomainData, DomainEnvironmentResponse, DomainError, DomainErrors, DomainPlan, DomainResponse, DomainResponse2, DomainResponses, DownloadGlobalSkillArchiveData, DownloadGlobalSkillArchiveErrors, DownloadGlobalSkillArchiveResponse, DownloadGlobalSkillArchiveResponses, DownloadObjectData, DownloadObjectErrors, DownloadObjectResponse, DownloadObjectResponses, DownloadSkillArchiveData, DownloadSkillArchiveErrors, DownloadSkillArchiveResponse, DownloadSkillArchiveResponses, DrainNodeResponse, DrainStatusResponse, DropArchiveUpload, DropInspectionResponse, DropOffPoint, DropPresetCandidate, EmailConfig, EmailDomainResponse, EmailDomainWithDnsResponse, EmailProviderResponse, EmailProviderTypeRoute, EmailRequest, EmailResponse, EmailStatsResponse, EmailStatusData, EmailStatusErrors, EmailStatusResponse, EmailStatusResponse2, EmailStatusResponses, EmailTrackingResponse, EmailTrackingSetupResponse, EmailTrackingStatusResponse, EmbeddingData, EmbeddingInput, EmbeddingRequest, EmbeddingResponse, EmbeddingsData, EmbeddingsError, EmbeddingsErrors, EmbeddingsResponse, EmbeddingsResponses, EmbeddingUsage, EnableBackupScheduleData, EnableBackupScheduleErrors, EnableBackupScheduleResponse, EnableBackupScheduleResponses, EnableBlobRequest, EnableBlobResponse, EnableKvRequest, EnableKvResponse, EnablePgStatStatementsResponse, EndpointDto, EnqueuedJob, EnrichVisitorData, EnrichVisitorErrors, EnrichVisitorRequest, EnrichVisitorResponse, EnrichVisitorResponse2, EnrichVisitorResponses, EnrollmentTokenInfo, EnrollmentTokenListResponse, EntityInfoResponse, EntityResponse, EnvironmentConfiguration, EnvironmentDomainResponse, EnvironmentInfo, EnvironmentResponse, EnvironmentVariable, EnvironmentVariableInfo, EnvironmentVariableResponse, EnvironmentVariableValueResponse, EnvVarInput, EnvVarIntegrationInfo, EnvVarResponse, EnvVarTemplateResponse, ErrorDashboardStatsQuery, ErrorDashboardStatsResponse, ErrorEventResponse, ErrorGroupResponse, ErrorGroupStatsResponse, ErrorResponse, ErrorRow, ErrorTimeSeriesDataResponse, ErrorTimeSeriesQuery, EventActivityBucket, EventBreakdown, EventBrowserStats, EventCount, EventCountryStats, EventDetailQuery, EventDetailResponse, EventEntriesQuery, EventEntriesResponse, EventEntryInfo, EventKind, EventMetricsPayload, EventReferrerStats, EventsCountQuery, EventsResponse, EventTimeline, EventTimelineQuery, EventType, EventTypeBreakdown, EventTypeBreakdownQuery, EventTypeResponse, EventTypesResponse, EventVisitorInfo, EventVisitorsQuery, EventVisitorsResponse, ExecBody, ExecData, ExecDetachedData, ExecDetachedErrors, ExecDetachedResponse, ExecDetachedResponse2, ExecDetachedResponses, ExecErrors, ExecResponse, ExecResponse2, ExecResponses, ExecuteDeploymentOperationData, ExecuteDeploymentOperationErrors, ExecuteDeploymentOperationResponse, ExecuteDeploymentOperationResponses, ExecuteImportData, ExecuteImportErrors, ExecuteImportRequest, ExecuteImportResponse, ExecuteImportResponse2, ExecuteImportResponses, ExecuteOperationRequest, ExpireRequest, ExpireResponse, ExplorerSupportResponse, ExtendTimeoutBody, ExtendTimeoutData, ExtendTimeoutErrors, ExtendTimeoutResponse, ExtendTimeoutResponses, ExternalImageResponse, ExternalServiceBackupResponse, ExternalServiceDetails, ExternalServiceEnablePgStatStatementsData, ExternalServiceEnablePgStatStatementsErrors, ExternalServiceEnablePgStatStatementsResponse, ExternalServiceEnablePgStatStatementsResponses, ExternalServiceInfo, ExternalServiceMetricsByDatabaseData, ExternalServiceMetricsByDatabaseErrors, ExternalServiceMetricsByDatabaseResponse, ExternalServiceMetricsByDatabaseResponses, ExternalServiceMetricsCreateAlertRuleData, ExternalServiceMetricsCreateAlertRuleErrors, ExternalServiceMetricsCreateAlertRuleResponse, ExternalServiceMetricsCreateAlertRuleResponses, ExternalServiceMetricsDeleteAlertRuleData, ExternalServiceMetricsDeleteAlertRuleErrors, ExternalServiceMetricsDeleteAlertRuleResponse, ExternalServiceMetricsDeleteAlertRuleResponses, ExternalServiceMetricsGetAlertRulesData, ExternalServiceMetricsGetAlertRulesErrors, ExternalServiceMetricsGetAlertRulesResponse, ExternalServiceMetricsGetAlertRulesResponses, ExternalServiceMetricsGetLatestData, ExternalServiceMetricsGetLatestErrors, ExternalServiceMetricsGetLatestResponse, ExternalServiceMetricsGetLatestResponses, ExternalServiceMetricsGetRangeData, ExternalServiceMetricsGetRangeErrors, ExternalServiceMetricsGetRangeResponse, ExternalServiceMetricsGetRangeResponses, ExternalServiceMetricsStatusData, ExternalServiceMetricsStatusErrors, ExternalServiceMetricsStatusResponse, ExternalServiceMetricsStatusResponses, ExternalServiceMetricsToggleData, ExternalServiceMetricsToggleErrors, ExternalServiceMetricsToggleResponses, ExternalServiceMetricsUpdateAlertRuleData, ExternalServiceMetricsUpdateAlertRuleErrors, ExternalServiceMetricsUpdateAlertRuleResponse, ExternalServiceMetricsUpdateAlertRuleResponses, ExternalServiceResetPgStatStatementsData, ExternalServiceResetPgStatStatementsErrors, ExternalServiceResetPgStatStatementsResponse, ExternalServiceResetPgStatStatementsResponses, ExternalServiceSummary, FieldResponse, FinalizeOrderData, FinalizeOrderErrors, FinalizeOrderResponse, FinalizeOrderResponses, FinalizeProjectReleaseData, FinalizeProjectReleaseErrors, FinalizeProjectReleaseResponse, FinalizeProjectReleaseResponses, FindConversationData, FindConversationErrors, FindConversationResponse, FindConversationResponses, FiringSeriesEntry, FlagEnvironmentResponse, FlagListResponse, FlagResponse, FlagSnapshot, FlagSnapshotResponse, FlagValueType, ForecastAlgorithm, ForecastParams, FullError, FullEvent, FullRequest, FunnelMetricsResponse, FunnelResponse, GatewayStatus, GenAiEvent, GenAiSpanDetail, GenAiTraceDetailResponse, GenAiTraceSummariesResponse, GenAiTraceSummary, GeneralStatsQuery, GeneralStatsResponse, GenerateDockerfileRequest, GenerateDockerfileResponse, GenerateJoinTokenData, GenerateJoinTokenErrors, GenerateJoinTokenResponse, GenerateJoinTokenResponse2, GenerateJoinTokenResponses, GeneratePresetDockerfileData, GeneratePresetDockerfileErrors, GeneratePresetDockerfileResponse, GeneratePresetDockerfileResponses, GeoLocationResponse, GeoRestrictionsConfig, GetAccessInfoData, GetAccessInfoErrors, GetAccessInfoResponse, GetAccessInfoResponses, GetActiveVisitorsData, GetActiveVisitorsErrors, GetActiveVisitorsResponse, GetActiveVisitorsResponses, GetActivityGraphData, GetActivityGraphErrors, GetActivityGraphResponse, GetActivityGraphResponses, GetAdminGateData, GetAdminGateErrors, GetAdminGateResponse, GetAdminGateResponses, GetAgentData, GetAgentErrors, GetAgentResponse, GetAgentResponses, GetAggregatedBucketsData, GetAggregatedBucketsErrors, GetAggregatedBucketsResponse, GetAggregatedBucketsResponses, GetAiAgentBreakdownData, GetAiAgentBreakdownError, GetAiAgentBreakdownErrors, GetAiAgentBreakdownResponse, GetAiAgentBreakdownResponses, GetAiAgentPagesData, GetAiAgentPagesError, GetAiAgentPagesErrors, GetAiAgentPagesResponse, GetAiAgentPagesResponses, GetAiAgentTimelineData, GetAiAgentTimelineError, GetAiAgentTimelineErrors, GetAiAgentTimelineResponse, GetAiAgentTimelineResponses, GetAiPageBreakdownData, GetAiPageBreakdownError, GetAiPageBreakdownErrors, GetAiPageBreakdownResponse, GetAiPageBreakdownResponses, GetAiStatusBreakdownData, GetAiStatusBreakdownError, GetAiStatusBreakdownErrors, GetAiStatusBreakdownResponse, GetAiStatusBreakdownResponses, GetAlertData, GetAlertError, GetAlertErrors, GetAlertResponse, GetAlertResponses, GetAlertRuleData, GetAlertRuleErrors, GetAlertRuleResponse, GetAlertRuleResponses, GetAllRepositoriesByNameData, GetAllRepositoriesByNameErrors, GetAllRepositoriesByNameResponse, GetAllRepositoriesByNameResponses, GetAnalyticsActiveVisitorsData, GetAnalyticsActiveVisitorsErrors, GetAnalyticsActiveVisitorsResponse, GetAnalyticsActiveVisitorsResponses, GetAnalyticsEventsCountData, GetAnalyticsEventsCountErrors, GetAnalyticsEventsCountResponse, GetAnalyticsEventsCountResponses, GetAnalyticsSessionEventsData, GetAnalyticsSessionEventsErrors, GetAnalyticsSessionEventsResponse, GetAnalyticsSessionEventsResponses, GetAnalyticsVisitorSessionsData, GetAnalyticsVisitorSessionsErrors, GetAnalyticsVisitorSessionsResponse, GetAnalyticsVisitorSessionsResponses, GetApiKeyData, GetApiKeyErrors, GetApiKeyPermissionsData, GetApiKeyPermissionsErrors, GetApiKeyPermissionsResponse, GetApiKeyPermissionsResponses, GetApiKeyResponse, GetApiKeyResponses, GetAuditLogData, GetAuditLogErrors, GetAuditLogResponse, GetAuditLogResponses, GetBackupData, GetBackupError, GetBackupErrors, GetBackupResponse, GetBackupResponses, GetBackupScheduleData, GetBackupScheduleErrors, GetBackupScheduleResponse, GetBackupScheduleResponses, GetBranchesByRepositoryIdData, GetBranchesByRepositoryIdErrors, GetBranchesByRepositoryIdResponse, GetBranchesByRepositoryIdResponses, GetBucketedIncidentsData, GetBucketedIncidentsErrors, GetBucketedIncidentsResponse, GetBucketedIncidentsResponses, GetBucketedStatusData, GetBucketedStatusErrors, GetBucketedStatusResponse, GetBucketedStatusResponses, GetChallengeTokenData, GetChallengeTokenErrors, GetChallengeTokenResponse, GetChallengeTokenResponses, GetChatReadinessData, GetChatReadinessErrors, GetChatReadinessResponse, GetChatReadinessResponses, GetCliStatusData, GetCliStatusErrors, GetCliStatusResponses, GetClusterHealthData, GetClusterHealthErrors, GetClusterHealthResponse, GetClusterHealthResponses, GetClusterMemberData, GetClusterMemberErrors, GetClusterMemberResponse, GetClusterMemberResponses, GetCmdData, GetCmdErrors, GetCmdResponse, GetCmdResponses, GetContainerDetailData, GetContainerDetailErrors, GetContainerDetailResponse, GetContainerDetailResponses, GetContainerEnvironmentVariableData, GetContainerEnvironmentVariableErrors, GetContainerEnvironmentVariableResponse, GetContainerEnvironmentVariableResponses, GetContainerInfoData, GetContainerInfoErrors, GetContainerInfoResponse, GetContainerInfoResponses, GetContainerLogsByIdData, GetContainerLogsByIdErrors, GetContainerLogsData, GetContainerLogsErrors, GetContainerMetricsData, GetContainerMetricsErrors, GetContainerMetricsResponse, GetContainerMetricsResponses, GetConversationData, GetConversationDetailData, GetConversationDetailError, GetConversationDetailErrors, GetConversationDetailResponse, GetConversationDetailResponses, GetConversationErrors, GetConversationResponse, GetConversationResponses, GetConversationsData, GetConversationsError, GetConversationsErrors, GetConversationsResponse, GetConversationsResponses, GetCronByIdData, GetCronByIdErrors, GetCronByIdResponse, GetCronByIdResponses, GetCronExecutionsData, GetCronExecutionsErrors, GetCronExecutionsResponse, GetCronExecutionsResponses, GetCrossProjectTraceSiblingsData, GetCrossProjectTraceSiblingsError, GetCrossProjectTraceSiblingsErrors, GetCrossProjectTraceSiblingsResponse, GetCrossProjectTraceSiblingsResponses, GetCurrentMonitorStatusData, GetCurrentMonitorStatusErrors, GetCurrentMonitorStatusResponse, GetCurrentMonitorStatusResponses, GetCurrentUserData, GetCurrentUserErrors, GetCurrentUserResponse, GetCurrentUserResponses, GetCustomDomainData, GetCustomDomainErrors, GetCustomDomainResponse, GetCustomDomainResponses, GetDashboardData, GetDashboardError, GetDashboardErrors, GetDashboardProjectsAnalyticsData, GetDashboardProjectsAnalyticsErrors, GetDashboardProjectsAnalyticsResponse, GetDashboardProjectsAnalyticsResponses, GetDashboardResponse, GetDashboardResponses, GetDeliveryData, GetDeliveryErrors, GetDeliveryResponse, GetDeliveryResponses, GetDeploymentContainerLogContentData, GetDeploymentContainerLogContentErrors, GetDeploymentContainerLogContentResponse, GetDeploymentContainerLogContentResponses, GetDeploymentData, GetDeploymentErrors, GetDeploymentJobLogsData, GetDeploymentJobLogsErrors, GetDeploymentJobLogsResponse, GetDeploymentJobLogsResponses, GetDeploymentJobsData, GetDeploymentJobsErrors, GetDeploymentJobsResponse, GetDeploymentJobsResponses, GetDeploymentOperationsData, GetDeploymentOperationsErrors, GetDeploymentOperationsResponse, GetDeploymentOperationsResponses, GetDeploymentOperationStatusData, GetDeploymentOperationStatusErrors, GetDeploymentOperationStatusResponse, GetDeploymentOperationStatusResponses, GetDeploymentResponse, GetDeploymentResponses, GetDeploymentsParams, GetDeploymentTokenData, GetDeploymentTokenErrors, GetDeploymentTokenResponse, GetDeploymentTokenResponses, GetDiskStatusData, GetDiskStatusErrors, GetDiskStatusResponse, GetDiskStatusResponses, GetDnsChangesData, GetDnsChangesErrors, GetDnsChangesResponse, GetDnsChangesResponses, GetDnsProviderData, GetDnsProviderErrors, GetDnsProviderResponse, GetDnsProviderResponses, GetDomainByHostData, GetDomainByHostErrors, GetDomainByHostResponse, GetDomainByHostResponses, GetDomainByIdData, GetDomainByIdErrors, GetDomainByIdResponse, GetDomainByIdResponses, GetDomainByNameData, GetDomainByNameErrors, GetDomainByNameResponse, GetDomainByNameResponses, GetDomainData, GetDomainDnsRecordsData, GetDomainDnsRecordsErrors, GetDomainDnsRecordsResponse, GetDomainDnsRecordsResponses, GetDomainErrors, GetDomainOrderData, GetDomainOrderErrors, GetDomainOrderResponse, GetDomainOrderResponses, GetDomainResponse, GetDomainResponses, GetEmailData, GetEmailErrors, GetEmailEventsData, GetEmailEventsErrors, GetEmailEventsResponse, GetEmailEventsResponses, GetEmailLinksData, GetEmailLinksErrors, GetEmailLinksResponse, GetEmailLinksResponses, GetEmailProviderData, GetEmailProviderErrors, GetEmailProviderResponse, GetEmailProviderResponses, GetEmailResponse, GetEmailResponses, GetEmailStatsData, GetEmailStatsErrors, GetEmailStatsResponse, GetEmailStatsResponses, GetEmailTrackingData, GetEmailTrackingErrors, GetEmailTrackingResponse, GetEmailTrackingResponses, GetEmailTrackingStatusData, GetEmailTrackingStatusErrors, GetEmailTrackingStatusResponse, GetEmailTrackingStatusResponses, GetEntityInfoData, GetEntityInfoErrors, GetEntityInfoResponse, GetEntityInfoResponses, GetEnvironmentCronsData, GetEnvironmentCronsErrors, GetEnvironmentCronsResponse, GetEnvironmentCronsResponses, GetEnvironmentData, GetEnvironmentDomainsData, GetEnvironmentDomainsErrors, GetEnvironmentDomainsResponse, GetEnvironmentDomainsResponses, GetEnvironmentErrors, GetEnvironmentResponse, GetEnvironmentResponses, GetEnvironmentsData, GetEnvironmentsErrors, GetEnvironmentsResponse, GetEnvironmentsResponses, GetEnvironmentVariablesData, GetEnvironmentVariablesErrors, GetEnvironmentVariablesQuery, GetEnvironmentVariablesResponse, GetEnvironmentVariablesResponses, GetEnvironmentVariableValueData, GetEnvironmentVariableValueErrors, GetEnvironmentVariableValueResponse, GetEnvironmentVariableValueResponses, GetErrorDashboardStatsData, GetErrorDashboardStatsErrors, GetErrorDashboardStatsResponse, GetErrorDashboardStatsResponses, GetErrorEventData, GetErrorEventErrors, GetErrorEventResponse, GetErrorEventResponses, GetErrorGroupData, GetErrorGroupErrors, GetErrorGroupResponse, GetErrorGroupResponses, GetErrorStatsData, GetErrorStatsErrors, GetErrorStatsResponse, GetErrorStatsResponses, GetErrorTimeSeriesData, GetErrorTimeSeriesErrors, GetErrorTimeSeriesResponse, GetErrorTimeSeriesResponses, GetEventDetailData, GetEventDetailErrors, GetEventDetailResponse, GetEventDetailResponses, GetEventEntriesData, GetEventEntriesErrors, GetEventEntriesResponse, GetEventEntriesResponses, GetEventsCountData, GetEventsCountErrors, GetEventsCountResponse, GetEventsCountResponses, GetEventsTimelineData, GetEventsTimelineErrors, GetEventsTimelineResponse, GetEventsTimelineResponses, GetEventTypeBreakdownData, GetEventTypeBreakdownErrors, GetEventTypeBreakdownResponse, GetEventTypeBreakdownResponses, GetEventVisitorsData, GetEventVisitorsErrors, GetEventVisitorsResponse, GetEventVisitorsResponses, GetExternalImageData, GetExternalImageErrors, GetExternalImageResponse, GetExternalImageResponses, GetFileData, GetFileErrors, GetFileResponse, GetFileResponses, GetFlagData, GetFlagErrors, GetFlagResponse, GetFlagResponses, GetFlagSnapshotData, GetFlagSnapshotErrors, GetFlagSnapshotResponse, GetFlagSnapshotResponses, GetFunnelMetricsData, GetFunnelMetricsErrors, GetFunnelMetricsQuery, GetFunnelMetricsResponse, GetFunnelMetricsResponses, GetGenaiTraceData, GetGenaiTraceError, GetGenaiTraceErrors, GetGenaiTraceResponse, GetGenaiTraceResponses, GetGeneralStatsData, GetGeneralStatsErrors, GetGeneralStatsResponse, GetGeneralStatsResponses, GetGitProviderData, GetGitProviderErrors, GetGitProviderResponse, GetGitProviderResponses, GetGlobalEventsData, GetGlobalEventsErrors, GetGlobalEventsResponse, GetGlobalEventsResponses, GetGlobalEventStatsData, GetGlobalEventStatsErrors, GetGlobalEventStatsResponse, GetGlobalEventStatsResponses, GetGlobalMcpData, GetGlobalMcpErrors, GetGlobalMcpResponse, GetGlobalMcpResponses, GetGlobalSandboxStatusData, GetGlobalSandboxStatusErrors, GetGlobalSandboxStatusResponse, GetGlobalSandboxStatusResponses, GetGlobalSkillData, GetGlobalSkillErrors, GetGlobalSkillResponse, GetGlobalSkillResponses, GetGroupedPageMetricsData, GetGroupedPageMetricsError, GetGroupedPageMetricsErrors, GetGroupedPageMetricsResponse, GetGroupedPageMetricsResponses, GetHealthData, GetHealthError, GetHealthErrors, GetHealthResponse, GetHealthResponses, GetHourlyVisitsData, GetHourlyVisitsErrors, GetHourlyVisitsResponse, GetHourlyVisitsResponses, GetHttpChallengeDebugData, GetHttpChallengeDebugErrors, GetHttpChallengeDebugResponse, GetHttpChallengeDebugResponses, GetImportStatusData, GetImportStatusErrors, GetImportStatusResponse, GetImportStatusResponses, GetIncidentData, GetIncidentErrors, GetIncidentResponse, GetIncidentResponses, GetIncidentUpdatesData, GetIncidentUpdatesErrors, GetIncidentUpdatesResponse, GetIncidentUpdatesResponses, GetIpAccessControlData, GetIpAccessControlError, GetIpAccessControlErrors, GetIpAccessControlResponse, GetIpAccessControlResponses, GetIpGeolocationData, GetIpGeolocationError, GetIpGeolocationErrors, GetIpGeolocationResponse, GetIpGeolocationResponses, GetJoinTokenStatusData, GetJoinTokenStatusErrors, GetJoinTokenStatusResponse, GetJoinTokenStatusResponses, GetLastDeploymentData, GetLastDeploymentErrors, GetLastDeploymentResponse, GetLastDeploymentResponses, GetLatestScanData, GetLatestScanError, GetLatestScanErrors, GetLatestScanResponse, GetLatestScanResponses, GetLatestScansPerEnvironmentData, GetLatestScansPerEnvironmentError, GetLatestScansPerEnvironmentErrors, GetLatestScansPerEnvironmentResponse, GetLatestScansPerEnvironmentResponses, GetLiveVisitorsListData, GetLiveVisitorsListErrors, GetLiveVisitorsListResponse, GetLiveVisitorsListResponses, GetLogContextData, GetLogContextError, GetLogContextErrors, GetLogContextResponse, GetLogContextResponses, GetMcpData, GetMcpErrors, GetMcpResponse, GetMcpResponses, GetMetricsOverTimeData, GetMetricsOverTimeError, GetMetricsOverTimeErrors, GetMetricsOverTimeResponse, GetMetricsOverTimeResponses, GetMonitorData, GetMonitorErrors, GetMonitorResponse, GetMonitorResponses, GetNotificationProviderData, GetNotificationProviderErrors, GetNotificationProviderResponse, GetNotificationProviderResponses, GetOnDemandCertStatusData, GetOnDemandCertStatusErrors, GetOnDemandCertStatusResponse, GetOnDemandCertStatusResponses, GetOrCreateDsnData, GetOrCreateDsnErrors, GetOrCreateDsnRequest, GetOrCreateDsnResponse, GetOrCreateDsnResponses, GetPageFlowData, GetPageFlowErrors, GetPageFlowResponse, GetPageFlowResponses, GetPageHourlySessionsData, GetPageHourlySessionsErrors, GetPageHourlySessionsResponse, GetPageHourlySessionsResponses, GetPagePathDetailData, GetPagePathDetailErrors, GetPagePathDetailResponse, GetPagePathDetailResponses, GetPagePathsData, GetPagePathsErrors, GetPagePathsResponse, GetPagePathsResponses, GetPagePathsSparklinesData, GetPagePathsSparklinesErrors, GetPagePathsSparklinesResponse, GetPagePathsSparklinesResponses, GetPagePathVisitorsData, GetPagePathVisitorsErrors, GetPagePathVisitorsResponse, GetPagePathVisitorsResponses, GetPendingActionData, GetPendingActionErrors, GetPendingActionResponse, GetPendingActionResponses, GetPerformanceMetricsData, GetPerformanceMetricsError, GetPerformanceMetricsErrors, GetPerformanceMetricsResponse, GetPerformanceMetricsResponses, GetPgUpgradeData, GetPgUpgradeErrors, GetPgUpgradeLogsData, GetPgUpgradeLogsErrors, GetPgUpgradeLogsResponse, GetPgUpgradeLogsResponses, GetPgUpgradeResponse, GetPgUpgradeResponses, GetPipelineStatsData, GetPipelineStatsError, GetPipelineStatsErrors, GetPipelineStatsResponse, GetPipelineStatsResponses, GetPlatformInfoData, GetPlatformInfoErrors, GetPlatformInfoResponse, GetPlatformInfoResponses, GetPostgresWalHealthData, GetPostgresWalHealthErrors, GetPostgresWalHealthResponse, GetPostgresWalHealthResponses, GetPreferencesData, GetPreferencesErrors, GetPreferencesResponse, GetPreferencesResponses, GetPreviewGatewayLogsData, GetPreviewGatewayLogsResponse, GetPreviewGatewayLogsResponses, GetPreviewGatewaySettingsData, GetPreviewGatewaySettingsResponse, GetPreviewGatewaySettingsResponses, GetPreviewGatewayStatusData, GetPreviewGatewayStatusResponse, GetPreviewGatewayStatusResponses, GetPricingData, GetPricingError, GetPricingErrors, GetPricingResponse, GetPricingResponses, GetPrivateIpData, GetPrivateIpErrors, GetPrivateIpResponses, GetProjectAlarmsSummaryData, GetProjectAlarmsSummaryErrors, GetProjectAlarmsSummaryResponse, GetProjectAlarmsSummaryResponses, GetProjectBySlugData, GetProjectBySlugErrors, GetProjectBySlugResponse, GetProjectBySlugResponses, GetProjectData, GetProjectDeploymentsData, GetProjectDeploymentsErrors, GetProjectDeploymentsResponse, GetProjectDeploymentsResponses, GetProjectErrors, GetProjectResponse, GetProjectResponses, GetProjectsData, GetProjectSecretsQuery, GetProjectsErrors, GetProjectServiceEnvironmentVariablesData, GetProjectServiceEnvironmentVariablesErrors, GetProjectServiceEnvironmentVariablesResponse, GetProjectServiceEnvironmentVariablesResponses, GetProjectSessionReplaysData, GetProjectSessionReplaysError, GetProjectSessionReplaysErrors, GetProjectSessionReplaysQuery, GetProjectSessionReplaysResponse, GetProjectSessionReplaysResponse2, GetProjectSessionReplaysResponses, GetProjectsHealthData, GetProjectsHealthError, GetProjectsHealthErrors, GetProjectsHealthResponse, GetProjectsHealthResponses, GetProjectsMonitorHealthData, GetProjectsMonitorHealthErrors, GetProjectsMonitorHealthResponse, GetProjectsMonitorHealthResponses, GetProjectsResponse, GetProjectsResponses, GetProjectStatisticsData, GetProjectStatisticsErrors, GetProjectStatisticsResponse, GetProjectStatisticsResponses, GetProjectTemplateData, GetProjectTemplateErrors, GetProjectTemplateResponse, GetProjectTemplateResponses, GetPropertyBreakdownData, GetPropertyBreakdownErrors, GetPropertyBreakdownResponse, GetPropertyBreakdownResponses, GetPropertyTimelineData, GetPropertyTimelineErrors, GetPropertyTimelineResponse, GetPropertyTimelineResponses, GetProviderConnectionsData, GetProviderConnectionsErrors, GetProviderConnectionsResponse, GetProviderConnectionsResponses, GetProviderMetadataData, GetProviderMetadataErrors, GetProviderMetadataResponse, GetProviderMetadataResponses, GetProvidersMetadataData, GetProvidersMetadataErrors, GetProvidersMetadataResponse, GetProvidersMetadataResponses, GetProxyLogByIdData, GetProxyLogByIdError, GetProxyLogByIdErrors, GetProxyLogByIdResponse, GetProxyLogByIdResponses, GetProxyLogByRequestIdData, GetProxyLogByRequestIdError, GetProxyLogByRequestIdErrors, GetProxyLogByRequestIdResponse, GetProxyLogByRequestIdResponses, GetProxyLogsData, GetProxyLogsError, GetProxyLogsErrors, GetProxyLogsResponse, GetProxyLogsResponses, GetPublicBranchesData, GetPublicBranchesErrors, GetPublicBranchesResponse, GetPublicBranchesResponses, GetPublicIpData, GetPublicIpErrors, GetPublicIpResponses, GetPublicRepositoryData, GetPublicRepositoryErrors, GetPublicRepositoryResponse, GetPublicRepositoryResponses, GetQuotaData, GetQuotaError, GetQuotaErrors, GetQuotaResponse, GetQuotaResponses, GetRecentActivityData, GetRecentActivityErrors, GetRecentActivityResponse, GetRecentActivityResponses, GetRemoteExternalImageData, GetRemoteExternalImageErrors, GetRemoteExternalImageResponse, GetRemoteExternalImageResponses, GetRepositoryBranchesData, GetRepositoryBranchesErrors, GetRepositoryBranchesResponse, GetRepositoryBranchesResponses, GetRepositoryByIdData, GetRepositoryByIdErrors, GetRepositoryByIdResponse, GetRepositoryByIdResponses, GetRepositoryByNameData, GetRepositoryByNameErrors, GetRepositoryByNameResponse, GetRepositoryByNameResponses, GetRepositoryPresetByNameData, GetRepositoryPresetByNameErrors, GetRepositoryPresetByNameResponse, GetRepositoryPresetByNameResponses, GetRepositoryPresetLiveData, GetRepositoryPresetLiveErrors, GetRepositoryPresetLiveResponse, GetRepositoryPresetLiveResponses, GetRepositoryTagsData, GetRepositoryTagsErrors, GetRepositoryTagsResponse, GetRepositoryTagsResponses, GetRequest, GetResolvedEnvironmentVariablesData, GetResolvedEnvironmentVariablesErrors, GetResolvedEnvironmentVariablesResponse, GetResolvedEnvironmentVariablesResponses, GetResolvedEnvironmentVariableValueData, GetResolvedEnvironmentVariableValueErrors, GetResolvedEnvironmentVariableValueResponse, GetResolvedEnvironmentVariableValueResponses, GetResponse, GetRestoreCapabilitiesData, GetRestoreCapabilitiesError, GetRestoreCapabilitiesErrors, GetRestoreCapabilitiesResponse, GetRestoreCapabilitiesResponses, GetRestoreRunData, GetRestoreRunError, GetRestoreRunErrors, GetRestoreRunResponse, GetRestoreRunResponses, GetRouteData, GetRouteErrors, GetRouteResponse, GetRouteResponses, GetRunData, GetRunErrors, GetRunResponse, GetRunResponses, GetRunWithLogsData, GetRunWithLogsErrors, GetRunWithLogsResponse, GetRunWithLogsResponses, GetS3CredentialsData, GetS3CredentialsErrors, GetS3CredentialsResponse, GetS3CredentialsResponses, GetS3SourceData, GetS3SourceError, GetS3SourceErrors, GetS3SourceResponse, GetS3SourceResponses, GetSandboxData, GetSandboxErrors, GetSandboxResponse, GetSandboxResponses, GetSandboxStatusData, GetSandboxStatusErrors, GetSandboxStatusResponse, GetSandboxStatusResponses, GetScanByDeploymentData, GetScanByDeploymentError, GetScanByDeploymentErrors, GetScanByDeploymentResponse, GetScanByDeploymentResponses, GetScanData, GetScanError, GetScanErrors, GetScanResponse, GetScanResponses, GetScanVulnerabilitiesData, GetScanVulnerabilitiesError, GetScanVulnerabilitiesErrors, GetScanVulnerabilitiesResponse, GetScanVulnerabilitiesResponses, GetServiceBySlugData, GetServiceBySlugErrors, GetServiceBySlugResponse, GetServiceBySlugResponses, GetServiceData, GetServiceEnvironmentVariableData, GetServiceEnvironmentVariableErrors, GetServiceEnvironmentVariableResponse, GetServiceEnvironmentVariableResponses, GetServiceEnvironmentVariablesData, GetServiceEnvironmentVariablesErrors, GetServiceEnvironmentVariablesResponse, GetServiceEnvironmentVariablesResponses, GetServiceErrors, GetServiceHealthStatusData, GetServiceHealthStatusErrors, GetServiceHealthStatusResponse, GetServiceHealthStatusResponses, GetServicePreviewEnvironmentVariableNamesData, GetServicePreviewEnvironmentVariableNamesErrors, GetServicePreviewEnvironmentVariableNamesResponse, GetServicePreviewEnvironmentVariableNamesResponses, GetServicePreviewEnvironmentVariablesMaskedData, GetServicePreviewEnvironmentVariablesMaskedErrors, GetServicePreviewEnvironmentVariablesMaskedResponse, GetServicePreviewEnvironmentVariablesMaskedResponses, GetServiceResponse, GetServiceResponses, GetServiceRuntimeData, GetServiceRuntimeErrors, GetServiceRuntimeResponse, GetServiceRuntimeResponses, GetServiceStatsData, GetServiceStatsErrors, GetServiceStatsResponse, GetServiceStatsResponses, GetServiceTypeParametersData, GetServiceTypeParametersErrors, GetServiceTypeParametersResponses, GetServiceTypesData, GetServiceTypesErrors, GetServiceTypesResponse, GetServiceTypesResponses, GetSessionDetailsData, GetSessionDetailsErrors, GetSessionDetailsResponse, GetSessionDetailsResponses, GetSessionEventsData, GetSessionEventsErrors, GetSessionEventsResponse, GetSessionEventsResponses, GetSessionLogsData, GetSessionLogsErrors, GetSessionLogsResponse, GetSessionLogsResponses, GetSessionReplayData, GetSessionReplayError, GetSessionReplayErrors, GetSessionReplayEventsData, GetSessionReplayEventsError, GetSessionReplayEventsErrors, GetSessionReplayEventsResponse, GetSessionReplayEventsResponses, GetSessionReplayResponse, GetSessionReplayResponse2, GetSessionReplayResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponse, GetSettingsResponses, GetSkillData, GetSkillErrors, GetSkillResponse, GetSkillResponses, GetSlowQueriesData, GetSlowQueriesErrors, GetSlowQueriesResponse, GetSlowQueriesResponses, GetStaticBundleData, GetStaticBundleErrors, GetStaticBundleResponse, GetStaticBundleResponses, GetStatusOverviewData, GetStatusOverviewErrors, GetStatusOverviewResponse, GetStatusOverviewResponses, GetTagsByRepositoryIdData, GetTagsByRepositoryIdErrors, GetTagsByRepositoryIdResponse, GetTagsByRepositoryIdResponses, GetTeamData, GetTeamErrors, GetTeamResponse, GetTeamResponses, GetTimeBucketStatsData, GetTimeBucketStatsError, GetTimeBucketStatsErrors, GetTimeBucketStatsResponse, GetTimeBucketStatsResponses, GetTodayStatsData, GetTodayStatsError, GetTodayStatsErrors, GetTodayStatsResponse, GetTodayStatsResponses, GetTraceData, GetTraceError, GetTraceErrors, GetTraceResponse, GetTraceResponses, GetUnifiedTraceData, GetUnifiedTraceError, GetUnifiedTraceErrors, GetUnifiedTraceResponse, GetUnifiedTraceResponses, GetUniqueCountsData, GetUniqueCountsErrors, GetUniqueCountsResponse, GetUniqueCountsResponses, GetUniqueEventsData, GetUniqueEventsErrors, GetUniqueEventsQuery, GetUniqueEventsResponse, GetUniqueEventsResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponse, GetUpdateStatusResponses, GetUptimeHistoryData, GetUptimeHistoryErrors, GetUptimeHistoryResponse, GetUptimeHistoryResponses, GetUsageByProviderData, GetUsageByProviderError, GetUsageByProviderErrors, GetUsageByProviderResponse, GetUsageByProviderResponses, GetUsageRecentData, GetUsageRecentError, GetUsageRecentErrors, GetUsageRecentResponse, GetUsageRecentResponses, GetUsageSummaryData, GetUsageSummaryError, GetUsageSummaryErrors, GetUsageSummaryResponse, GetUsageSummaryResponses, GetUsageTimeseriesData, GetUsageTimeseriesError, GetUsageTimeseriesErrors, GetUsageTimeseriesResponse, GetUsageTimeseriesResponses, GetUsageTopModelsData, GetUsageTopModelsError, GetUsageTopModelsErrors, GetUsageTopModelsResponse, GetUsageTopModelsResponses, GetVisitorByGuidData, GetVisitorByGuidErrors, GetVisitorByGuidResponse, GetVisitorByGuidResponses, GetVisitorByIdData, GetVisitorByIdErrors, GetVisitorByIdResponse, GetVisitorByIdResponses, GetVisitorDetailsData, GetVisitorDetailsErrors, GetVisitorDetailsResponse, GetVisitorDetailsResponses, GetVisitorFacetsData, GetVisitorFacetsErrors, GetVisitorFacetsResponse, GetVisitorFacetsResponses, GetVisitorInfoData, GetVisitorInfoErrors, GetVisitorInfoResponse, GetVisitorInfoResponses, GetVisitorJourneyData, GetVisitorJourneyErrors, GetVisitorJourneyResponse, GetVisitorJourneyResponses, GetVisitorsData, GetVisitorsErrors, GetVisitorSessionsData, GetVisitorSessionsError, GetVisitorSessionsErrors, GetVisitorSessionsQuery, GetVisitorSessionsResponse, GetVisitorSessionsResponse2, GetVisitorSessionsResponses, GetVisitorsResponse, GetVisitorsResponses, GetVisitorStatsData, GetVisitorStatsErrors, GetVisitorStatsResponse, GetVisitorStatsResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponse, GetWebhookResponses, GitPushEvent, GitRefResponse, GitSourcePlan, GlobalConversationResponse, GlobalEventStatsResponse, GlobalMrrResponse, GlobalRecentEventResponse, GlobalRevenueSummaryResponse, GrantProjectAccessData, GrantProjectAccessErrors, GrantProjectAccessResponse, GrantProjectAccessResponses, GroupedPageMetric, GroupedPageMetricsQuery, GroupedPageMetricsResponse, HandleGitProviderOauthCallbackData, HandleGitProviderOauthCallbackErrors, HasAnalyticsEventsData, HasAnalyticsEventsErrors, HasAnalyticsEventsResponse, HasAnalyticsEventsResponse2, HasAnalyticsEventsResponses, HasErrorGroupsData, HasErrorGroupsErrors, HasErrorGroupsResponse, HasErrorGroupsResponse2, HasErrorGroupsResponses, HasEventsQuery, HasEventsResponse, HasMetricsQuery, HasMetricsResponse, HasPerformanceMetricsData, HasPerformanceMetricsError, HasPerformanceMetricsErrors, HasPerformanceMetricsResponse, HasPerformanceMetricsResponses, HealthCheckConfiguration, HealthCheckEntryResponse, HealthResponse, HealthStatus, HealthSummary, HeartbeatApiRequest, HeartbeatResponse, HierarchyLevel, HistogramSummary, HostnameChange, HostnamePreviewResponse, HourlyPageSessions, HourlyVisitsQuery, HttpChallengeDebugResponse, ImportCredentials, ImportExecutionStatus, ImportExternalServiceData, ImportExternalServiceErrors, ImportExternalServiceRequest, ImportExternalServiceResponse, ImportExternalServiceResponses, ImportOutcomeResponse, ImportPlan, ImportRowErrorResponse, ImportSelector, ImportSource, ImportSourceCapabilities, ImportSourceInfo, ImportStatusResponse, IncidentBucket, IncidentBucketedResponse, IncidentResponse, IncidentUpdateResponse, IncrRequest, IncrResponse, IngestLogsByPathData, IngestLogsByPathError, IngestLogsByPathErrors, IngestLogsByPathResponses, IngestLogsData, IngestLogsError, IngestLogsErrors, IngestLogsResponses, IngestMetricsByPathData, IngestMetricsByPathError, IngestMetricsByPathErrors, IngestMetricsByPathResponses, IngestMetricsData, IngestMetricsError, IngestMetricsErrors, IngestMetricsResponses, IngestSentryEnvelopeData, IngestSentryEnvelopeErrors, IngestSentryEnvelopeResponses, IngestSentryEventData, IngestSentryEventErrors, IngestSentryEventResponse, IngestSentryEventResponses, IngestTracesByPathData, IngestTracesByPathError, IngestTracesByPathErrors, IngestTracesByPathResponses, IngestTracesData, IngestTracesError, IngestTracesErrors, IngestTracesResponses, InitAuthResponse, InitSessionReplayData, InitSessionReplayError, InitSessionReplayErrors, InitSessionReplayResponse, InitSessionReplayResponses, Insight, InsightSeverity, InsightsResponse, InsightStatus, InspectDropArchiveData, InspectDropArchiveErrors, InspectDropArchiveResponse, InspectDropArchiveResponses, IntegrationResponse, IpAccessControlQuery, IpAccessControlResponse, JobLogsData, JobLogsErrors, JobLogsResponses, JobStatusData, JobStatusErrors, JobStatusResponse, JobStatusResponse2, JobStatusResponses, JobSummaryResponse, JoinTokenStatusResponse, JourneyEvent, JourneySession, KeysRequest, KeysResponse, KillJobBody, KillJobData, KillJobErrors, KillJobResponse, KillJobResponses, KnownAiAgentsResponse, KvDelData, KvDelErrors, KvDelResponse, KvDelResponses, KvDisableData, KvDisableErrors, KvDisableResponse, KvDisableResponses, KvEnableData, KvEnableErrors, KvEnableResponse, KvEnableResponses, KvExpireData, KvExpireErrors, KvExpireResponse, KvExpireResponses, KvGetData, KvGetErrors, KvGetResponse, KvGetResponses, KvIncrData, KvIncrErrors, KvIncrResponse, KvIncrResponses, KvKeysData, KvKeysErrors, KvKeysResponse, KvKeysResponses, KvSetData, KvSetErrors, KvSetResponse, KvSetResponses, KvStatusData, KvStatusErrors, KvStatusResponse, KvStatusResponse2, KvStatusResponses, KvTtlData, KvTtlErrors, KvTtlResponse, KvTtlResponses, KvUpdateData, KvUpdateErrors, KvUpdateResponse, KvUpdateResponses, LatestRunForSourceData, LatestRunForSourceErrors, LatestRunForSourceResponse, LatestRunForSourceResponses, LemonSqueezyConfig, LetsEncryptSettings, LineContext, LinkCustomDomainToCertificateData, LinkCustomDomainToCertificateErrors, LinkCustomDomainToCertificateResponse, LinkCustomDomainToCertificateResponses, LinkServiceRequest, LinkServiceToProjectData, LinkServiceToProjectErrors, LinkServiceToProjectResponse, LinkServiceToProjectResponses, ListAgentRunsData, ListAgentRunsErrors, ListAgentRunsResponse, ListAgentRunsResponses, ListAgentsData, ListAgentsErrors, ListAgentsResponse, ListAgentsResponse2, ListAgentsResponses, ListAiProvidersData, ListAiProvidersErrors, ListAiProvidersResponse, ListAiProvidersResponses, ListAlertRulesData, ListAlertRulesErrors, ListAlertRulesResponse, ListAlertRulesResponses, ListAlertsData, ListAlertsError, ListAlertsErrors, ListAlertsResponse, ListAlertsResponses, ListAllConversationsData, ListAllConversationsErrors, ListAllConversationsResponse, ListAllConversationsResponses, ListAllRunsData, ListAllRunsErrors, ListAllRunsResponse, ListAllRunsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysQuery, ListApiKeysResponse, ListApiKeysResponses, ListAuditLogsData, ListAuditLogsErrors, ListAuditLogsQuery, ListAuditLogsResponse, ListAuditLogsResponses, ListAvailableContainersData, ListAvailableContainersErrors, ListAvailableContainersResponse, ListAvailableContainersResponses, ListBackupAlertsData, ListBackupAlertsError, ListBackupAlertsErrors, ListBackupAlertsResponse, ListBackupAlertsResponses, ListBackupChildrenData, ListBackupChildrenError, ListBackupChildrenErrors, ListBackupChildrenResponse, ListBackupChildrenResponses, ListBackupSchedulesData, ListBackupSchedulesError, ListBackupSchedulesErrors, ListBackupSchedulesResponse, ListBackupSchedulesResponses, ListBackupsForScheduleData, ListBackupsForScheduleErrors, ListBackupsForScheduleResponse, ListBackupsForScheduleResponses, ListBlobsQuery, ListBlobsResponse, ListCommitsByRepositoryIdData, ListCommitsByRepositoryIdErrors, ListCommitsByRepositoryIdResponse, ListCommitsByRepositoryIdResponses, ListConnectionsData, ListConnectionsErrors, ListConnectionsResponse, ListConnectionsResponses, ListContainersAtPathData, ListContainersAtPathErrors, ListContainersAtPathResponse, ListContainersAtPathResponses, ListContainersData, ListContainersErrors, ListContainersResponse, ListContainersResponses, ListConversationsData, ListConversationsErrors, ListConversationsResponse, ListConversationsResponses, ListCustomDomainsForProjectData, ListCustomDomainsForProjectErrors, ListCustomDomainsForProjectResponse, ListCustomDomainsForProjectResponses, ListCustomDomainsResponse, ListDashboardsData, ListDashboardsError, ListDashboardsErrors, ListDashboardsResponse, ListDashboardsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponse, ListDeliveriesResponses, ListDeploymentContainerLogsData, ListDeploymentContainerLogsErrors, ListDeploymentContainerLogsResponse, ListDeploymentContainerLogsResponses, ListDeploymentTokensData, ListDeploymentTokensErrors, ListDeploymentTokensQuery, ListDeploymentTokensResponse, ListDeploymentTokensResponses, ListDnsProvidersData, ListDnsProvidersErrors, ListDnsProvidersResponse, ListDnsProvidersResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponse, ListDomainsResponse2, ListDomainsResponses, ListDsnsData, ListDsnsErrors, ListDsnsResponse, ListDsnsResponses, ListEmailDomainsData, ListEmailDomainsErrors, ListEmailDomainsResponse, ListEmailDomainsResponses, ListEmailProvidersData, ListEmailProvidersErrors, ListEmailProvidersResponse, ListEmailProvidersResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponse, ListEmailsResponses, ListEnrollmentTokensData, ListEnrollmentTokensErrors, ListEnrollmentTokensResponse, ListEnrollmentTokensResponses, ListEntitiesData, ListEntitiesErrors, ListEntitiesQuery, ListEntitiesResponse, ListEntitiesResponses, ListErrorEventsData, ListErrorEventsErrors, ListErrorEventsQuery, ListErrorEventsResponse, ListErrorEventsResponses, ListErrorGroupsData, ListErrorGroupsErrors, ListErrorGroupsQuery, ListErrorGroupsResponse, ListErrorGroupsResponses, ListEventsData, ListEventsResponse, ListEventsResponses, ListEventTypesData, ListEventTypesResponse, ListEventTypesResponses, ListExternalImagesData, ListExternalImagesErrors, ListExternalImagesResponse, ListExternalImagesResponses, ListExternalPluginsData, ListExternalPluginsErrors, ListExternalPluginsResponse, ListExternalPluginsResponses, ListExternalServiceBackupsData, ListExternalServiceBackupsError, ListExternalServiceBackupsErrors, ListExternalServiceBackupsResponse, ListExternalServiceBackupsResponses, ListFlagsData, ListFlagsErrors, ListFlagsResponse, ListFlagsResponses, ListFunnelsData, ListFunnelsErrors, ListFunnelsResponse, ListFunnelsResponses, ListGitProvidersData, ListGitProvidersErrors, ListGitProvidersResponse, ListGitProvidersResponses, ListGlobalMcpsData, ListGlobalMcpsErrors, ListGlobalMcpsResponse, ListGlobalMcpsResponses, ListGlobalSkillsData, ListGlobalSkillsErrors, ListGlobalSkillsResponse, ListGlobalSkillsResponses, ListIncidentsData, ListIncidentsErrors, ListIncidentsResponses, ListInsightsData, ListInsightsError, ListInsightsErrors, ListInsightsResponse, ListInsightsResponses, ListIpAccessControlData, ListIpAccessControlError, ListIpAccessControlErrors, ListIpAccessControlResponse, ListIpAccessControlResponses, ListJobsData, ListJobsErrors, ListJobsResponse, ListJobsResponse2, ListJobsResponses, ListKnownAiAgentsData, ListKnownAiAgentsError, ListKnownAiAgentsErrors, ListKnownAiAgentsResponse, ListKnownAiAgentsResponses, ListManagedDomainsData, ListManagedDomainsErrors, ListManagedDomainsResponse, ListManagedDomainsResponses, ListMcpsData, ListMcpsErrors, ListMcpsResponse, ListMcpsResponse2, ListMcpsResponses, ListMetricLabelKeysData, ListMetricLabelKeysError, ListMetricLabelKeysErrors, ListMetricLabelKeysResponse, ListMetricLabelKeysResponses, ListMetricLabelValuesData, ListMetricLabelValuesError, ListMetricLabelValuesErrors, ListMetricLabelValuesResponse, ListMetricLabelValuesResponses, ListMetricNamesData, ListMetricNamesError, ListMetricNamesErrors, ListMetricNamesResponse, ListMetricNamesResponses, ListModelsData, ListModelsError, ListModelsErrors, ListModelsResponse, ListModelsResponses, ListMonitorsData, ListMonitorsErrors, ListMonitorsResponse, ListMonitorsResponses, ListNotificationProvidersData, ListNotificationProvidersErrors, ListNotificationProvidersResponse, ListNotificationProvidersResponses, ListOidcProvidersData, ListOidcProvidersResponse, ListOidcProvidersResponses, ListOidcProviderUsersData, ListOidcProviderUsersErrors, ListOidcProviderUsersResponse, ListOidcProviderUsersResponses, ListOidcRoleMappingsData, ListOidcRoleMappingsResponse, ListOidcRoleMappingsResponses, ListOnDemandCertsData, ListOnDemandCertsErrors, ListOnDemandCertsResponse, ListOnDemandCertsResponse2, ListOnDemandCertsResponses, ListOrdersData, ListOrdersErrors, ListOrdersResponse, ListOrdersResponse2, ListOrdersResponses, ListPeersData, ListPeersErrors, ListPeersResponse, ListPeersResponses, ListPendingActionsData, ListPendingActionsErrors, ListPendingActionsResponse, ListPendingActionsResponses, ListPgUpgradesData, ListPgUpgradesErrors, ListPgUpgradesResponse, ListPgUpgradesResponses, ListPresetsData, ListPresetsErrors, ListPresetsResponse, ListPresetsResponse2, ListPresetsResponses, ListProjectAccessData, ListProjectAccessErrors, ListProjectAccessResponse, ListProjectAccessResponses, ListProjectAlarmsData, ListProjectAlarmsErrors, ListProjectAlarmsResponse, ListProjectAlarmsResponses, ListProjectScansData, ListProjectScansError, ListProjectScansErrors, ListProjectScansResponse, ListProjectScansResponses, ListProjectSecretsData, ListProjectSecretsErrors, ListProjectSecretsResponse, ListProjectSecretsResponses, ListProjectServicesData, ListProjectServicesErrors, ListProjectServicesResponse, ListProjectServicesResponses, ListProjectTemplatesData, ListProjectTemplatesErrors, ListProjectTemplatesResponse, ListProjectTemplatesResponses, ListProjectTemplateTagsData, ListProjectTemplateTagsErrors, ListProjectTemplateTagsResponse, ListProjectTemplateTagsResponses, ListProviderKeysData, ListProviderKeysError, ListProviderKeysErrors, ListProviderKeysResponse, ListProviderKeysResponses, ListProviderZonesData, ListProviderZonesErrors, ListProviderZonesResponse, ListProviderZonesResponses, ListPublicProvidersData, ListPublicProvidersResponse, ListPublicProvidersResponses, ListReleaseFilesData, ListReleaseFilesErrors, ListReleaseFilesResponse, ListReleaseFilesResponses, ListReleasesData, ListReleasesErrors, ListReleasesResponse, ListReleasesResponses, ListRemoteExternalImagesData, ListRemoteExternalImagesErrors, ListRemoteExternalImagesResponse, ListRemoteExternalImagesResponses, ListRepositoriesByConnectionData, ListRepositoriesByConnectionErrors, ListRepositoriesByConnectionResponse, ListRepositoriesByConnectionResponses, ListRepositoriesByProviderData, ListRepositoriesByProviderErrors, ListRepositoriesByProviderResponse, ListRepositoriesByProviderResponses, ListRestoreRunsForServiceData, ListRestoreRunsForServiceResponse, ListRestoreRunsForServiceResponses, ListRootContainersData, ListRootContainersErrors, ListRootContainersResponse, ListRootContainersResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponse, ListRoutesResponses, ListRunsResponse, ListS3SourcesData, ListS3SourcesError, ListS3SourcesErrors, ListS3SourcesResponse, ListS3SourcesResponses, ListSandboxesData, ListSandboxesResponse, ListSandboxesResponse2, ListSandboxesResponses, ListScansQuery, ListScheduleRunJobsData, ListScheduleRunJobsError, ListScheduleRunJobsErrors, ListScheduleRunJobsResponse, ListScheduleRunJobsResponses, ListScheduleRunsData, ListScheduleRunsError, ListScheduleRunsErrors, ListScheduleRunsResponse, ListScheduleRunsResponses, ListScheduleServicesData, ListScheduleServicesError, ListScheduleServicesErrors, ListScheduleServicesResponse, ListScheduleServicesResponses, ListSecretsData, ListSecretsErrors, ListSecretsResponse, ListSecretsResponse2, ListSecretsResponses, ListServiceHealthStatusesData, ListServiceHealthStatusesErrors, ListServiceHealthStatusesResponse, ListServiceHealthStatusesResponses, ListServiceProjectsData, ListServiceProjectsErrors, ListServiceProjectsResponse, ListServiceProjectsResponses, ListServiceSchedulesData, ListServiceSchedulesError, ListServiceSchedulesErrors, ListServiceSchedulesResponse, ListServiceSchedulesResponses, ListServicesData, ListServicesErrors, ListServicesResponse, ListServicesResponses, ListSkillsData, ListSkillsErrors, ListSkillsResponse, ListSkillsResponse2, ListSkillsResponses, ListSourceBackupsData, ListSourceBackupsError, ListSourceBackupsErrors, ListSourceBackupsResponse, ListSourceBackupsResponses, ListSourceFilesData, ListSourceFilesErrors, ListSourceFilesResponse, ListSourceFilesResponses, ListSourceMapsData, ListSourceMapsErrors, ListSourceMapsResponse, ListSourceMapsResponses, ListSourcesData, ListSourcesErrors, ListSourcesResponse, ListSourcesResponses, ListStaticBundlesData, ListStaticBundlesErrors, ListStaticBundlesResponse, ListStaticBundlesResponses, ListSyncedRepositoriesData, ListSyncedRepositoriesErrors, ListSyncedRepositoriesResponse, ListSyncedRepositoriesResponses, ListTagsResponse, ListTeamMembersData, ListTeamMembersErrors, ListTeamMembersResponse, ListTeamMembersResponses, ListTeamProjectsData, ListTeamProjectsErrors, ListTeamProjectsResponse, ListTeamProjectsResponses, ListTeamsData, ListTeamsErrors, ListTeamsResponse, ListTeamsResponses, ListTemplatesQuery, ListTemplatesResponse, ListUsersData, ListUsersErrors, ListUsersResponse, ListUsersResponses, ListVulnerabilitiesQuery, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponse, ListWebhooksResponses, LiveVisitorInfo, LiveVisitorsListResponse, LocationCount, LocationGranularity, LocationInfo, LoginData, LoginErrors, LoginRequest, LoginResponse, LoginResponses, LogLevel, LogoutData, LogoutErrors, LogoutResponses, LogRecord, LogSearchLine, LogSeverity, LogSource, LogsQuery, LogsResponse, LogStream, LookupDnsARecordsData, LookupDnsARecordsError, LookupDnsARecordsErrors, LookupDnsARecordsResponse, LookupDnsARecordsResponses, ManagedDomainResponse, ManualAction, ManualActionTiming, McpDefinitionResponse, MessageContent, MessagePart, MessageResponse, MeteredMode, MetricAggregation, MetricBucket, MetricDataPoint, MetricsOverTimeResponse, MetricsQuery, MetricsRangeQuery, MetricsStatusResponse, MetricsStoreKind, MetricsSummaryResponse, MetricType, MfaRequiredResponse, MfaSetupResponse, MfaVerificationRequest, MigrationStep, MigrationSummary, MintEnrollmentTokenData, MintEnrollmentTokenErrors, MintEnrollmentTokenRequest, MintEnrollmentTokenResponse, MintEnrollmentTokenResponse2, MintEnrollmentTokenResponses, MiscResult, MkdirBody, MkdirData, MkdirErrors, MkdirResponse, MkdirResponses, ModelInfo, ModelListResponse, ModelPricing, ModelUsage, MonitoringSettings, MonitoringSettingsMasked, MonitorResponse, MonitorStatus, MrrBucketResponse, MultiNodeSettings, MultiNodeSettingsMasked, MxResult, NavEntry, NavSection, NetworkConfiguration, NetworkMode, NixpacksPresetConfig, NixpacksProvider, NodeContainerListResponse, NodeContainerResponse, NodeCostInfo, NodeHeartbeatData, NodeHeartbeatErrors, NodeHeartbeatResponse, NodeHeartbeatResponses, NodeInfoResponse, NodeListResponse, NodeMetricsGetRangeData, NodeMetricsGetRangeErrors, NodeMetricsGetRangeResponse, NodeMetricsGetRangeResponses, NotificationPreferencesResponse, NotificationProviderResponse, ObservabilityCompressionSettings, ObservabilityEvent, ObservabilityFullEventData, ObservabilityFullEventError, ObservabilityFullEventErrors, ObservabilityFullEventResponse, ObservabilityFullEventResponses, ObservabilityListEventsData, ObservabilityListEventsError, ObservabilityListEventsErrors, ObservabilityListEventsResponse, ObservabilityListEventsResponses, ObservabilityRetentionSettings, OidcCallbackData, OidcProviderResponse, OidcProvidersListResponse, OidcProviderSummary, OidcProviderUserResponse, OidcRoleMappingResponse, OidcTestConnectionResponse, OnDemandCertAttemptResponse, OnDemandCertRow, OnDemandTlsSettings, OpenAiError, OpenAiErrorResponse, OperatingSystemCount, OperationResultResponse, OperationResultsResponse, OtelDashboardResponse, OtelDashboardsResponse, OtelMetricAlertRuleResponse, OtelMetricAlertsResponse, OtelMetricLabelKeysResponse, OtelMetricLabelValuesResponse, OtelMetricNamesResponse, OtelMetricsResponse, OutlierAlgorithm, OutlierParams, OverprovisioningAssessment, OverprovisioningVerdict, PageActivityBucket, PageCountryStats, PageFlowEntry, PageFlowQuery, PageFlowResponse, PageHourlySessionsQuery, PageHourlySessionsResponse, PagePathDetailQuery, PagePathDetailResponse, PagePathInfo, PagePathSparkline, PagePathSparklinePoint, PagePathsQuery, PagePathsResponse, PagePathsSparklineQuery, PagePathsSparklineResponse, PagePathVisitorsQuery, PagePathVisitorsResponse, PageReferrerStats, PagesComparisonResponse, PageSessionComparison, PageSessionStats, PageSessionStatsQuery, PageTransition, PageVisit, PageVisitorSession, PaginatedEmailsResponse, PaginatedEntitiesResponse, PaginatedErrorEventsResponse, PaginatedErrorGroupsResponse, PaginatedEventsResponse, PaginatedExternalImagesResponse, PaginatedProjectList, PaginatedStaticBundlesResponse, Pagination, PaginationMeta, PaginationParams, PasswordProtectionConfig, PatchAdminGateData, PatchAdminGateErrors, PatchAdminGateResponse, PatchAdminGateResponses, PatchPreviewGatewaySettingsData, PatchPreviewGatewaySettingsResponse, PatchPreviewGatewaySettingsResponses, PatchSettingsRequest, PathVisitors, PathVisitorsAnalyticsQuery, PathVisitorsResponse, PauseDeploymentData, PauseDeploymentErrors, PauseDeploymentResponse, PauseDeploymentResponses, PauseSandboxData, PauseSandboxErrors, PauseSandboxResponse, PauseSandboxResponses, PeerEntry, PeerListResponse, PendingActionResponse, PerformanceMetricsQuery, PerformanceMetricsResponse, PermissionInfo, PgUpgradeLogResponse, PgUpgradeResponse, PipelineStats, PipelineStatsResponse, PlanComplexity, PlanMetadata, PlanRestoreData, PlanRestoreError, PlanRestoreErrors, PlanRestoreResponse, PlanRestoreResponses, PlanSourceBackup, PlanTarget, PlatformInfo, PluginManifest, PortMapping, PostDnsAckData, PostDnsAckErrors, PostDnsAckResponse, PostDnsAckResponses, PostgresWalHealth, PresetConfigSchema, PresetInfo, PresetResponse, PreviewAlertData, PreviewAlertError, PreviewAlertErrors, PreviewAlertResponse, PreviewAlertResponses, PreviewFunnelMetricsData, PreviewFunnelMetricsErrors, PreviewFunnelMetricsResponse, PreviewFunnelMetricsResponses, PreviewGatewaySettings, PreviewGatewaySettingsMasked, PreviewGatewaySettingsResponse, PreviewHostnameModeData, PreviewHostnameModeErrors, PreviewHostnameModeResponse, PreviewHostnameModeResponses, PreviewShareLinkBody, PreviewShareLinkResponse, PricingResponse, ProblemDetails, ProjectAccessResponse, ProjectConfiguration, ProjectDashboardAnalytics, ProjectDsnResponse, ProjectHealthSummary, ProjectInfo, ProjectMonitorHealth, ProjectPresetResponse, ProjectQuery, ProjectRef, ProjectResponse, ProjectSecretEnvironmentInfo, ProjectSecretResponse, ProjectServiceInfo, ProjectsHealthResponse, ProjectsMonitorHealthResponse, ProjectStatisticsResponse, ProjectStatsBreakdown, ProjectType, ProjectUsageInfoResponse, PromoteClusterMemberData, PromoteClusterMemberErrors, PromoteClusterMemberResponses, PromoteDeploymentData, PromoteDeploymentErrors, PromoteDeploymentRequest, PromoteDeploymentResponse, PromoteDeploymentResponses, PropertyBreakdownItem, PropertyBreakdownQuery, PropertyBreakdownResponse, PropertyColumn, PropertyTimelineItem, PropertyTimelineQuery, PropertyTimelineResponse, Protocol, ProviderCatalogDto, ProviderCatalogResponse, ProviderConfig, ProviderConfigMasked, ProviderDeletionCheckResponse, ProviderDescriptor, ProviderKeyResponse, ProviderMetadata, ProviderResponse, ProviderUsage, ProvisionDomainData, ProvisionDomainErrors, ProvisionDomainResponse, ProvisionDomainResponses, ProvisionResponse, ProxyLogResponse, ProxyLogsPaginatedResponse, PublicHostnameStrategy, PublicPresetResponse, PublicRepositoryInfo, PurgeLogsRequest, PurgeProjectLogsData, PurgeProjectLogsError, PurgeProjectLogsErrors, PurgeProjectLogsResponses, PushedExternalImageResponse, PushExternalImageData, PushExternalImageErrors, PushExternalImageResponse, PushExternalImageResponses, PushImageRequest, QueryDataData, QueryDataErrors, QueryDataRequest, QueryDataResponse, QueryDataResponse2, QueryDataResponses, QueryGenaiTracesData, QueryGenaiTracesError, QueryGenaiTracesErrors, QueryGenaiTracesResponse, QueryGenaiTracesResponses, QueryLogsData, QueryLogsError, QueryLogsErrors, QueryLogsResponse, QueryLogsResponses, QueryMetricsData, QueryMetricsError, QueryMetricsErrors, QueryMetricsResponse, QueryMetricsResponses, QueryTracesData, QueryTracesError, QueryTracesErrors, QueryTracesResponse, QueryTracesResponses, QueryTraceSummariesData, QueryTraceSummariesError, QueryTraceSummariesErrors, QueryTraceSummariesResponse, QueryTraceSummariesResponses, QuotaResponse, RateLimitConfig, RateLimitSettings, ReachabilityStatus, ReadFileData, ReadFileErrors, ReadFileResponse, ReadFileResponse2, ReadFileResponses, ReAnalyzeData, ReAnalyzeErrors, ReAnalyzeResponses, RecentActivityQuery, RecentActivityResponse, RecentEventResponse, RecentQueryParams, RecordConsoleEventData, RecordConsoleEventErrors, RecordConsoleEventResponses, RecordEventMetricsData, RecordEventMetricsErrors, RecordEventMetricsResponse, RecordEventMetricsResponses, RecordExposureRequest, RecordExposureResponse, RecordFlagExposureData, RecordFlagExposureErrors, RecordFlagExposureResponse, RecordFlagExposureResponses, RecordListResponse, RecordSpeedMetricsData, RecordSpeedMetricsError, RecordSpeedMetricsErrors, RecordSpeedMetricsResponse, RecordSpeedMetricsResponses, RecoveryTarget, ReferrerCount, ReferrersAnalyticsQuery, RefreshRouteTableData, RefreshRouteTableErrors, RefreshRouteTableResponse, RefreshRouteTableResponses, RegenerateDsnData, RegenerateDsnErrors, RegenerateDsnRequest, RegenerateDsnResponse, RegenerateDsnResponses, RegisterExternalImageData, RegisterExternalImageErrors, RegisterExternalImageResponse, RegisterExternalImageResponses, RegisterImageRequest, RegisterNodeApiRequest, RegisterNodeData, RegisterNodeErrors, RegisterNodeResponse, RegisterNodeResponse2, RegisterNodeResponses, RegisterRequest, ReinstallGitlabWebhookData, ReinstallGitlabWebhookErrors, ReinstallGitlabWebhookResponse, ReinstallGitlabWebhookResponses, ReinstallWebhookResponse, RejectPendingActionData, RejectPendingActionErrors, RejectPendingActionResponse, RejectPendingActionResponses, ReleaseListResponse, ReloadPluginsData, ReloadPluginsErrors, ReloadPluginsResponse, ReloadPluginsResponses, ReloadResponse, RemoteDeploymentResponse, RemoveClusterMemberData, RemoveClusterMemberErrors, RemoveClusterMemberResponse, RemoveClusterMemberResponses, RemoveManagedDomainData, RemoveManagedDomainErrors, RemoveManagedDomainResponse, RemoveManagedDomainResponses, RemoveNodeResponse, RemoveRoleData, RemoveRoleErrors, RemoveRoleResponse, RemoveRoleResponses, RemoveTeamMemberData, RemoveTeamMemberErrors, RemoveTeamMemberResponse, RemoveTeamMemberResponses, RenameConversationData, RenameConversationErrors, RenameConversationRequest, RenameConversationResponse, RenameConversationResponses, RenewDomainData, RenewDomainErrors, RenewDomainResponse, RenewDomainResponses, RepositoryListQuery, RepositoryListResponse, RepositoryPresetResponse, RepositoryResponse, RepositorySyncStartedResponse, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponse, RequestPasswordResetResponses, RequestRow, RequiredPasswordChangeRequest, RequiredPasswordChangeResponse, ResetPasswordData, ResetPasswordErrors, ResetPasswordRequest, ResetPasswordResponse, ResetPasswordResponses, ResetPgStatStatementsRequest, ResetPgStatStatementsResponse, ResizeSandboxBody, ResizeSandboxData, ResizeSandboxErrors, ResizeSandboxResponse, ResizeSandboxResponses, ResolveAlarmData, ResolveAlarmErrors, ResolveAlarmResponses, ResolvedEnvVarResponse, ResolvedEnvVarSource, ResourceCounts, ResourceFootprint, ResourceInfo, ResourceLimitApplyResult, ResourceLimits, ResourceLimitsResponse, ResourceLimitsUpdateResponse, ResourcesBody, RestartContainerData, RestartContainerErrors, RestartContainerResponse, RestartContainerResponses, RestartPreviewGatewayData, RestartPreviewGatewayResponse, RestartPreviewGatewayResponses, RestartSandboxData, RestartSandboxErrors, RestartSandboxResponse, RestartSandboxResponses, RestoreCapabilities, RestoreCapabilitiesResponse, RestoreFlagData, RestoreFlagErrors, RestoreFlagResponse, RestoreFlagResponses, RestorePlan, RestoreRequestMode, RestoreRunView, RestoreUserData, RestoreUserErrors, RestoreUserResponse, RestoreUserResponses, ResumeDeploymentData, ResumeDeploymentErrors, ResumeDeploymentResponse, ResumeDeploymentResponses, ResumeSandboxData, ResumeSandboxErrors, ResumeSandboxResponse, ResumeSandboxResponses, RetentionCleanupFailure, RetentionCleanupReport, RetryClusterData, RetryClusterErrors, RetryClusterRequest, RetryClusterResponse, RetryClusterResponses, RetryDeliveryData, RetryDeliveryErrors, RetryDeliveryResponse, RetryDeliveryResponses, RetryPgUpgradeData, RetryPgUpgradeErrors, RetryPgUpgradeResponse, RetryPgUpgradeResponses, RetryRunData, RetryRunErrors, RetryRunResponse, RetryRunResponses, RevealGlobalMcpConfigData, RevealGlobalMcpConfigErrors, RevealGlobalMcpConfigResponse, RevealGlobalMcpConfigResponses, RevealMcpConfigData, RevealMcpConfigErrors, RevealMcpConfigResponse, RevealMcpConfigResponses, RevealNotificationProviderConfigData, RevealNotificationProviderConfigErrors, RevealNotificationProviderConfigResponse, RevealNotificationProviderConfigResponses, RevealServiceParameterData, RevealServiceParameterErrors, RevealServiceParameterResponse, RevealServiceParameterResponses, RevenueCreateIntegrationData, RevenueCreateIntegrationErrors, RevenueCreateIntegrationResponse, RevenueCreateIntegrationResponses, RevenueDeleteIntegrationData, RevenueDeleteIntegrationResponse, RevenueDeleteIntegrationResponses, RevenueGlobalEventsData, RevenueGlobalEventsResponse, RevenueGlobalEventsResponses, RevenueImportInvoicesCsvData, RevenueImportInvoicesCsvErrors, RevenueImportInvoicesCsvResponse, RevenueImportInvoicesCsvResponses, RevenueImportSubscriptionsCsvData, RevenueImportSubscriptionsCsvErrors, RevenueImportSubscriptionsCsvResponse, RevenueImportSubscriptionsCsvResponses, RevenueListIntegrationsData, RevenueListIntegrationsResponse, RevenueListIntegrationsResponses, RevenueListProvidersData, RevenueListProvidersResponse, RevenueListProvidersResponses, RevenueMetricsCustomersData, RevenueMetricsCustomersResponse, RevenueMetricsCustomersResponses, RevenueMetricsGlobalMrrData, RevenueMetricsGlobalMrrResponse, RevenueMetricsGlobalMrrResponses, RevenueMetricsGlobalSummaryData, RevenueMetricsGlobalSummaryResponse, RevenueMetricsGlobalSummaryResponses, RevenueMetricsMrrData, RevenueMetricsMrrResponse, RevenueMetricsMrrResponses, RevenueMetricsSummaryData, RevenueMetricsSummaryResponse, RevenueMetricsSummaryResponses, RevenueRecentEventsData, RevenueRecentEventsResponse, RevenueRecentEventsResponses, RevenueRotateTokenData, RevenueRotateTokenResponse, RevenueRotateTokenResponses, RevenueRow, RevenueUpdateConfigData, RevenueUpdateConfigErrors, RevenueUpdateConfigResponse, RevenueUpdateConfigResponses, RevenueUpdateSecretData, RevenueUpdateSecretErrors, RevenueUpdateSecretResponse, RevenueUpdateSecretResponses, RevokeDsnData, RevokeDsnErrors, RevokeDsnResponse, RevokeDsnResponses, RevokeEnrollmentTokenData, RevokeEnrollmentTokenErrors, RevokeEnrollmentTokenResponse, RevokeEnrollmentTokenResponses, RevokeJoinTokenData, RevokeJoinTokenErrors, RevokeJoinTokenResponse, RevokeJoinTokenResponses, RevokeProjectAccessData, RevokeProjectAccessErrors, RevokeProjectAccessResponse, RevokeProjectAccessResponses, RiskLevel, RoleInfo, RollbackPgUpgradeData, RollbackPgUpgradeErrors, RollbackPgUpgradeResponse, RollbackPgUpgradeResponses, RollbackToDeploymentData, RollbackToDeploymentErrors, RollbackToDeploymentResponse, RollbackToDeploymentResponses, RootfsCacheEntry, RootfsGcData, RootfsGcReport, RootfsGcResponses, RootfsReport, RootfsReportData, RootfsReportResponses, RootfsVmEntry, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponse, RotateApiKeyResponses, RotateDeploymentTokenData, RotateDeploymentTokenErrors, RotateDeploymentTokenResponse, RotateDeploymentTokenResponses, RouteRefreshResponse, RouteResponse, RouteRole, RouteUser, RouteUserWithRoles, RunBackupForSourceData, RunBackupForSourceError, RunBackupForSourceErrors, RunBackupForSourceResponse, RunBackupForSourceResponses, RunBackupRequest, RunConnectionHealthCheckData, RunConnectionHealthCheckErrors, RunConnectionHealthCheckResponse, RunConnectionHealthCheckResponses, RunExternalServiceBackupData, RunExternalServiceBackupError, RunExternalServiceBackupErrors, RunExternalServiceBackupRequest, RunExternalServiceBackupResponse, RunExternalServiceBackupResponses, RunScheduleNowData, RunScheduleNowError, RunScheduleNowErrors, RunScheduleNowResponse, RunScheduleNowResponses, S3ConnectionTestResponse, S3CredentialsResponse, S3SourceResponse, S3SourceResponseWritable, SandboxCreatePreviewLinkData, SandboxCreatePreviewLinkErrors, SandboxCreatePreviewLinkResponse, SandboxCreatePreviewLinkResponses, SandboxDomainResponse, SandboxEvent, SandboxEventsResponse, SandboxInner, SandboxResponse, SandboxRoute, SandboxStatusResponse, SaveAgentTokenData, SaveAgentTokenErrors, SaveAgentTokenRequest, SaveAgentTokenResponse, SaveAgentTokenResponse2, SaveAgentTokenResponses, SaveAiProviderCredentialData, SaveAiProviderCredentialErrors, SaveAiProviderCredentialResponse, SaveAiProviderCredentialResponses, SaveCredentialRequest, SaveCredentialResponse, ScalewayCredentialsRequest, ScanResponse, ScheduleRunEntry, ScheduleRunJobEntry, ScheduleRunListResponse, ScheduleRunResponse, ScheduleRunSummary, ScheduleRunSummaryList, ScreenshotSettings, SearchLogsData, SearchLogsError, SearchLogsErrors, SearchLogsRequest, SearchLogsResponse, SearchLogsResponse2, SearchLogsResponses, SearchMode, Seasonality, SecretResponse, SecurityConfig, SecurityHeadersConfig, SecurityHeadersSettings, SendEmailData, SendEmailErrors, SendEmailRequestBody, SendEmailResponse, SendEmailResponseBody, SendEmailResponses, SendMessageRequest, SensitiveConfigValueResponse, SensitiveMcpConfigValueResponse, SensitiveValueResponse, SentryChunkUploadResponse, SentryCreateReleaseRequest, SentryEventRequest, SentryEventResponse, SentryReleaseFileResponse, SentryReleaseProjectRef, SentryReleaseResponse, SeriesStateEntry, ServiceAccessInfo, ServiceAction, ServiceAlertRuleResponse, ServiceBackupEntryResponse, ServiceBackupListResponse, ServiceCreateAlertRuleRequest, ServiceHealthResponse, ServiceHealthStatusBatchResponse, ServiceHealthStatusEntryResponse, ServiceMemberInfo, ServiceParameter, ServicePlan, ServiceResourceLimits, ServiceRuntimeReport, ServiceStatsReport, ServiceTypeInfo, ServiceTypeRoute, ServiceUpdateAlertRuleRequest, SesCredentialsRequest, SessionDetails, SessionDetailsQuery, SessionEvent, SessionEventDto, SessionEventsQuery, SessionEventsResponse, SessionLogsQuery, SessionLogsResponse, SessionReplayEventsRequest, SessionReplayInfoDto, SessionReplayInitRequest, SessionReplayInitResponse, SessionReplayWithEventsDto, SessionReplayWithVisitorDto, SessionRequestLog, SessionSummary, SetDefaultS3SourceData, SetDefaultS3SourceError, SetDefaultS3SourceErrors, SetDefaultS3SourceResponse, SetDefaultS3SourceResponses, SetFlagEnvironmentData, SetFlagEnvironmentErrors, SetFlagEnvironmentRequest, SetFlagEnvironmentResponse, SetFlagEnvironmentResponses, SetPreviewPasswordBody, SetPreviewPasswordData, SetPreviewPasswordErrors, SetPreviewPasswordResponse, SetPreviewPasswordResponse2, SetPreviewPasswordResponses, SetRequest, SetResponse, SettingsUpdateResponse, SetupDnsChallengeData, SetupDnsChallengeErrors, SetupDnsChallengeRequest, SetupDnsChallengeResponse, SetupDnsChallengeResponse2, SetupDnsChallengeResponses, SetupDnsData, SetupDnsErrors, SetupDnsRequest, SetupDnsResponse, SetupDnsResponse2, SetupDnsResponses, SetupEmailTrackingData, SetupEmailTrackingErrors, SetupEmailTrackingResponse, SetupEmailTrackingResponses, SetupMfaData, SetupMfaErrors, SetupMfaResponse, SetupMfaResponses, SiblingRef, SkillDefinitionResponse, SlackConfig, SleepEnvironmentData, SleepEnvironmentErrors, SleepEnvironmentResponse, SleepEnvironmentResponses, SlowQueriesResponse, SlowQueryRow, SmartFilter, SmokeTestAgentData, SmokeTestAgentErrors, SmokeTestAgentResponse, SmokeTestAgentResponses, SmokeTestResponse, SmtpCredentialsRequest, SmtpEncryptionRoute, SmtpResult, SourceArchiveUpload, SourceBackupEntry, SourceBackupIndexResponse, SourceBody, SourceFileListResponse, SourceFileResponse, SourceMapListResponse, SourceMapResponse, SourceSandboxData, SourceSandboxErrors, SourceSandboxResponse, SourceSandboxResponses, SourceType, SpanEvent, SpanKind, SpanRecord, SpanRow, SpanStatusCode, SpeedMetricsPayload, SpeedSegmentFilters, StaleSlot, StartAnalysisData, StartAnalysisErrors, StartAnalysisRequest, StartAnalysisResponse, StartAnalysisResponses, StartContainerData, StartContainerErrors, StartContainerResponse, StartContainerResponses, StartFixData, StartFixErrors, StartFixResponses, StartGitProviderOauthData, StartGitProviderOauthErrors, StartOidcLoginBySlugData, StartOidcLoginBySlugErrors, StartPgUpgradeData, StartPgUpgradeErrors, StartPgUpgradeRequest, StartPgUpgradeResponse, StartPgUpgradeResponses, StartRestoreData, StartRestoreError, StartRestoreErrors, StartRestoreRequest, StartRestoreResponse, StartRestoreResponses, StartServiceData, StartServiceErrors, StartServiceResponse, StartServiceResponses, StaticBundleResponse, StaticParams, StaticPresetConfig, StatPathData, StatPathErrors, StatPathResponse, StatPathResponses, StatResponse, StatsFilters, StatusBucket, StatusBucketedResponse, StatusCodeCount, StatusCodesQuery, StatusPageOverview, StepConversionResponse, StepResourceType, StepResult, StepUpResponse, StopContainerData, StopContainerErrors, StopContainerResponse, StopContainerResponses, StopSandboxData, StopSandboxErrors, StopSandboxResponse, StopSandboxResponses, StopSequence, StopServiceData, StopServiceErrors, StopServiceResponse, StopServiceResponses, StorageQuota, StreamContainerMetricsData, StreamContainerMetricsErrors, StreamContainerMetricsResponses, StreamEventsData, StreamEventsErrors, StreamEventsResponses, StreamRunEventsData, StreamRunEventsErrors, StreamRunEventsResponses, StripeConfig, SyncedRepositoryListQuery, SyncRepositoriesData, SyncRepositoriesErrors, SyncRepositoriesResponse, SyncRepositoriesResponses, SyntaxResult, TagInfo, TagListResponse, TailDeploymentJobLogsData, TailDeploymentJobLogsErrors, TailLogsData, TailLogsError, TailLogsErrors, TailLogsRequest, TailLogsResponses, TargetRecommendation, TeamListResponse, TeamMemberResponse, TeamResponse, TeamRole, TeardownDeploymentData, TeardownDeploymentErrors, TeardownDeploymentResponse, TeardownDeploymentResponses, TeardownEnvironmentData, TeardownEnvironmentErrors, TeardownEnvironmentResponse, TeardownEnvironmentResponses, TemplateResponse, TestEmailRequest, TestEmailResponse, TestNotificationProviderData, TestNotificationProviderErrors, TestNotificationProviderResponse, TestNotificationProviderResponses, TestOidcProviderData, TestOidcProviderResponse, TestOidcProviderResponses, TestProviderConnectionData, TestProviderConnectionErrors, TestProviderConnectionResponse, TestProviderConnectionResponses, TestProviderData, TestProviderErrors, TestProviderKeyByIdData, TestProviderKeyByIdError, TestProviderKeyByIdErrors, TestProviderKeyByIdResponse, TestProviderKeyByIdResponses, TestProviderKeyInlineData, TestProviderKeyInlineError, TestProviderKeyInlineErrors, TestProviderKeyInlineResponse, TestProviderKeyInlineResponses, TestProviderKeyRequest, TestProviderKeyResponse, TestProviderResponse, TestProviderResponse2, TestProviderResponses, TestS3ConnectionPreviewData, TestS3ConnectionPreviewError, TestS3ConnectionPreviewErrors, TestS3ConnectionPreviewResponse, TestS3ConnectionPreviewResponses, TestS3SourceConnectionData, TestS3SourceConnectionError, TestS3SourceConnectionErrors, TestS3SourceConnectionResponse, TestS3SourceConnectionResponses, TimeBucketStats, TimeBucketStatsResponse, TimeseriesBucket, TimeseriesQueryParams, TlsMode, TodayStatsResponse, ToggleDeploymentMetricsRequest, ToggleServiceMetricsRequest, TokenRenewalRequest, ToolCallEvent, ToolInfo, ToolResultEvent, TopModelsQueryParams, TraceProjectRef, TracesResponse, TraceSummariesResponse, TraceSummary, TrackClickData, TrackClickErrors, TrackedLinkResponse, TrackingEventResponse, TrackOpenData, TrackOpenErrors, TrackOpenResponses, TriggerAgentData, TriggerAgentErrors, TriggerAgentRequest, TriggerAgentResponse, TriggerAgentResponses, TriggerDigestResponse, TriggerPipelinePayload, TriggerPipelineResponse, TriggerProjectPipelineData, TriggerProjectPipelineErrors, TriggerProjectPipelineResponse, TriggerProjectPipelineResponses, TriggerScanData, TriggerScanError, TriggerScanErrors, TriggerScanRequest, TriggerScanResponse, TriggerScanResponse2, TriggerScanResponses, TriggerServiceHealthCheckData, TriggerServiceHealthCheckErrors, TriggerServiceHealthCheckResponse, TriggerServiceHealthCheckResponses, TriggerWeeklyDigestData, TriggerWeeklyDigestErrors, TriggerWeeklyDigestResponse, TriggerWeeklyDigestResponses, TtlRequest, TtlResponse, TxtRecord, UiManifest, UiRoute, UndrainNodeResponse, UnifiedTrace, UniqueCountsQuery, UniqueCountsResponse, UnlinkServiceFromProjectData, UnlinkServiceFromProjectErrors, UnlinkServiceFromProjectResponse, UnlinkServiceFromProjectResponses, UnsupportedFeature, UpdateAdminGateRequest, UpdateAgentData, UpdateAgentErrors, UpdateAgentResponse, UpdateAgentResponses, UpdateAiProviderData, UpdateAiProviderErrors, UpdateAiProviderRequest, UpdateAiProviderResponse, UpdateAiProviderResponse2, UpdateAiProviderResponses, UpdateAlertData, UpdateAlertError, UpdateAlertErrors, UpdateAlertResponse, UpdateAlertResponses, UpdateAlertRuleData, UpdateAlertRuleErrors, UpdateAlertRuleRequest, UpdateAlertRuleResponse, UpdateAlertRuleResponses, UpdateApiKeyData, UpdateApiKeyErrors, UpdateApiKeyRequest, UpdateApiKeyResponse, UpdateApiKeyResponses, UpdateAutomaticDeployData, UpdateAutomaticDeployErrors, UpdateAutomaticDeployRequest, UpdateAutomaticDeployResponse, UpdateAutomaticDeployResponses, UpdateBackupScheduleData, UpdateBackupScheduleError, UpdateBackupScheduleErrors, UpdateBackupScheduleRequest, UpdateBackupScheduleResponse, UpdateBackupScheduleResponses, UpdateBlobRequest, UpdateBlobResponse, UpdateCloudflareProviderData, UpdateCloudflareProviderErrors, UpdateCloudflareProviderRequest, UpdateCloudflareProviderResponse, UpdateCloudflareProviderResponses, UpdateConfigBody, UpdateConnectionTokenData, UpdateConnectionTokenErrors, UpdateConnectionTokenResponse, UpdateConnectionTokenResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainRequest, UpdateCustomDomainResponse, UpdateCustomDomainResponses, UpdateDashboardData, UpdateDashboardError, UpdateDashboardErrors, UpdateDashboardRequest, UpdateDashboardResponse, UpdateDashboardResponses, UpdateDeploymentConfigRequest, UpdateDeploymentTokenData, UpdateDeploymentTokenErrors, UpdateDeploymentTokenRequest, UpdateDeploymentTokenResponse, UpdateDeploymentTokenResponses, UpdateDnsProviderRequest, UpdateEmailProviderData, UpdateEmailProviderErrors, UpdateEmailProviderRequest, UpdateEmailProviderResponse, UpdateEmailProviderResponses, UpdateEnvironmentSettingsData, UpdateEnvironmentSettingsErrors, UpdateEnvironmentSettingsRequest, UpdateEnvironmentSettingsResponse, UpdateEnvironmentSettingsResponses, UpdateEnvironmentSubdomainData, UpdateEnvironmentSubdomainErrors, UpdateEnvironmentSubdomainRequest, UpdateEnvironmentSubdomainResponse, UpdateEnvironmentSubdomainResponses, UpdateEnvironmentVariableData, UpdateEnvironmentVariableErrors, UpdateEnvironmentVariableRequest, UpdateEnvironmentVariableResponse, UpdateEnvironmentVariableResponses, UpdateErrorGroupData, UpdateErrorGroupErrors, UpdateErrorGroupRequest, UpdateErrorGroupResponses, UpdateExternalServiceRequest, UpdateFlagData, UpdateFlagErrors, UpdateFlagRequest, UpdateFlagResponse, UpdateFlagResponses, UpdateFunnelData, UpdateFunnelErrors, UpdateFunnelResponses, UpdateGitProviderCredentialsData, UpdateGitProviderCredentialsErrors, UpdateGitProviderCredentialsResponse, UpdateGitProviderCredentialsResponses, UpdateGitSettingsData, UpdateGitSettingsErrors, UpdateGitSettingsRequest, UpdateGitSettingsResponse, UpdateGitSettingsResponses, UpdateGlobalMcpData, UpdateGlobalMcpErrors, UpdateGlobalMcpResponse, UpdateGlobalMcpResponses, UpdateGlobalSkillData, UpdateGlobalSkillErrors, UpdateGlobalSkillResponse, UpdateGlobalSkillResponses, UpdateIncidentStatusData, UpdateIncidentStatusErrors, UpdateIncidentStatusRequest, UpdateIncidentStatusResponse, UpdateIncidentStatusResponses, UpdateIpAccessControlData, UpdateIpAccessControlError, UpdateIpAccessControlErrors, UpdateIpAccessControlRequest, UpdateIpAccessControlResponse, UpdateIpAccessControlResponses, UpdateKvRequest, UpdateKvResponse, UpdateManagedDomainApiRequest, UpdateManagedDomainData, UpdateManagedDomainErrors, UpdateManagedDomainResponse, UpdateManagedDomainResponses, UpdateMcpData, UpdateMcpErrors, UpdateMcpRequest, UpdateMcpResponse, UpdateMcpResponses, UpdateMemberRoleRequest, UpdateMetricAlertRequest, UpdateNotificationEmailProviderData, UpdateNotificationEmailProviderErrors, UpdateNotificationEmailProviderRequest, UpdateNotificationEmailProviderResponse, UpdateNotificationEmailProviderResponses, UpdateNotificationProviderData, UpdateNotificationProviderErrors, UpdateNotificationProviderResponse, UpdateNotificationProviderResponses, UpdateOidcProviderData, UpdateOidcProviderRequest, UpdateOidcProviderResponse, UpdateOidcProviderResponses, UpdatePreferencesData, UpdatePreferencesErrors, UpdatePreferencesRequest, UpdatePreferencesResponse, UpdatePreferencesResponses, UpdateProjectData, UpdateProjectDeploymentConfigData, UpdateProjectDeploymentConfigErrors, UpdateProjectDeploymentConfigResponse, UpdateProjectDeploymentConfigResponses, UpdateProjectErrors, UpdateProjectResponse, UpdateProjectResponses, UpdateProjectSecretData, UpdateProjectSecretErrors, UpdateProjectSecretRequest, UpdateProjectSecretResponse, UpdateProjectSecretResponses, UpdateProjectSettingsData, UpdateProjectSettingsErrors, UpdateProjectSettingsRequest, UpdateProjectSettingsResponse, UpdateProjectSettingsResponses, UpdateProviderCredentialsRequest, UpdateProviderData, UpdateProviderErrors, UpdateProviderKeyData, UpdateProviderKeyError, UpdateProviderKeyErrors, UpdateProviderKeyRequest, UpdateProviderKeyResponse, UpdateProviderKeyResponses, UpdateProviderRequest, UpdateProviderResponse, UpdateProviderResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteRequest, UpdateRouteResponse, UpdateRouteResponses, UpdateS3SourceData, UpdateS3SourceError, UpdateS3SourceErrors, UpdateS3SourceRequest, UpdateS3SourceResponse, UpdateS3SourceResponses, UpdateSecretBody, UpdateSelfData, UpdateSelfErrors, UpdateSelfRequest, UpdateSelfResponse, UpdateSelfResponses, UpdateServiceData, UpdateServiceErrors, UpdateServiceResourcesData, UpdateServiceResourcesErrors, UpdateServiceResourcesResponse, UpdateServiceResourcesResponses, UpdateServiceResponse, UpdateServiceResponses, UpdateSessionDurationData, UpdateSessionDurationError, UpdateSessionDurationErrors, UpdateSessionDurationRequest, UpdateSessionDurationResponse, UpdateSessionDurationResponse2, UpdateSessionDurationResponses, UpdateSettingsData, UpdateSettingsErrors, UpdateSettingsResponse, UpdateSettingsResponses, UpdateSkillData, UpdateSkillErrors, UpdateSkillRequest, UpdateSkillResponse, UpdateSkillResponses, UpdateSlackProviderData, UpdateSlackProviderErrors, UpdateSlackProviderRequest, UpdateSlackProviderResponse, UpdateSlackProviderResponses, UpdateSpeedMetricsData, UpdateSpeedMetricsError, UpdateSpeedMetricsErrors, UpdateSpeedMetricsPayload, UpdateSpeedMetricsResponse, UpdateSpeedMetricsResponses, UpdateStatusResponse, UpdateTeamData, UpdateTeamErrors, UpdateTeamMemberRoleData, UpdateTeamMemberRoleErrors, UpdateTeamMemberRoleResponse, UpdateTeamMemberRoleResponses, UpdateTeamRequest, UpdateTeamResponse, UpdateTeamResponses, UpdateTokenRequest, UpdateTokenResponse, UpdateUserData, UpdateUserErrors, UpdateUserRequest, UpdateUserResponse, UpdateUserResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookProviderData, UpdateWebhookProviderErrors, UpdateWebhookProviderRequest, UpdateWebhookProviderResponse, UpdateWebhookProviderResponses, UpdateWebhookRequestBody, UpdateWebhookResponse, UpdateWebhookResponses, UpgradeExternalServiceRequest, UpgradePreviewGatewayData, UpgradePreviewGatewayResponse, UpgradePreviewGatewayResponses, UpgradeRequest, UpgradeServiceData, UpgradeServiceErrors, UpgradeServiceResponse, UpgradeServiceResponses, UploadGlobalSkillData, UploadGlobalSkillErrors, UploadGlobalSkillResponse, UploadGlobalSkillResponses, UploadReleaseFileData, UploadReleaseFileErrors, UploadReleaseFileResponse, UploadReleaseFileResponses, UploadSkillData, UploadSkillErrors, UploadSkillResponse, UploadSkillResponses, UploadSourceFileData, UploadSourceFileErrors, UploadSourceFileResponse, UploadSourceFileResponses, UploadSourceMapData, UploadSourceMapErrors, UploadSourceMapResponse, UploadSourceMapResponses, UploadStaticBundleData, UploadStaticBundleErrors, UploadStaticBundleResponse, UploadStaticBundleResponses, UpsertAgentRequest, UpsertSecretData, UpsertSecretErrors, UpsertSecretRequest, UpsertSecretResponse, UpsertSecretResponses, UptimeDataPoint, UptimeHistoryResponse, UsageFilter, UsageInfo, UsageLogEntry, UsageLogPage, UsageQueryParams, UsageSource, UsageSummary, UserResponse, ValidateConnectionData, ValidateConnectionErrors, ValidateConnectionResponse, ValidateConnectionResponses, ValidateEmailData, ValidateEmailErrors, ValidateEmailRequest, ValidateEmailResponse, ValidateEmailResponse2, ValidateEmailResponses, ValidationLevel, ValidationReport, ValidationResponse, ValidationResult, ValidationStatus, ValidationSummary, VerifyAndEnableMfaData, VerifyAndEnableMfaErrors, VerifyAndEnableMfaResponse, VerifyAndEnableMfaResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponse, VerifyDomainResponses, VerifyEmailData, VerifyEmailErrors, VerifyEmailResponse, VerifyEmailResponses, VerifyManagedDomainData, VerifyManagedDomainErrors, VerifyManagedDomainResponse, VerifyManagedDomainResponses, VerifyMfaChallengeData, VerifyMfaChallengeErrors, VerifyMfaChallengeResponse, VerifyMfaChallengeResponses, VerifyMfaRequest, VerifyStepUpData, VerifyStepUpErrors, VerifyStepUpRequest, VerifyStepUpResponse, VerifyStepUpResponses, ViewItem, ViewsOverTime, ViewsOverTimeQuery, VisitorDetails, VisitorFacets, VisitorFacetsQuery, VisitorFacetValue, VisitorInfo, VisitorJourneyQuery, VisitorJourneyResponse, VisitorLocationsQuery, VisitorRecord, VisitorSegmentFilters, VisitorSessionsQuery, VisitorSessionsResponse, VisitorsListQuery, VisitorsResponse, VisitorStats, VisitorWithGeolocation, VolumeMount, VolumeType, VulnerabilityResponse, WakeEnvironmentData, WakeEnvironmentErrors, WakeEnvironmentResponse, WakeEnvironmentResponses, WalWarning, WalWarningSeverity, WebhookConfig, WebhookDeliveryResponse, WebhookResponse, WebhookTriggerData, WebhookTriggerErrors, WebhookTriggerRequest, WebhookTriggerResponse, WebhookTriggerResponse2, WebhookTriggerResponses, WorkflowDryRunData, WorkflowDryRunErrors, WorkflowDryRunRequest, WorkflowDryRunResponse, WorkflowDryRunResponses, WorkloadDescriptor, WorkloadId, WorkloadStatus, WorkloadType, WriteFileBody, WriteFileData, WriteFileErrors, WriteFileResponse, WriteFileResponses, WriteFilesBody, WriteFilesData, WriteFilesErrors, WriteFilesResponse, WriteFilesResponse2, WriteFilesResponses, ZoneListResponse } from './types.gen'; diff --git a/web/src/api/client/sdk.gen.ts b/web/src/api/client/sdk.gen.ts index c075a1e2e..613d4912a 100644 --- a/web/src/api/client/sdk.gen.ts +++ b/web/src/api/client/sdk.gen.ts @@ -2,7 +2,7 @@ import { type Client, type ClientMeta, formDataBodySerializer, type Options as Options2, type RequestResult, type ServerSentEventsResult, type TDataShape } from './client'; import { client } from './client.gen'; -import type { AcknowledgeAlarmData, AcknowledgeAlarmErrors, AcknowledgeAlarmResponses, ActivateAiProviderData, ActivateAiProviderErrors, ActivateAiProviderResponses, ActivateApiKeyData, ActivateApiKeyErrors, ActivateApiKeyResponses, ActivateConnectionData, ActivateConnectionErrors, ActivateConnectionResponses, ActivateProviderData, ActivateProviderErrors, ActivateProviderResponses, AddClusterMemberData, AddClusterMemberErrors, AddClusterMemberResponses, AddContextData, AddContextErrors, AddContextResponses, AddEnvironmentDomainData, AddEnvironmentDomainErrors, AddEnvironmentDomainResponses, AddEventsData, AddEventsErrors, AddEventsResponses, AddManagedDomainData, AddManagedDomainErrors, AddManagedDomainResponses, AddSessionReplayEventsData, AddSessionReplayEventsErrors, AddSessionReplayEventsResponses, AddTeamMemberData, AddTeamMemberErrors, AddTeamMemberResponses, AdminDrainNodeData, AdminDrainNodeErrors, AdminDrainNodeResponses, AdminDrainStatusData, AdminDrainStatusErrors, AdminDrainStatusResponses, AdminGetNodeData, AdminGetNodeErrors, AdminGetNodeResponses, AdminListNodeContainersData, AdminListNodeContainersErrors, AdminListNodeContainersResponses, AdminListNodesData, AdminListNodesErrors, AdminListNodesResponses, AdminRemoveNodeData, AdminRemoveNodeErrors, AdminRemoveNodeResponses, AdminUndrainNodeData, AdminUndrainNodeErrors, AdminUndrainNodeResponses, ApplyHostnameModeData, ApplyHostnameModeErrors, ApplyHostnameModeResponses, ArchiveConversationData, ArchiveConversationErrors, ArchiveConversationResponses, ArchiveFlagData, ArchiveFlagErrors, ArchiveFlagResponses, AssignRoleData, AssignRoleErrors, AssignRoleResponses, AttachScheduleServicesData, AttachScheduleServicesErrors, AttachScheduleServicesResponses, BlobCopyData, BlobCopyErrors, BlobCopyResponses, BlobDeleteData, BlobDeleteErrors, BlobDeleteResponses, BlobDisableData, BlobDisableErrors, BlobDisableResponses, BlobDownloadData, BlobDownloadErrors, BlobDownloadResponses, BlobEnableData, BlobEnableErrors, BlobEnableResponses, BlobHeadData, BlobHeadErrors, BlobHeadResponses, BlobListData, BlobListErrors, BlobListResponses, BlobPutData, BlobPutErrors, BlobPutResponses, BlobStatusData, BlobStatusErrors, BlobStatusResponses, BlobUpdateData, BlobUpdateErrors, BlobUpdateResponses, CancelBackupData, CancelBackupErrors, CancelBackupResponses, CancelData, CancelDeploymentData, CancelDeploymentErrors, CancelDeploymentResponses, CancelDomainOrderData, CancelDomainOrderErrors, CancelDomainOrderResponses, CancelErrors, CancelPgUpgradeData, CancelPgUpgradeErrors, CancelPgUpgradeResponses, CancelResponses, CancelRunData, CancelRunErrors, CancelRunResponses, CancelScheduleRunData, CancelScheduleRunErrors, CancelScheduleRunResponses, ChangePasswordSelfData, ChangePasswordSelfErrors, ChangePasswordSelfResponses, ChangeProjectSourceData, ChangeProjectSourceErrors, ChangeProjectSourceResponses, ChatCompletionsData, ChatCompletionsErrors, ChatCompletionsResponses, CheckAnalyticsHasEventsData, CheckAnalyticsHasEventsErrors, CheckAnalyticsHasEventsResponses, CheckCommitExistsData, CheckCommitExistsErrors, CheckCommitExistsResponses, CheckDomainStatusData, CheckDomainStatusErrors, CheckDomainStatusResponses, CheckExplorerSupportData, CheckExplorerSupportErrors, CheckExplorerSupportResponses, CheckIpBlockedData, CheckIpBlockedErrors, CheckIpBlockedResponses, CheckProviderDeletionSafetyData, CheckProviderDeletionSafetyErrors, CheckProviderDeletionSafetyResponses, ChunkUploadOptionsData, ChunkUploadOptionsResponses, CleanupExpiredBackupsData, CleanupExpiredBackupsErrors, CleanupExpiredBackupsResponses, ClearPreviewPasswordData, ClearPreviewPasswordErrors, ClearPreviewPasswordResponses, CliDeviceApproveData, CliDeviceApproveErrors, CliDeviceApproveResponses, CliDeviceDenyData, CliDeviceDenyErrors, CliDeviceDenyResponses, CliDeviceLookupData, CliDeviceLookupErrors, CliDeviceLookupResponses, CliDevicePollData, CliDevicePollErrors, CliDevicePollResponses, CliDeviceStartData, CliDeviceStartErrors, CliDeviceStartResponses, CliLogoutData, CliLogoutErrors, CliLogoutResponses, CmdData, CmdErrors, CmdKillData, CmdKillErrors, CmdKillResponses, CmdLogsData, CmdLogsErrors, CmdLogsResponses, CmdResponses, ConfirmPendingActionData, ConfirmPendingActionErrors, ConfirmPendingActionResponses, ContainerMetricsGetHistoryData, ContainerMetricsGetHistoryErrors, ContainerMetricsGetHistoryResponses, CreateAgentData, CreateAgentErrors, CreateAgentResponses, CreateAlertData, CreateAlertErrors, CreateAlertResponses, CreateAlertRuleData, CreateAlertRuleErrors, CreateAlertRuleResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyResponses, CreateBackupScheduleData, CreateBackupScheduleErrors, CreateBackupScheduleResponses, CreateBitbucketProviderData, CreateBitbucketProviderErrors, CreateBitbucketProviderResponses, CreateCloudflareProviderData, CreateCloudflareProviderErrors, CreateCloudflareProviderResponses, CreateConversationData, CreateConversationErrors, CreateConversationResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponses, CreateDashboardData, CreateDashboardErrors, CreateDashboardResponses, CreateDeploymentTokenData, CreateDeploymentTokenErrors, CreateDeploymentTokenResponses, CreateDnsProviderData, CreateDnsProviderErrors, CreateDnsProviderResponses, CreateDomainData, CreateDomainErrors, CreateDomainResponses, CreateDsnData, CreateDsnErrors, CreateDsnResponses, CreateEmailDomainData, CreateEmailDomainErrors, CreateEmailDomainResponses, CreateEmailProviderData, CreateEmailProviderErrors, CreateEmailProviderResponses, CreateEnvironmentData, CreateEnvironmentErrors, CreateEnvironmentResponses, CreateEnvironmentVariableData, CreateEnvironmentVariableErrors, CreateEnvironmentVariableResponses, CreateFlagData, CreateFlagErrors, CreateFlagResponses, CreateFunnelData, CreateFunnelErrors, CreateFunnelResponses, CreateGenericProviderData, CreateGenericProviderErrors, CreateGenericProviderResponses, CreateGiteaPatProviderData, CreateGiteaPatProviderErrors, CreateGiteaPatProviderResponses, CreateGithubPatProviderData, CreateGithubPatProviderErrors, CreateGithubPatProviderResponses, CreateGitlabOauthProviderData, CreateGitlabOauthProviderErrors, CreateGitlabOauthProviderResponses, CreateGitlabPatProviderData, CreateGitlabPatProviderErrors, CreateGitlabPatProviderResponses, CreateGitProviderData, CreateGitProviderErrors, CreateGitProviderResponses, CreateGlobalMcpData, CreateGlobalMcpErrors, CreateGlobalMcpResponses, CreateGlobalSkillData, CreateGlobalSkillErrors, CreateGlobalSkillResponses, CreateIncidentData, CreateIncidentErrors, CreateIncidentResponses, CreateIpAccessControlData, CreateIpAccessControlErrors, CreateIpAccessControlResponses, CreateMcpData, CreateMcpErrors, CreateMcpResponses, CreateMonitorData, CreateMonitorErrors, CreateMonitorResponses, CreateNotificationEmailProviderData, CreateNotificationEmailProviderErrors, CreateNotificationEmailProviderResponses, CreateNotificationProviderData, CreateNotificationProviderErrors, CreateNotificationProviderResponses, CreateOidcProviderData, CreateOidcProviderErrors, CreateOidcProviderResponses, CreateOidcRoleMappingData, CreateOidcRoleMappingResponses, CreateOrRecreateOrderData, CreateOrRecreateOrderErrors, CreateOrRecreateOrderResponses, CreatePlanData, CreatePlanErrors, CreatePlanResponses, CreatePrData, CreatePrErrors, CreateProjectData, CreateProjectErrors, CreateProjectFromTemplateData, CreateProjectFromTemplateErrors, CreateProjectFromTemplateResponses, CreateProjectReleaseData, CreateProjectReleaseErrors, CreateProjectReleaseResponses, CreateProjectResponses, CreateProjectSecretData, CreateProjectSecretErrors, CreateProjectSecretResponses, CreateProviderKeyData, CreateProviderKeyErrors, CreateProviderKeyResponses, CreatePrResponses, CreateReleaseData, CreateReleaseErrors, CreateReleaseResponses, CreateRouteData, CreateRouteErrors, CreateRouteResponses, CreateS3SourceData, CreateS3SourceErrors, CreateS3SourceResponses, CreateSandboxData, CreateSandboxErrors, CreateSandboxResponses, CreateServiceData, CreateServiceErrors, CreateServiceResponses, CreateSkillData, CreateSkillErrors, CreateSkillResponses, CreateSlackProviderData, CreateSlackProviderErrors, CreateSlackProviderResponses, CreateTeamData, CreateTeamErrors, CreateTeamResponses, CreateUserData, CreateUserErrors, CreateUserResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookProviderData, CreateWebhookProviderErrors, CreateWebhookProviderResponses, CreateWebhookResponses, DeactivateApiKeyData, DeactivateApiKeyErrors, DeactivateApiKeyResponses, DeactivateConnectionData, DeactivateConnectionErrors, DeactivateConnectionResponses, DeactivateProviderData, DeactivateProviderErrors, DeactivateProviderResponses, DeleteAgentData, DeleteAgentErrors, DeleteAgentResponses, DeleteAlertData, DeleteAlertErrors, DeleteAlertResponses, DeleteAlertRuleData, DeleteAlertRuleErrors, DeleteAlertRuleResponses, DeleteApiKeyData, DeleteApiKeyErrors, DeleteApiKeyResponses, DeleteBackupData, DeleteBackupErrors, DeleteBackupResponses, DeleteBackupScheduleData, DeleteBackupScheduleErrors, DeleteBackupScheduleResponses, DeleteConnectionData, DeleteConnectionErrors, DeleteConnectionResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponses, DeleteDashboardData, DeleteDashboardErrors, DeleteDashboardResponses, DeleteDeploymentTokenData, DeleteDeploymentTokenErrors, DeleteDeploymentTokenResponses, DeleteDnsProviderData, DeleteDnsProviderErrors, DeleteDnsProviderResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponses, DeleteEmailDomainData, DeleteEmailDomainErrors, DeleteEmailDomainResponses, DeleteEmailProviderData, DeleteEmailProviderErrors, DeleteEmailProviderResponses, DeleteEnvironmentData, DeleteEnvironmentDomainData, DeleteEnvironmentDomainErrors, DeleteEnvironmentDomainResponses, DeleteEnvironmentErrors, DeleteEnvironmentResponses, DeleteEnvironmentVariableData, DeleteEnvironmentVariableErrors, DeleteEnvironmentVariableResponses, DeleteExternalImageData, DeleteExternalImageErrors, DeleteExternalImageResponses, DeleteFunnelData, DeleteFunnelErrors, DeleteFunnelResponses, DeleteGitProviderData, DeleteGitProviderErrors, DeleteGitProviderResponses, DeleteGlobalMcpData, DeleteGlobalMcpErrors, DeleteGlobalMcpResponses, DeleteGlobalSkillData, DeleteGlobalSkillErrors, DeleteGlobalSkillResponses, DeleteIpAccessControlData, DeleteIpAccessControlErrors, DeleteIpAccessControlResponses, DeleteMcpData, DeleteMcpErrors, DeleteMcpResponses, DeleteMonitorData, DeleteMonitorErrors, DeleteMonitorResponses, DeleteNotificationProviderData, DeleteNotificationProviderErrors, DeleteNotificationProviderResponses, DeleteOidcProviderData, DeleteOidcProviderResponses, DeleteOidcRoleMappingData, DeleteOidcRoleMappingResponses, DeletePreferencesData, DeletePreferencesErrors, DeletePreferencesResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteProjectSecretData, DeleteProjectSecretErrors, DeleteProjectSecretResponses, DeleteProviderKeyData, DeleteProviderKeyErrors, DeleteProviderKeyResponses, DeleteProviderSafelyData, DeleteProviderSafelyErrors, DeleteProviderSafelyResponses, DeleteReleaseSourceFilesData, DeleteReleaseSourceFilesErrors, DeleteReleaseSourceFilesResponses, DeleteReleaseSourceMapsData, DeleteReleaseSourceMapsErrors, DeleteReleaseSourceMapsResponses, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponses, DeleteS3SourceData, DeleteS3SourceErrors, DeleteS3SourceResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteSecretData, DeleteSecretErrors, DeleteSecretResponses, DeleteServiceData, DeleteServiceErrors, DeleteServiceResponses, DeleteSessionReplayData, DeleteSessionReplayErrors, DeleteSessionReplayResponses, DeleteSkillData, DeleteSkillErrors, DeleteSkillResponses, DeleteSourceMapData, DeleteSourceMapErrors, DeleteSourceMapResponses, DeleteStaticBundleData, DeleteStaticBundleErrors, DeleteStaticBundleResponses, DeleteTeamData, DeleteTeamErrors, DeleteTeamResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponses, DeployFromImageData, DeployFromImageErrors, DeployFromImageResponses, DeployFromImageUploadData, DeployFromImageUploadErrors, DeployFromImageUploadResponses, DeployFromStaticData, DeployFromStaticErrors, DeployFromStaticResponses, DeployFromUploadedSourceData, DeployFromUploadedSourceErrors, DeployFromUploadedSourceResponses, DeploymentMetricsGetLatestData, DeploymentMetricsGetLatestErrors, DeploymentMetricsGetLatestResponses, DeploymentMetricsGetRangeData, DeploymentMetricsGetRangeErrors, DeploymentMetricsGetRangeResponses, DeploymentMetricsToggleData, DeploymentMetricsToggleErrors, DeploymentMetricsToggleResponses, DestroySandboxData, DestroySandboxErrors, DestroySandboxResponses, DetachScheduleServiceData, DetachScheduleServiceErrors, DetachScheduleServiceResponses, DetectPublicPresetsData, DetectPublicPresetsErrors, DetectPublicPresetsResponses, DisableBackupScheduleData, DisableBackupScheduleErrors, DisableBackupScheduleResponses, DisableMfaData, DisableMfaErrors, DisableMfaResponses, DiscoverWorkloadsData, DiscoverWorkloadsErrors, DiscoverWorkloadsResponses, DomainData, DomainErrors, DomainResponses, DownloadGlobalSkillArchiveData, DownloadGlobalSkillArchiveErrors, DownloadGlobalSkillArchiveResponses, DownloadObjectData, DownloadObjectErrors, DownloadObjectResponses, DownloadSkillArchiveData, DownloadSkillArchiveErrors, DownloadSkillArchiveResponses, EmailStatusData, EmailStatusErrors, EmailStatusResponses, EmbeddingsData, EmbeddingsErrors, EmbeddingsResponses, EnableBackupScheduleData, EnableBackupScheduleErrors, EnableBackupScheduleResponses, EnrichVisitorData, EnrichVisitorErrors, EnrichVisitorResponses, ExecData, ExecDetachedData, ExecDetachedErrors, ExecDetachedResponses, ExecErrors, ExecResponses, ExecuteDeploymentOperationData, ExecuteDeploymentOperationErrors, ExecuteDeploymentOperationResponses, ExecuteImportData, ExecuteImportErrors, ExecuteImportResponses, ExtendTimeoutData, ExtendTimeoutErrors, ExtendTimeoutResponses, ExternalServiceEnablePgStatStatementsData, ExternalServiceEnablePgStatStatementsErrors, ExternalServiceEnablePgStatStatementsResponses, ExternalServiceMetricsByDatabaseData, ExternalServiceMetricsByDatabaseErrors, ExternalServiceMetricsByDatabaseResponses, ExternalServiceMetricsCreateAlertRuleData, ExternalServiceMetricsCreateAlertRuleErrors, ExternalServiceMetricsCreateAlertRuleResponses, ExternalServiceMetricsDeleteAlertRuleData, ExternalServiceMetricsDeleteAlertRuleErrors, ExternalServiceMetricsDeleteAlertRuleResponses, ExternalServiceMetricsGetAlertRulesData, ExternalServiceMetricsGetAlertRulesErrors, ExternalServiceMetricsGetAlertRulesResponses, ExternalServiceMetricsGetLatestData, ExternalServiceMetricsGetLatestErrors, ExternalServiceMetricsGetLatestResponses, ExternalServiceMetricsGetRangeData, ExternalServiceMetricsGetRangeErrors, ExternalServiceMetricsGetRangeResponses, ExternalServiceMetricsStatusData, ExternalServiceMetricsStatusErrors, ExternalServiceMetricsStatusResponses, ExternalServiceMetricsToggleData, ExternalServiceMetricsToggleErrors, ExternalServiceMetricsToggleResponses, ExternalServiceMetricsUpdateAlertRuleData, ExternalServiceMetricsUpdateAlertRuleErrors, ExternalServiceMetricsUpdateAlertRuleResponses, ExternalServiceResetPgStatStatementsData, ExternalServiceResetPgStatStatementsErrors, ExternalServiceResetPgStatStatementsResponses, FinalizeOrderData, FinalizeOrderErrors, FinalizeOrderResponses, FinalizeProjectReleaseData, FinalizeProjectReleaseErrors, FinalizeProjectReleaseResponses, FindConversationData, FindConversationErrors, FindConversationResponses, GenerateJoinTokenData, GenerateJoinTokenErrors, GenerateJoinTokenResponses, GeneratePresetDockerfileData, GeneratePresetDockerfileErrors, GeneratePresetDockerfileResponses, GetAccessInfoData, GetAccessInfoErrors, GetAccessInfoResponses, GetActiveVisitorsData, GetActiveVisitorsErrors, GetActiveVisitorsResponses, GetActivityGraphData, GetActivityGraphErrors, GetActivityGraphResponses, GetAdminGateData, GetAdminGateErrors, GetAdminGateResponses, GetAgentData, GetAgentErrors, GetAgentResponses, GetAggregatedBucketsData, GetAggregatedBucketsErrors, GetAggregatedBucketsResponses, GetAiAgentBreakdownData, GetAiAgentBreakdownErrors, GetAiAgentBreakdownResponses, GetAiAgentPagesData, GetAiAgentPagesErrors, GetAiAgentPagesResponses, GetAiAgentTimelineData, GetAiAgentTimelineErrors, GetAiAgentTimelineResponses, GetAiPageBreakdownData, GetAiPageBreakdownErrors, GetAiPageBreakdownResponses, GetAiStatusBreakdownData, GetAiStatusBreakdownErrors, GetAiStatusBreakdownResponses, GetAlertData, GetAlertErrors, GetAlertResponses, GetAlertRuleData, GetAlertRuleErrors, GetAlertRuleResponses, GetAllRepositoriesByNameData, GetAllRepositoriesByNameErrors, GetAllRepositoriesByNameResponses, GetAnalyticsActiveVisitorsData, GetAnalyticsActiveVisitorsErrors, GetAnalyticsActiveVisitorsResponses, GetAnalyticsEventsCountData, GetAnalyticsEventsCountErrors, GetAnalyticsEventsCountResponses, GetAnalyticsSessionEventsData, GetAnalyticsSessionEventsErrors, GetAnalyticsSessionEventsResponses, GetAnalyticsVisitorSessionsData, GetAnalyticsVisitorSessionsErrors, GetAnalyticsVisitorSessionsResponses, GetApiKeyData, GetApiKeyErrors, GetApiKeyPermissionsData, GetApiKeyPermissionsErrors, GetApiKeyPermissionsResponses, GetApiKeyResponses, GetAuditLogData, GetAuditLogErrors, GetAuditLogResponses, GetBackupData, GetBackupErrors, GetBackupResponses, GetBackupScheduleData, GetBackupScheduleErrors, GetBackupScheduleResponses, GetBranchesByRepositoryIdData, GetBranchesByRepositoryIdErrors, GetBranchesByRepositoryIdResponses, GetBucketedIncidentsData, GetBucketedIncidentsErrors, GetBucketedIncidentsResponses, GetBucketedStatusData, GetBucketedStatusErrors, GetBucketedStatusResponses, GetChallengeTokenData, GetChallengeTokenErrors, GetChallengeTokenResponses, GetChatReadinessData, GetChatReadinessErrors, GetChatReadinessResponses, GetCliStatusData, GetCliStatusErrors, GetCliStatusResponses, GetClusterHealthData, GetClusterHealthErrors, GetClusterHealthResponses, GetClusterMemberData, GetClusterMemberErrors, GetClusterMemberResponses, GetCmdData, GetCmdErrors, GetCmdResponses, GetContainerDetailData, GetContainerDetailErrors, GetContainerDetailResponses, GetContainerEnvironmentVariableData, GetContainerEnvironmentVariableErrors, GetContainerEnvironmentVariableResponses, GetContainerInfoData, GetContainerInfoErrors, GetContainerInfoResponses, GetContainerLogsByIdData, GetContainerLogsByIdErrors, GetContainerLogsData, GetContainerLogsErrors, GetContainerMetricsData, GetContainerMetricsErrors, GetContainerMetricsResponses, GetConversationData, GetConversationDetailData, GetConversationDetailErrors, GetConversationDetailResponses, GetConversationErrors, GetConversationResponses, GetConversationsData, GetConversationsErrors, GetConversationsResponses, GetCronByIdData, GetCronByIdErrors, GetCronByIdResponses, GetCronExecutionsData, GetCronExecutionsErrors, GetCronExecutionsResponses, GetCrossProjectTraceSiblingsData, GetCrossProjectTraceSiblingsErrors, GetCrossProjectTraceSiblingsResponses, GetCurrentMonitorStatusData, GetCurrentMonitorStatusErrors, GetCurrentMonitorStatusResponses, GetCurrentUserData, GetCurrentUserErrors, GetCurrentUserResponses, GetCustomDomainData, GetCustomDomainErrors, GetCustomDomainResponses, GetDashboardData, GetDashboardErrors, GetDashboardProjectsAnalyticsData, GetDashboardProjectsAnalyticsErrors, GetDashboardProjectsAnalyticsResponses, GetDashboardResponses, GetDeliveryData, GetDeliveryErrors, GetDeliveryResponses, GetDeploymentContainerLogContentData, GetDeploymentContainerLogContentErrors, GetDeploymentContainerLogContentResponses, GetDeploymentData, GetDeploymentErrors, GetDeploymentJobLogsData, GetDeploymentJobLogsErrors, GetDeploymentJobLogsResponses, GetDeploymentJobsData, GetDeploymentJobsErrors, GetDeploymentJobsResponses, GetDeploymentOperationsData, GetDeploymentOperationsErrors, GetDeploymentOperationsResponses, GetDeploymentOperationStatusData, GetDeploymentOperationStatusErrors, GetDeploymentOperationStatusResponses, GetDeploymentResponses, GetDeploymentTokenData, GetDeploymentTokenErrors, GetDeploymentTokenResponses, GetDiskStatusData, GetDiskStatusErrors, GetDiskStatusResponses, GetDnsChangesData, GetDnsChangesErrors, GetDnsChangesResponses, GetDnsProviderData, GetDnsProviderErrors, GetDnsProviderResponses, GetDomainByHostData, GetDomainByHostErrors, GetDomainByHostResponses, GetDomainByIdData, GetDomainByIdErrors, GetDomainByIdResponses, GetDomainByNameData, GetDomainByNameErrors, GetDomainByNameResponses, GetDomainData, GetDomainDnsRecordsData, GetDomainDnsRecordsErrors, GetDomainDnsRecordsResponses, GetDomainErrors, GetDomainOrderData, GetDomainOrderErrors, GetDomainOrderResponses, GetDomainResponses, GetEmailData, GetEmailErrors, GetEmailEventsData, GetEmailEventsErrors, GetEmailEventsResponses, GetEmailLinksData, GetEmailLinksErrors, GetEmailLinksResponses, GetEmailProviderData, GetEmailProviderErrors, GetEmailProviderResponses, GetEmailResponses, GetEmailStatsData, GetEmailStatsErrors, GetEmailStatsResponses, GetEmailTrackingData, GetEmailTrackingErrors, GetEmailTrackingResponses, GetEmailTrackingStatusData, GetEmailTrackingStatusErrors, GetEmailTrackingStatusResponses, GetEntityInfoData, GetEntityInfoErrors, GetEntityInfoResponses, GetEnvironmentCronsData, GetEnvironmentCronsErrors, GetEnvironmentCronsResponses, GetEnvironmentData, GetEnvironmentDomainsData, GetEnvironmentDomainsErrors, GetEnvironmentDomainsResponses, GetEnvironmentErrors, GetEnvironmentResponses, GetEnvironmentsData, GetEnvironmentsErrors, GetEnvironmentsResponses, GetEnvironmentVariablesData, GetEnvironmentVariablesErrors, GetEnvironmentVariablesResponses, GetEnvironmentVariableValueData, GetEnvironmentVariableValueErrors, GetEnvironmentVariableValueResponses, GetErrorDashboardStatsData, GetErrorDashboardStatsErrors, GetErrorDashboardStatsResponses, GetErrorEventData, GetErrorEventErrors, GetErrorEventResponses, GetErrorGroupData, GetErrorGroupErrors, GetErrorGroupResponses, GetErrorStatsData, GetErrorStatsErrors, GetErrorStatsResponses, GetErrorTimeSeriesData, GetErrorTimeSeriesErrors, GetErrorTimeSeriesResponses, GetEventDetailData, GetEventDetailErrors, GetEventDetailResponses, GetEventEntriesData, GetEventEntriesErrors, GetEventEntriesResponses, GetEventsCountData, GetEventsCountErrors, GetEventsCountResponses, GetEventsTimelineData, GetEventsTimelineErrors, GetEventsTimelineResponses, GetEventTypeBreakdownData, GetEventTypeBreakdownErrors, GetEventTypeBreakdownResponses, GetEventVisitorsData, GetEventVisitorsErrors, GetEventVisitorsResponses, GetExternalImageData, GetExternalImageErrors, GetExternalImageResponses, GetFileData, GetFileErrors, GetFileResponses, GetFlagData, GetFlagErrors, GetFlagResponses, GetFlagSnapshotData, GetFlagSnapshotErrors, GetFlagSnapshotResponses, GetFunnelMetricsData, GetFunnelMetricsErrors, GetFunnelMetricsResponses, GetGenaiTraceData, GetGenaiTraceErrors, GetGenaiTraceResponses, GetGeneralStatsData, GetGeneralStatsErrors, GetGeneralStatsResponses, GetGitProviderData, GetGitProviderErrors, GetGitProviderResponses, GetGlobalEventsData, GetGlobalEventsErrors, GetGlobalEventsResponses, GetGlobalEventStatsData, GetGlobalEventStatsErrors, GetGlobalEventStatsResponses, GetGlobalMcpData, GetGlobalMcpErrors, GetGlobalMcpResponses, GetGlobalSandboxStatusData, GetGlobalSandboxStatusErrors, GetGlobalSandboxStatusResponses, GetGlobalSkillData, GetGlobalSkillErrors, GetGlobalSkillResponses, GetGroupedPageMetricsData, GetGroupedPageMetricsErrors, GetGroupedPageMetricsResponses, GetHealthData, GetHealthErrors, GetHealthResponses, GetHourlyVisitsData, GetHourlyVisitsErrors, GetHourlyVisitsResponses, GetHttpChallengeDebugData, GetHttpChallengeDebugErrors, GetHttpChallengeDebugResponses, GetImportStatusData, GetImportStatusErrors, GetImportStatusResponses, GetIncidentData, GetIncidentErrors, GetIncidentResponses, GetIncidentUpdatesData, GetIncidentUpdatesErrors, GetIncidentUpdatesResponses, GetIpAccessControlData, GetIpAccessControlErrors, GetIpAccessControlResponses, GetIpGeolocationData, GetIpGeolocationErrors, GetIpGeolocationResponses, GetJoinTokenStatusData, GetJoinTokenStatusErrors, GetJoinTokenStatusResponses, GetLastDeploymentData, GetLastDeploymentErrors, GetLastDeploymentResponses, GetLatestScanData, GetLatestScanErrors, GetLatestScanResponses, GetLatestScansPerEnvironmentData, GetLatestScansPerEnvironmentErrors, GetLatestScansPerEnvironmentResponses, GetLiveVisitorsListData, GetLiveVisitorsListErrors, GetLiveVisitorsListResponses, GetLogContextData, GetLogContextErrors, GetLogContextResponses, GetMcpData, GetMcpErrors, GetMcpResponses, GetMetricsOverTimeData, GetMetricsOverTimeErrors, GetMetricsOverTimeResponses, GetMonitorData, GetMonitorErrors, GetMonitorResponses, GetNotificationProviderData, GetNotificationProviderErrors, GetNotificationProviderResponses, GetOnDemandCertStatusData, GetOnDemandCertStatusErrors, GetOnDemandCertStatusResponses, GetOrCreateDsnData, GetOrCreateDsnErrors, GetOrCreateDsnResponses, GetPageFlowData, GetPageFlowErrors, GetPageFlowResponses, GetPageHourlySessionsData, GetPageHourlySessionsErrors, GetPageHourlySessionsResponses, GetPagePathDetailData, GetPagePathDetailErrors, GetPagePathDetailResponses, GetPagePathsData, GetPagePathsErrors, GetPagePathsResponses, GetPagePathsSparklinesData, GetPagePathsSparklinesErrors, GetPagePathsSparklinesResponses, GetPagePathVisitorsData, GetPagePathVisitorsErrors, GetPagePathVisitorsResponses, GetPendingActionData, GetPendingActionErrors, GetPendingActionResponses, GetPerformanceMetricsData, GetPerformanceMetricsErrors, GetPerformanceMetricsResponses, GetPgUpgradeData, GetPgUpgradeErrors, GetPgUpgradeLogsData, GetPgUpgradeLogsErrors, GetPgUpgradeLogsResponses, GetPgUpgradeResponses, GetPipelineStatsData, GetPipelineStatsErrors, GetPipelineStatsResponses, GetPlatformInfoData, GetPlatformInfoErrors, GetPlatformInfoResponses, GetPostgresWalHealthData, GetPostgresWalHealthErrors, GetPostgresWalHealthResponses, GetPreferencesData, GetPreferencesErrors, GetPreferencesResponses, GetPreviewGatewayLogsData, GetPreviewGatewayLogsResponses, GetPreviewGatewaySettingsData, GetPreviewGatewaySettingsResponses, GetPreviewGatewayStatusData, GetPreviewGatewayStatusResponses, GetPricingData, GetPricingErrors, GetPricingResponses, GetPrivateIpData, GetPrivateIpErrors, GetPrivateIpResponses, GetProjectAlarmsSummaryData, GetProjectAlarmsSummaryErrors, GetProjectAlarmsSummaryResponses, GetProjectBySlugData, GetProjectBySlugErrors, GetProjectBySlugResponses, GetProjectData, GetProjectDeploymentsData, GetProjectDeploymentsErrors, GetProjectDeploymentsResponses, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectServiceEnvironmentVariablesData, GetProjectServiceEnvironmentVariablesErrors, GetProjectServiceEnvironmentVariablesResponses, GetProjectSessionReplaysData, GetProjectSessionReplaysErrors, GetProjectSessionReplaysResponses, GetProjectsHealthData, GetProjectsHealthErrors, GetProjectsHealthResponses, GetProjectsMonitorHealthData, GetProjectsMonitorHealthErrors, GetProjectsMonitorHealthResponses, GetProjectsResponses, GetProjectStatisticsData, GetProjectStatisticsErrors, GetProjectStatisticsResponses, GetProjectTemplateData, GetProjectTemplateErrors, GetProjectTemplateResponses, GetPropertyBreakdownData, GetPropertyBreakdownErrors, GetPropertyBreakdownResponses, GetPropertyTimelineData, GetPropertyTimelineErrors, GetPropertyTimelineResponses, GetProviderConnectionsData, GetProviderConnectionsErrors, GetProviderConnectionsResponses, GetProviderMetadataData, GetProviderMetadataErrors, GetProviderMetadataResponses, GetProvidersMetadataData, GetProvidersMetadataErrors, GetProvidersMetadataResponses, GetProxyLogByIdData, GetProxyLogByIdErrors, GetProxyLogByIdResponses, GetProxyLogByRequestIdData, GetProxyLogByRequestIdErrors, GetProxyLogByRequestIdResponses, GetProxyLogsData, GetProxyLogsErrors, GetProxyLogsResponses, GetPublicBranchesData, GetPublicBranchesErrors, GetPublicBranchesResponses, GetPublicIpData, GetPublicIpErrors, GetPublicIpResponses, GetPublicRepositoryData, GetPublicRepositoryErrors, GetPublicRepositoryResponses, GetQuotaData, GetQuotaErrors, GetQuotaResponses, GetRecentActivityData, GetRecentActivityErrors, GetRecentActivityResponses, GetRemoteExternalImageData, GetRemoteExternalImageErrors, GetRemoteExternalImageResponses, GetRepositoryBranchesData, GetRepositoryBranchesErrors, GetRepositoryBranchesResponses, GetRepositoryByIdData, GetRepositoryByIdErrors, GetRepositoryByIdResponses, GetRepositoryByNameData, GetRepositoryByNameErrors, GetRepositoryByNameResponses, GetRepositoryPresetByNameData, GetRepositoryPresetByNameErrors, GetRepositoryPresetByNameResponses, GetRepositoryPresetLiveData, GetRepositoryPresetLiveErrors, GetRepositoryPresetLiveResponses, GetRepositoryTagsData, GetRepositoryTagsErrors, GetRepositoryTagsResponses, GetResolvedEnvironmentVariablesData, GetResolvedEnvironmentVariablesErrors, GetResolvedEnvironmentVariablesResponses, GetResolvedEnvironmentVariableValueData, GetResolvedEnvironmentVariableValueErrors, GetResolvedEnvironmentVariableValueResponses, GetRestoreCapabilitiesData, GetRestoreCapabilitiesErrors, GetRestoreCapabilitiesResponses, GetRestoreRunData, GetRestoreRunErrors, GetRestoreRunResponses, GetRouteData, GetRouteErrors, GetRouteResponses, GetRunData, GetRunErrors, GetRunResponses, GetRunWithLogsData, GetRunWithLogsErrors, GetRunWithLogsResponses, GetS3CredentialsData, GetS3CredentialsErrors, GetS3CredentialsResponses, GetS3SourceData, GetS3SourceErrors, GetS3SourceResponses, GetSandboxData, GetSandboxErrors, GetSandboxResponses, GetSandboxStatusData, GetSandboxStatusErrors, GetSandboxStatusResponses, GetScanByDeploymentData, GetScanByDeploymentErrors, GetScanByDeploymentResponses, GetScanData, GetScanErrors, GetScanResponses, GetScanVulnerabilitiesData, GetScanVulnerabilitiesErrors, GetScanVulnerabilitiesResponses, GetServiceBySlugData, GetServiceBySlugErrors, GetServiceBySlugResponses, GetServiceData, GetServiceEnvironmentVariableData, GetServiceEnvironmentVariableErrors, GetServiceEnvironmentVariableResponses, GetServiceEnvironmentVariablesData, GetServiceEnvironmentVariablesErrors, GetServiceEnvironmentVariablesResponses, GetServiceErrors, GetServiceHealthStatusData, GetServiceHealthStatusErrors, GetServiceHealthStatusResponses, GetServicePreviewEnvironmentVariableNamesData, GetServicePreviewEnvironmentVariableNamesErrors, GetServicePreviewEnvironmentVariableNamesResponses, GetServicePreviewEnvironmentVariablesMaskedData, GetServicePreviewEnvironmentVariablesMaskedErrors, GetServicePreviewEnvironmentVariablesMaskedResponses, GetServiceResponses, GetServiceRuntimeData, GetServiceRuntimeErrors, GetServiceRuntimeResponses, GetServiceStatsData, GetServiceStatsErrors, GetServiceStatsResponses, GetServiceTypeParametersData, GetServiceTypeParametersErrors, GetServiceTypeParametersResponses, GetServiceTypesData, GetServiceTypesErrors, GetServiceTypesResponses, GetSessionDetailsData, GetSessionDetailsErrors, GetSessionDetailsResponses, GetSessionEventsData, GetSessionEventsErrors, GetSessionEventsResponses, GetSessionLogsData, GetSessionLogsErrors, GetSessionLogsResponses, GetSessionReplayData, GetSessionReplayErrors, GetSessionReplayEventsData, GetSessionReplayEventsErrors, GetSessionReplayEventsResponses, GetSessionReplayResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSkillData, GetSkillErrors, GetSkillResponses, GetSlowQueriesData, GetSlowQueriesErrors, GetSlowQueriesResponses, GetStaticBundleData, GetStaticBundleErrors, GetStaticBundleResponses, GetStatusOverviewData, GetStatusOverviewErrors, GetStatusOverviewResponses, GetTagsByRepositoryIdData, GetTagsByRepositoryIdErrors, GetTagsByRepositoryIdResponses, GetTeamData, GetTeamErrors, GetTeamResponses, GetTimeBucketStatsData, GetTimeBucketStatsErrors, GetTimeBucketStatsResponses, GetTodayStatsData, GetTodayStatsErrors, GetTodayStatsResponses, GetTraceData, GetTraceErrors, GetTraceResponses, GetUnifiedTraceData, GetUnifiedTraceErrors, GetUnifiedTraceResponses, GetUniqueCountsData, GetUniqueCountsErrors, GetUniqueCountsResponses, GetUniqueEventsData, GetUniqueEventsErrors, GetUniqueEventsResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, GetUptimeHistoryData, GetUptimeHistoryErrors, GetUptimeHistoryResponses, GetUsageByProviderData, GetUsageByProviderErrors, GetUsageByProviderResponses, GetUsageRecentData, GetUsageRecentErrors, GetUsageRecentResponses, GetUsageSummaryData, GetUsageSummaryErrors, GetUsageSummaryResponses, GetUsageTimeseriesData, GetUsageTimeseriesErrors, GetUsageTimeseriesResponses, GetUsageTopModelsData, GetUsageTopModelsErrors, GetUsageTopModelsResponses, GetVisitorByGuidData, GetVisitorByGuidErrors, GetVisitorByGuidResponses, GetVisitorByIdData, GetVisitorByIdErrors, GetVisitorByIdResponses, GetVisitorDetailsData, GetVisitorDetailsErrors, GetVisitorDetailsResponses, GetVisitorFacetsData, GetVisitorFacetsErrors, GetVisitorFacetsResponses, GetVisitorInfoData, GetVisitorInfoErrors, GetVisitorInfoResponses, GetVisitorJourneyData, GetVisitorJourneyErrors, GetVisitorJourneyResponses, GetVisitorsData, GetVisitorsErrors, GetVisitorSessionsData, GetVisitorSessionsErrors, GetVisitorSessionsResponses, GetVisitorsResponses, GetVisitorStatsData, GetVisitorStatsErrors, GetVisitorStatsResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponses, GrantProjectAccessData, GrantProjectAccessErrors, GrantProjectAccessResponses, HandleGitProviderOauthCallbackData, HandleGitProviderOauthCallbackErrors, HasAnalyticsEventsData, HasAnalyticsEventsErrors, HasAnalyticsEventsResponses, HasErrorGroupsData, HasErrorGroupsErrors, HasErrorGroupsResponses, HasPerformanceMetricsData, HasPerformanceMetricsErrors, HasPerformanceMetricsResponses, ImportExternalServiceData, ImportExternalServiceErrors, ImportExternalServiceResponses, IngestLogsByPathData, IngestLogsByPathErrors, IngestLogsByPathResponses, IngestLogsData, IngestLogsErrors, IngestLogsResponses, IngestMetricsByPathData, IngestMetricsByPathErrors, IngestMetricsByPathResponses, IngestMetricsData, IngestMetricsErrors, IngestMetricsResponses, IngestSentryEnvelopeData, IngestSentryEnvelopeErrors, IngestSentryEnvelopeResponses, IngestSentryEventData, IngestSentryEventErrors, IngestSentryEventResponses, IngestTracesByPathData, IngestTracesByPathErrors, IngestTracesByPathResponses, IngestTracesData, IngestTracesErrors, IngestTracesResponses, InitSessionReplayData, InitSessionReplayErrors, InitSessionReplayResponses, InspectDropArchiveData, InspectDropArchiveErrors, InspectDropArchiveResponses, JobLogsData, JobLogsErrors, JobLogsResponses, JobStatusData, JobStatusErrors, JobStatusResponses, KillJobData, KillJobErrors, KillJobResponses, KvDelData, KvDelErrors, KvDelResponses, KvDisableData, KvDisableErrors, KvDisableResponses, KvEnableData, KvEnableErrors, KvEnableResponses, KvExpireData, KvExpireErrors, KvExpireResponses, KvGetData, KvGetErrors, KvGetResponses, KvIncrData, KvIncrErrors, KvIncrResponses, KvKeysData, KvKeysErrors, KvKeysResponses, KvSetData, KvSetErrors, KvSetResponses, KvStatusData, KvStatusErrors, KvStatusResponses, KvTtlData, KvTtlErrors, KvTtlResponses, KvUpdateData, KvUpdateErrors, KvUpdateResponses, LatestRunForSourceData, LatestRunForSourceErrors, LatestRunForSourceResponses, LinkCustomDomainToCertificateData, LinkCustomDomainToCertificateErrors, LinkCustomDomainToCertificateResponses, LinkServiceToProjectData, LinkServiceToProjectErrors, LinkServiceToProjectResponses, ListAgentRunsData, ListAgentRunsErrors, ListAgentRunsResponses, ListAgentsData, ListAgentsErrors, ListAgentsResponses, ListAiProvidersData, ListAiProvidersErrors, ListAiProvidersResponses, ListAlertRulesData, ListAlertRulesErrors, ListAlertRulesResponses, ListAlertsData, ListAlertsErrors, ListAlertsResponses, ListAllConversationsData, ListAllConversationsErrors, ListAllConversationsResponses, ListAllRunsData, ListAllRunsErrors, ListAllRunsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysResponses, ListAuditLogsData, ListAuditLogsErrors, ListAuditLogsResponses, ListAvailableContainersData, ListAvailableContainersErrors, ListAvailableContainersResponses, ListBackupAlertsData, ListBackupAlertsErrors, ListBackupAlertsResponses, ListBackupChildrenData, ListBackupChildrenErrors, ListBackupChildrenResponses, ListBackupSchedulesData, ListBackupSchedulesErrors, ListBackupSchedulesResponses, ListBackupsForScheduleData, ListBackupsForScheduleErrors, ListBackupsForScheduleResponses, ListCommitsByRepositoryIdData, ListCommitsByRepositoryIdErrors, ListCommitsByRepositoryIdResponses, ListConnectionsData, ListConnectionsErrors, ListConnectionsResponses, ListContainersAtPathData, ListContainersAtPathErrors, ListContainersAtPathResponses, ListContainersData, ListContainersErrors, ListContainersResponses, ListConversationsData, ListConversationsErrors, ListConversationsResponses, ListCustomDomainsForProjectData, ListCustomDomainsForProjectErrors, ListCustomDomainsForProjectResponses, ListDashboardsData, ListDashboardsErrors, ListDashboardsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponses, ListDeploymentContainerLogsData, ListDeploymentContainerLogsErrors, ListDeploymentContainerLogsResponses, ListDeploymentTokensData, ListDeploymentTokensErrors, ListDeploymentTokensResponses, ListDnsProvidersData, ListDnsProvidersErrors, ListDnsProvidersResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponses, ListDsnsData, ListDsnsErrors, ListDsnsResponses, ListEmailDomainsData, ListEmailDomainsErrors, ListEmailDomainsResponses, ListEmailProvidersData, ListEmailProvidersErrors, ListEmailProvidersResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponses, ListEnrollmentTokensData, ListEnrollmentTokensErrors, ListEnrollmentTokensResponses, ListEntitiesData, ListEntitiesErrors, ListEntitiesResponses, ListErrorEventsData, ListErrorEventsErrors, ListErrorEventsResponses, ListErrorGroupsData, ListErrorGroupsErrors, ListErrorGroupsResponses, ListEventsData, ListEventsResponses, ListEventTypesData, ListEventTypesResponses, ListExternalImagesData, ListExternalImagesErrors, ListExternalImagesResponses, ListExternalPluginsData, ListExternalPluginsErrors, ListExternalPluginsResponses, ListExternalServiceBackupsData, ListExternalServiceBackupsErrors, ListExternalServiceBackupsResponses, ListFlagsData, ListFlagsErrors, ListFlagsResponses, ListFunnelsData, ListFunnelsErrors, ListFunnelsResponses, ListGitProvidersData, ListGitProvidersErrors, ListGitProvidersResponses, ListGlobalMcpsData, ListGlobalMcpsErrors, ListGlobalMcpsResponses, ListGlobalSkillsData, ListGlobalSkillsErrors, ListGlobalSkillsResponses, ListIncidentsData, ListIncidentsErrors, ListIncidentsResponses, ListInsightsData, ListInsightsErrors, ListInsightsResponses, ListIpAccessControlData, ListIpAccessControlErrors, ListIpAccessControlResponses, ListJobsData, ListJobsErrors, ListJobsResponses, ListKnownAiAgentsData, ListKnownAiAgentsErrors, ListKnownAiAgentsResponses, ListManagedDomainsData, ListManagedDomainsErrors, ListManagedDomainsResponses, ListMcpsData, ListMcpsErrors, ListMcpsResponses, ListMetricLabelKeysData, ListMetricLabelKeysErrors, ListMetricLabelKeysResponses, ListMetricLabelValuesData, ListMetricLabelValuesErrors, ListMetricLabelValuesResponses, ListMetricNamesData, ListMetricNamesErrors, ListMetricNamesResponses, ListModelsData, ListModelsErrors, ListModelsResponses, ListMonitorsData, ListMonitorsErrors, ListMonitorsResponses, ListNotificationProvidersData, ListNotificationProvidersErrors, ListNotificationProvidersResponses, ListOidcProvidersData, ListOidcProvidersResponses, ListOidcProviderUsersData, ListOidcProviderUsersErrors, ListOidcProviderUsersResponses, ListOidcRoleMappingsData, ListOidcRoleMappingsResponses, ListOnDemandCertsData, ListOnDemandCertsErrors, ListOnDemandCertsResponses, ListOrdersData, ListOrdersErrors, ListOrdersResponses, ListPeersData, ListPeersErrors, ListPeersResponses, ListPendingActionsData, ListPendingActionsErrors, ListPendingActionsResponses, ListPgUpgradesData, ListPgUpgradesErrors, ListPgUpgradesResponses, ListPresetsData, ListPresetsErrors, ListPresetsResponses, ListProjectAccessData, ListProjectAccessErrors, ListProjectAccessResponses, ListProjectAlarmsData, ListProjectAlarmsErrors, ListProjectAlarmsResponses, ListProjectScansData, ListProjectScansErrors, ListProjectScansResponses, ListProjectSecretsData, ListProjectSecretsErrors, ListProjectSecretsResponses, ListProjectServicesData, ListProjectServicesErrors, ListProjectServicesResponses, ListProjectTemplatesData, ListProjectTemplatesErrors, ListProjectTemplatesResponses, ListProjectTemplateTagsData, ListProjectTemplateTagsErrors, ListProjectTemplateTagsResponses, ListProviderKeysData, ListProviderKeysErrors, ListProviderKeysResponses, ListProviderZonesData, ListProviderZonesErrors, ListProviderZonesResponses, ListPublicProvidersData, ListPublicProvidersResponses, ListReleaseFilesData, ListReleaseFilesErrors, ListReleaseFilesResponses, ListReleasesData, ListReleasesErrors, ListReleasesResponses, ListRemoteExternalImagesData, ListRemoteExternalImagesErrors, ListRemoteExternalImagesResponses, ListRepositoriesByConnectionData, ListRepositoriesByConnectionErrors, ListRepositoriesByConnectionResponses, ListRepositoriesByProviderData, ListRepositoriesByProviderErrors, ListRepositoriesByProviderResponses, ListRestoreRunsForServiceData, ListRestoreRunsForServiceResponses, ListRootContainersData, ListRootContainersErrors, ListRootContainersResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponses, ListS3SourcesData, ListS3SourcesErrors, ListS3SourcesResponses, ListSandboxesData, ListSandboxesResponses, ListScheduleRunJobsData, ListScheduleRunJobsErrors, ListScheduleRunJobsResponses, ListScheduleRunsData, ListScheduleRunsErrors, ListScheduleRunsResponses, ListScheduleServicesData, ListScheduleServicesErrors, ListScheduleServicesResponses, ListSecretsData, ListSecretsErrors, ListSecretsResponses, ListServiceHealthStatusesData, ListServiceHealthStatusesErrors, ListServiceHealthStatusesResponses, ListServiceProjectsData, ListServiceProjectsErrors, ListServiceProjectsResponses, ListServiceSchedulesData, ListServiceSchedulesErrors, ListServiceSchedulesResponses, ListServicesData, ListServicesErrors, ListServicesResponses, ListSkillsData, ListSkillsErrors, ListSkillsResponses, ListSourceBackupsData, ListSourceBackupsErrors, ListSourceBackupsResponses, ListSourceFilesData, ListSourceFilesErrors, ListSourceFilesResponses, ListSourceMapsData, ListSourceMapsErrors, ListSourceMapsResponses, ListSourcesData, ListSourcesErrors, ListSourcesResponses, ListStaticBundlesData, ListStaticBundlesErrors, ListStaticBundlesResponses, ListSyncedRepositoriesData, ListSyncedRepositoriesErrors, ListSyncedRepositoriesResponses, ListTeamMembersData, ListTeamMembersErrors, ListTeamMembersResponses, ListTeamProjectsData, ListTeamProjectsErrors, ListTeamProjectsResponses, ListTeamsData, ListTeamsErrors, ListTeamsResponses, ListUsersData, ListUsersErrors, ListUsersResponses, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponses, LoginData, LoginErrors, LoginResponses, LogoutData, LogoutErrors, LogoutResponses, LookupDnsARecordsData, LookupDnsARecordsErrors, LookupDnsARecordsResponses, MintEnrollmentTokenData, MintEnrollmentTokenErrors, MintEnrollmentTokenResponses, MkdirData, MkdirErrors, MkdirResponses, NodeHeartbeatData, NodeHeartbeatErrors, NodeHeartbeatResponses, NodeMetricsGetRangeData, NodeMetricsGetRangeErrors, NodeMetricsGetRangeResponses, ObservabilityFullEventData, ObservabilityFullEventErrors, ObservabilityFullEventResponses, ObservabilityListEventsData, ObservabilityListEventsErrors, ObservabilityListEventsResponses, OidcCallbackData, PatchAdminGateData, PatchAdminGateErrors, PatchAdminGateResponses, PatchPreviewGatewaySettingsData, PatchPreviewGatewaySettingsResponses, PauseDeploymentData, PauseDeploymentErrors, PauseDeploymentResponses, PauseSandboxData, PauseSandboxErrors, PauseSandboxResponses, PlanRestoreData, PlanRestoreErrors, PlanRestoreResponses, PostDnsAckData, PostDnsAckErrors, PostDnsAckResponses, PreviewAlertData, PreviewAlertErrors, PreviewAlertResponses, PreviewFunnelMetricsData, PreviewFunnelMetricsErrors, PreviewFunnelMetricsResponses, PreviewHostnameModeData, PreviewHostnameModeErrors, PreviewHostnameModeResponses, PromoteClusterMemberData, PromoteClusterMemberErrors, PromoteClusterMemberResponses, PromoteDeploymentData, PromoteDeploymentErrors, PromoteDeploymentResponses, ProvisionDomainData, ProvisionDomainErrors, ProvisionDomainResponses, PurgeProjectLogsData, PurgeProjectLogsErrors, PurgeProjectLogsResponses, PushExternalImageData, PushExternalImageErrors, PushExternalImageResponses, QueryDataData, QueryDataErrors, QueryDataResponses, QueryGenaiTracesData, QueryGenaiTracesErrors, QueryGenaiTracesResponses, QueryLogsData, QueryLogsErrors, QueryLogsResponses, QueryMetricsData, QueryMetricsErrors, QueryMetricsResponses, QueryTracesData, QueryTracesErrors, QueryTracesResponses, QueryTraceSummariesData, QueryTraceSummariesErrors, QueryTraceSummariesResponses, ReadFileData, ReadFileErrors, ReadFileResponses, ReAnalyzeData, ReAnalyzeErrors, ReAnalyzeResponses, RecordConsoleEventData, RecordConsoleEventErrors, RecordConsoleEventResponses, RecordEventMetricsData, RecordEventMetricsErrors, RecordEventMetricsResponses, RecordFlagExposureData, RecordFlagExposureErrors, RecordFlagExposureResponses, RecordSpeedMetricsData, RecordSpeedMetricsErrors, RecordSpeedMetricsResponses, RefreshRouteTableData, RefreshRouteTableErrors, RefreshRouteTableResponses, RegenerateDsnData, RegenerateDsnErrors, RegenerateDsnResponses, RegisterExternalImageData, RegisterExternalImageErrors, RegisterExternalImageResponses, RegisterNodeData, RegisterNodeErrors, RegisterNodeResponses, ReinstallGitlabWebhookData, ReinstallGitlabWebhookErrors, ReinstallGitlabWebhookResponses, RejectPendingActionData, RejectPendingActionErrors, RejectPendingActionResponses, ReloadPluginsData, ReloadPluginsErrors, ReloadPluginsResponses, RemoveClusterMemberData, RemoveClusterMemberErrors, RemoveClusterMemberResponses, RemoveManagedDomainData, RemoveManagedDomainErrors, RemoveManagedDomainResponses, RemoveRoleData, RemoveRoleErrors, RemoveRoleResponses, RemoveTeamMemberData, RemoveTeamMemberErrors, RemoveTeamMemberResponses, RenameConversationData, RenameConversationErrors, RenameConversationResponses, RenewDomainData, RenewDomainErrors, RenewDomainResponses, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponses, ResetPasswordData, ResetPasswordErrors, ResetPasswordResponses, ResizeSandboxData, ResizeSandboxErrors, ResizeSandboxResponses, ResolveAlarmData, ResolveAlarmErrors, ResolveAlarmResponses, RestartContainerData, RestartContainerErrors, RestartContainerResponses, RestartPreviewGatewayData, RestartPreviewGatewayResponses, RestartSandboxData, RestartSandboxErrors, RestartSandboxResponses, RestoreFlagData, RestoreFlagErrors, RestoreFlagResponses, RestoreUserData, RestoreUserErrors, RestoreUserResponses, ResumeDeploymentData, ResumeDeploymentErrors, ResumeDeploymentResponses, ResumeSandboxData, ResumeSandboxErrors, ResumeSandboxResponses, RetryClusterData, RetryClusterErrors, RetryClusterResponses, RetryDeliveryData, RetryDeliveryErrors, RetryDeliveryResponses, RetryPgUpgradeData, RetryPgUpgradeErrors, RetryPgUpgradeResponses, RetryRunData, RetryRunErrors, RetryRunResponses, RevealGlobalMcpConfigData, RevealGlobalMcpConfigErrors, RevealGlobalMcpConfigResponses, RevealMcpConfigData, RevealMcpConfigErrors, RevealMcpConfigResponses, RevealNotificationProviderConfigData, RevealNotificationProviderConfigErrors, RevealNotificationProviderConfigResponses, RevealServiceParameterData, RevealServiceParameterErrors, RevealServiceParameterResponses, RevenueCreateIntegrationData, RevenueCreateIntegrationErrors, RevenueCreateIntegrationResponses, RevenueDeleteIntegrationData, RevenueDeleteIntegrationResponses, RevenueGlobalEventsData, RevenueGlobalEventsResponses, RevenueImportInvoicesCsvData, RevenueImportInvoicesCsvErrors, RevenueImportInvoicesCsvResponses, RevenueImportSubscriptionsCsvData, RevenueImportSubscriptionsCsvErrors, RevenueImportSubscriptionsCsvResponses, RevenueListIntegrationsData, RevenueListIntegrationsResponses, RevenueListProvidersData, RevenueListProvidersResponses, RevenueMetricsCustomersData, RevenueMetricsCustomersResponses, RevenueMetricsGlobalMrrData, RevenueMetricsGlobalMrrResponses, RevenueMetricsGlobalSummaryData, RevenueMetricsGlobalSummaryResponses, RevenueMetricsMrrData, RevenueMetricsMrrResponses, RevenueMetricsSummaryData, RevenueMetricsSummaryResponses, RevenueRecentEventsData, RevenueRecentEventsResponses, RevenueRotateTokenData, RevenueRotateTokenResponses, RevenueUpdateConfigData, RevenueUpdateConfigErrors, RevenueUpdateConfigResponses, RevenueUpdateSecretData, RevenueUpdateSecretErrors, RevenueUpdateSecretResponses, RevokeDsnData, RevokeDsnErrors, RevokeDsnResponses, RevokeEnrollmentTokenData, RevokeEnrollmentTokenErrors, RevokeEnrollmentTokenResponses, RevokeJoinTokenData, RevokeJoinTokenErrors, RevokeJoinTokenResponses, RevokeProjectAccessData, RevokeProjectAccessErrors, RevokeProjectAccessResponses, RollbackPgUpgradeData, RollbackPgUpgradeErrors, RollbackPgUpgradeResponses, RollbackToDeploymentData, RollbackToDeploymentErrors, RollbackToDeploymentResponses, RootfsGcData, RootfsGcResponses, RootfsReportData, RootfsReportResponses, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponses, RotateDeploymentTokenData, RotateDeploymentTokenErrors, RotateDeploymentTokenResponses, RunBackupForSourceData, RunBackupForSourceErrors, RunBackupForSourceResponses, RunConnectionHealthCheckData, RunConnectionHealthCheckErrors, RunConnectionHealthCheckResponses, RunExternalServiceBackupData, RunExternalServiceBackupErrors, RunExternalServiceBackupResponses, RunScheduleNowData, RunScheduleNowErrors, RunScheduleNowResponses, SandboxCreatePreviewLinkData, SandboxCreatePreviewLinkErrors, SandboxCreatePreviewLinkResponses, SaveAgentTokenData, SaveAgentTokenErrors, SaveAgentTokenResponses, SaveAiProviderCredentialData, SaveAiProviderCredentialErrors, SaveAiProviderCredentialResponses, SearchLogsData, SearchLogsErrors, SearchLogsResponses, SendEmailData, SendEmailErrors, SendEmailResponses, SetDefaultS3SourceData, SetDefaultS3SourceErrors, SetDefaultS3SourceResponses, SetFlagEnvironmentData, SetFlagEnvironmentErrors, SetFlagEnvironmentResponses, SetPreviewPasswordData, SetPreviewPasswordErrors, SetPreviewPasswordResponses, SetupDnsChallengeData, SetupDnsChallengeErrors, SetupDnsChallengeResponses, SetupDnsData, SetupDnsErrors, SetupDnsResponses, SetupEmailTrackingData, SetupEmailTrackingErrors, SetupEmailTrackingResponses, SetupMfaData, SetupMfaErrors, SetupMfaResponses, SleepEnvironmentData, SleepEnvironmentErrors, SleepEnvironmentResponses, SmokeTestAgentData, SmokeTestAgentErrors, SmokeTestAgentResponses, SourceSandboxData, SourceSandboxErrors, SourceSandboxResponses, StartAnalysisData, StartAnalysisErrors, StartAnalysisResponses, StartContainerData, StartContainerErrors, StartContainerResponses, StartFixData, StartFixErrors, StartFixResponses, StartGitProviderOauthData, StartGitProviderOauthErrors, StartOidcLoginBySlugData, StartOidcLoginBySlugErrors, StartPgUpgradeData, StartPgUpgradeErrors, StartPgUpgradeResponses, StartRestoreData, StartRestoreErrors, StartRestoreResponses, StartServiceData, StartServiceErrors, StartServiceResponses, StatPathData, StatPathErrors, StatPathResponses, StopContainerData, StopContainerErrors, StopContainerResponses, StopSandboxData, StopSandboxErrors, StopSandboxResponses, StopServiceData, StopServiceErrors, StopServiceResponses, StreamContainerMetricsData, StreamContainerMetricsErrors, StreamContainerMetricsResponses, StreamEventsData, StreamEventsErrors, StreamEventsResponses, StreamRunEventsData, StreamRunEventsErrors, StreamRunEventsResponses, SyncRepositoriesData, SyncRepositoriesErrors, SyncRepositoriesResponses, TailDeploymentJobLogsData, TailDeploymentJobLogsErrors, TailLogsData, TailLogsErrors, TailLogsResponses, TeardownDeploymentData, TeardownDeploymentErrors, TeardownDeploymentResponses, TeardownEnvironmentData, TeardownEnvironmentErrors, TeardownEnvironmentResponses, TestNotificationProviderData, TestNotificationProviderErrors, TestNotificationProviderResponses, TestOidcProviderData, TestOidcProviderResponses, TestProviderConnectionData, TestProviderConnectionErrors, TestProviderConnectionResponses, TestProviderData, TestProviderErrors, TestProviderKeyByIdData, TestProviderKeyByIdErrors, TestProviderKeyByIdResponses, TestProviderKeyInlineData, TestProviderKeyInlineErrors, TestProviderKeyInlineResponses, TestProviderResponses, TestS3ConnectionPreviewData, TestS3ConnectionPreviewErrors, TestS3ConnectionPreviewResponses, TestS3SourceConnectionData, TestS3SourceConnectionErrors, TestS3SourceConnectionResponses, TrackClickData, TrackClickErrors, TrackOpenData, TrackOpenErrors, TrackOpenResponses, TriggerAgentData, TriggerAgentErrors, TriggerAgentResponses, TriggerProjectPipelineData, TriggerProjectPipelineErrors, TriggerProjectPipelineResponses, TriggerScanData, TriggerScanErrors, TriggerScanResponses, TriggerServiceHealthCheckData, TriggerServiceHealthCheckErrors, TriggerServiceHealthCheckResponses, TriggerWeeklyDigestData, TriggerWeeklyDigestErrors, TriggerWeeklyDigestResponses, UnlinkServiceFromProjectData, UnlinkServiceFromProjectErrors, UnlinkServiceFromProjectResponses, UpdateAgentData, UpdateAgentErrors, UpdateAgentResponses, UpdateAiProviderData, UpdateAiProviderErrors, UpdateAiProviderResponses, UpdateAlertData, UpdateAlertErrors, UpdateAlertResponses, UpdateAlertRuleData, UpdateAlertRuleErrors, UpdateAlertRuleResponses, UpdateApiKeyData, UpdateApiKeyErrors, UpdateApiKeyResponses, UpdateAutomaticDeployData, UpdateAutomaticDeployErrors, UpdateAutomaticDeployResponses, UpdateBackupScheduleData, UpdateBackupScheduleErrors, UpdateBackupScheduleResponses, UpdateCloudflareProviderData, UpdateCloudflareProviderErrors, UpdateCloudflareProviderResponses, UpdateConnectionTokenData, UpdateConnectionTokenErrors, UpdateConnectionTokenResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainResponses, UpdateDashboardData, UpdateDashboardErrors, UpdateDashboardResponses, UpdateDeploymentTokenData, UpdateDeploymentTokenErrors, UpdateDeploymentTokenResponses, UpdateEmailProviderData, UpdateEmailProviderErrors, UpdateEmailProviderResponses, UpdateEnvironmentSettingsData, UpdateEnvironmentSettingsErrors, UpdateEnvironmentSettingsResponses, UpdateEnvironmentSubdomainData, UpdateEnvironmentSubdomainErrors, UpdateEnvironmentSubdomainResponses, UpdateEnvironmentVariableData, UpdateEnvironmentVariableErrors, UpdateEnvironmentVariableResponses, UpdateErrorGroupData, UpdateErrorGroupErrors, UpdateErrorGroupResponses, UpdateFlagData, UpdateFlagErrors, UpdateFlagResponses, UpdateFunnelData, UpdateFunnelErrors, UpdateFunnelResponses, UpdateGitProviderCredentialsData, UpdateGitProviderCredentialsErrors, UpdateGitProviderCredentialsResponses, UpdateGitSettingsData, UpdateGitSettingsErrors, UpdateGitSettingsResponses, UpdateGlobalMcpData, UpdateGlobalMcpErrors, UpdateGlobalMcpResponses, UpdateGlobalSkillData, UpdateGlobalSkillErrors, UpdateGlobalSkillResponses, UpdateIncidentStatusData, UpdateIncidentStatusErrors, UpdateIncidentStatusResponses, UpdateIpAccessControlData, UpdateIpAccessControlErrors, UpdateIpAccessControlResponses, UpdateManagedDomainData, UpdateManagedDomainErrors, UpdateManagedDomainResponses, UpdateMcpData, UpdateMcpErrors, UpdateMcpResponses, UpdateNotificationEmailProviderData, UpdateNotificationEmailProviderErrors, UpdateNotificationEmailProviderResponses, UpdateNotificationProviderData, UpdateNotificationProviderErrors, UpdateNotificationProviderResponses, UpdateOidcProviderData, UpdateOidcProviderResponses, UpdatePreferencesData, UpdatePreferencesErrors, UpdatePreferencesResponses, UpdateProjectData, UpdateProjectDeploymentConfigData, UpdateProjectDeploymentConfigErrors, UpdateProjectDeploymentConfigResponses, UpdateProjectErrors, UpdateProjectResponses, UpdateProjectSecretData, UpdateProjectSecretErrors, UpdateProjectSecretResponses, UpdateProjectSettingsData, UpdateProjectSettingsErrors, UpdateProjectSettingsResponses, UpdateProviderData, UpdateProviderErrors, UpdateProviderKeyData, UpdateProviderKeyErrors, UpdateProviderKeyResponses, UpdateProviderResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteResponses, UpdateS3SourceData, UpdateS3SourceErrors, UpdateS3SourceResponses, UpdateSelfData, UpdateSelfErrors, UpdateSelfResponses, UpdateServiceData, UpdateServiceErrors, UpdateServiceResourcesData, UpdateServiceResourcesErrors, UpdateServiceResourcesResponses, UpdateServiceResponses, UpdateSessionDurationData, UpdateSessionDurationErrors, UpdateSessionDurationResponses, UpdateSettingsData, UpdateSettingsErrors, UpdateSettingsResponses, UpdateSkillData, UpdateSkillErrors, UpdateSkillResponses, UpdateSlackProviderData, UpdateSlackProviderErrors, UpdateSlackProviderResponses, UpdateSpeedMetricsData, UpdateSpeedMetricsErrors, UpdateSpeedMetricsResponses, UpdateTeamData, UpdateTeamErrors, UpdateTeamMemberRoleData, UpdateTeamMemberRoleErrors, UpdateTeamMemberRoleResponses, UpdateTeamResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookProviderData, UpdateWebhookProviderErrors, UpdateWebhookProviderResponses, UpdateWebhookResponses, UpgradePreviewGatewayData, UpgradePreviewGatewayResponses, UpgradeServiceData, UpgradeServiceErrors, UpgradeServiceResponses, UploadGlobalSkillData, UploadGlobalSkillErrors, UploadGlobalSkillResponses, UploadReleaseFileData, UploadReleaseFileErrors, UploadReleaseFileResponses, UploadSkillData, UploadSkillErrors, UploadSkillResponses, UploadSourceFileData, UploadSourceFileErrors, UploadSourceFileResponses, UploadSourceMapData, UploadSourceMapErrors, UploadSourceMapResponses, UploadStaticBundleData, UploadStaticBundleErrors, UploadStaticBundleResponses, UpsertSecretData, UpsertSecretErrors, UpsertSecretResponses, ValidateConnectionData, ValidateConnectionErrors, ValidateConnectionResponses, ValidateEmailData, ValidateEmailErrors, ValidateEmailResponses, VerifyAndEnableMfaData, VerifyAndEnableMfaErrors, VerifyAndEnableMfaResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponses, VerifyEmailData, VerifyEmailErrors, VerifyEmailResponses, VerifyManagedDomainData, VerifyManagedDomainErrors, VerifyManagedDomainResponses, VerifyMfaChallengeData, VerifyMfaChallengeErrors, VerifyMfaChallengeResponses, VerifyStepUpData, VerifyStepUpErrors, VerifyStepUpResponses, WakeEnvironmentData, WakeEnvironmentErrors, WakeEnvironmentResponses, WebhookTriggerData, WebhookTriggerErrors, WebhookTriggerResponses, WorkflowDryRunData, WorkflowDryRunErrors, WorkflowDryRunResponses, WriteFileData, WriteFileErrors, WriteFileResponses, WriteFilesData, WriteFilesErrors, WriteFilesResponses } from './types.gen'; +import type { AcknowledgeAlarmData, AcknowledgeAlarmErrors, AcknowledgeAlarmResponses, ActivateAiProviderData, ActivateAiProviderErrors, ActivateAiProviderResponses, ActivateApiKeyData, ActivateApiKeyErrors, ActivateApiKeyResponses, ActivateConnectionData, ActivateConnectionErrors, ActivateConnectionResponses, ActivateProviderData, ActivateProviderErrors, ActivateProviderResponses, AddClusterMemberData, AddClusterMemberErrors, AddClusterMemberResponses, AddContextData, AddContextErrors, AddContextResponses, AddEnvironmentDomainData, AddEnvironmentDomainErrors, AddEnvironmentDomainResponses, AddEventsData, AddEventsErrors, AddEventsResponses, AddManagedDomainData, AddManagedDomainErrors, AddManagedDomainResponses, AddSessionReplayEventsData, AddSessionReplayEventsErrors, AddSessionReplayEventsResponses, AddTeamMemberData, AddTeamMemberErrors, AddTeamMemberResponses, AdminDrainNodeData, AdminDrainNodeErrors, AdminDrainNodeResponses, AdminDrainStatusData, AdminDrainStatusErrors, AdminDrainStatusResponses, AdminGetNodeData, AdminGetNodeErrors, AdminGetNodeResponses, AdminListNodeContainersData, AdminListNodeContainersErrors, AdminListNodeContainersResponses, AdminListNodesData, AdminListNodesErrors, AdminListNodesResponses, AdminRemoveNodeData, AdminRemoveNodeErrors, AdminRemoveNodeResponses, AdminUndrainNodeData, AdminUndrainNodeErrors, AdminUndrainNodeResponses, ApplyHostnameModeData, ApplyHostnameModeErrors, ApplyHostnameModeResponses, ArchiveConversationData, ArchiveConversationErrors, ArchiveConversationResponses, ArchiveFlagData, ArchiveFlagErrors, ArchiveFlagResponses, AssignRoleData, AssignRoleErrors, AssignRoleResponses, AttachScheduleServicesData, AttachScheduleServicesErrors, AttachScheduleServicesResponses, BlobCopyData, BlobCopyErrors, BlobCopyResponses, BlobDeleteData, BlobDeleteErrors, BlobDeleteResponses, BlobDisableData, BlobDisableErrors, BlobDisableResponses, BlobDownloadData, BlobDownloadErrors, BlobDownloadResponses, BlobEnableData, BlobEnableErrors, BlobEnableResponses, BlobHeadData, BlobHeadErrors, BlobHeadResponses, BlobListData, BlobListErrors, BlobListResponses, BlobPutData, BlobPutErrors, BlobPutResponses, BlobStatusData, BlobStatusErrors, BlobStatusResponses, BlobUpdateData, BlobUpdateErrors, BlobUpdateResponses, CancelBackupData, CancelBackupErrors, CancelBackupResponses, CancelData, CancelDeploymentData, CancelDeploymentErrors, CancelDeploymentResponses, CancelDomainOrderData, CancelDomainOrderErrors, CancelDomainOrderResponses, CancelErrors, CancelPgUpgradeData, CancelPgUpgradeErrors, CancelPgUpgradeResponses, CancelResponses, CancelRunData, CancelRunErrors, CancelRunResponses, CancelScheduleRunData, CancelScheduleRunErrors, CancelScheduleRunResponses, ChangePasswordSelfData, ChangePasswordSelfErrors, ChangePasswordSelfResponses, ChangeProjectSourceData, ChangeProjectSourceErrors, ChangeProjectSourceResponses, ChangeRequiredPasswordData, ChangeRequiredPasswordErrors, ChangeRequiredPasswordResponses, ChatCompletionsData, ChatCompletionsErrors, ChatCompletionsResponses, CheckAnalyticsHasEventsData, CheckAnalyticsHasEventsErrors, CheckAnalyticsHasEventsResponses, CheckCommitExistsData, CheckCommitExistsErrors, CheckCommitExistsResponses, CheckDomainStatusData, CheckDomainStatusErrors, CheckDomainStatusResponses, CheckExplorerSupportData, CheckExplorerSupportErrors, CheckExplorerSupportResponses, CheckIpBlockedData, CheckIpBlockedErrors, CheckIpBlockedResponses, CheckProviderDeletionSafetyData, CheckProviderDeletionSafetyErrors, CheckProviderDeletionSafetyResponses, ChunkUploadOptionsData, ChunkUploadOptionsResponses, CleanupExpiredBackupsData, CleanupExpiredBackupsErrors, CleanupExpiredBackupsResponses, ClearPreviewPasswordData, ClearPreviewPasswordErrors, ClearPreviewPasswordResponses, CliDeviceApproveData, CliDeviceApproveErrors, CliDeviceApproveResponses, CliDeviceDenyData, CliDeviceDenyErrors, CliDeviceDenyResponses, CliDeviceLookupData, CliDeviceLookupErrors, CliDeviceLookupResponses, CliDevicePollData, CliDevicePollErrors, CliDevicePollResponses, CliDeviceStartData, CliDeviceStartErrors, CliDeviceStartResponses, CliLogoutData, CliLogoutErrors, CliLogoutResponses, CmdData, CmdErrors, CmdKillData, CmdKillErrors, CmdKillResponses, CmdLogsData, CmdLogsErrors, CmdLogsResponses, CmdResponses, ConfirmPendingActionData, ConfirmPendingActionErrors, ConfirmPendingActionResponses, ContainerMetricsGetHistoryData, ContainerMetricsGetHistoryErrors, ContainerMetricsGetHistoryResponses, CreateAgentData, CreateAgentErrors, CreateAgentResponses, CreateAlertData, CreateAlertErrors, CreateAlertResponses, CreateAlertRuleData, CreateAlertRuleErrors, CreateAlertRuleResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyResponses, CreateBackupScheduleData, CreateBackupScheduleErrors, CreateBackupScheduleResponses, CreateBitbucketProviderData, CreateBitbucketProviderErrors, CreateBitbucketProviderResponses, CreateCloudflareProviderData, CreateCloudflareProviderErrors, CreateCloudflareProviderResponses, CreateConversationData, CreateConversationErrors, CreateConversationResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponses, CreateDashboardData, CreateDashboardErrors, CreateDashboardResponses, CreateDeploymentTokenData, CreateDeploymentTokenErrors, CreateDeploymentTokenResponses, CreateDnsProviderData, CreateDnsProviderErrors, CreateDnsProviderResponses, CreateDomainData, CreateDomainErrors, CreateDomainResponses, CreateDsnData, CreateDsnErrors, CreateDsnResponses, CreateEmailDomainData, CreateEmailDomainErrors, CreateEmailDomainResponses, CreateEmailProviderData, CreateEmailProviderErrors, CreateEmailProviderResponses, CreateEnvironmentData, CreateEnvironmentErrors, CreateEnvironmentResponses, CreateEnvironmentVariableData, CreateEnvironmentVariableErrors, CreateEnvironmentVariableResponses, CreateFlagData, CreateFlagErrors, CreateFlagResponses, CreateFunnelData, CreateFunnelErrors, CreateFunnelResponses, CreateGenericProviderData, CreateGenericProviderErrors, CreateGenericProviderResponses, CreateGiteaPatProviderData, CreateGiteaPatProviderErrors, CreateGiteaPatProviderResponses, CreateGithubPatProviderData, CreateGithubPatProviderErrors, CreateGithubPatProviderResponses, CreateGitlabOauthProviderData, CreateGitlabOauthProviderErrors, CreateGitlabOauthProviderResponses, CreateGitlabPatProviderData, CreateGitlabPatProviderErrors, CreateGitlabPatProviderResponses, CreateGitProviderData, CreateGitProviderErrors, CreateGitProviderResponses, CreateGlobalMcpData, CreateGlobalMcpErrors, CreateGlobalMcpResponses, CreateGlobalSkillData, CreateGlobalSkillErrors, CreateGlobalSkillResponses, CreateIncidentData, CreateIncidentErrors, CreateIncidentResponses, CreateIpAccessControlData, CreateIpAccessControlErrors, CreateIpAccessControlResponses, CreateMcpData, CreateMcpErrors, CreateMcpResponses, CreateMonitorData, CreateMonitorErrors, CreateMonitorResponses, CreateNotificationEmailProviderData, CreateNotificationEmailProviderErrors, CreateNotificationEmailProviderResponses, CreateNotificationProviderData, CreateNotificationProviderErrors, CreateNotificationProviderResponses, CreateOidcProviderData, CreateOidcProviderErrors, CreateOidcProviderResponses, CreateOidcRoleMappingData, CreateOidcRoleMappingResponses, CreateOrRecreateOrderData, CreateOrRecreateOrderErrors, CreateOrRecreateOrderResponses, CreatePlanData, CreatePlanErrors, CreatePlanResponses, CreatePrData, CreatePrErrors, CreateProjectData, CreateProjectErrors, CreateProjectFromTemplateData, CreateProjectFromTemplateErrors, CreateProjectFromTemplateResponses, CreateProjectReleaseData, CreateProjectReleaseErrors, CreateProjectReleaseResponses, CreateProjectResponses, CreateProjectSecretData, CreateProjectSecretErrors, CreateProjectSecretResponses, CreateProviderKeyData, CreateProviderKeyErrors, CreateProviderKeyResponses, CreatePrResponses, CreateReleaseData, CreateReleaseErrors, CreateReleaseResponses, CreateRouteData, CreateRouteErrors, CreateRouteResponses, CreateS3SourceData, CreateS3SourceErrors, CreateS3SourceResponses, CreateSandboxData, CreateSandboxErrors, CreateSandboxResponses, CreateServiceData, CreateServiceErrors, CreateServiceResponses, CreateSkillData, CreateSkillErrors, CreateSkillResponses, CreateSlackProviderData, CreateSlackProviderErrors, CreateSlackProviderResponses, CreateTeamData, CreateTeamErrors, CreateTeamResponses, CreateUserData, CreateUserErrors, CreateUserResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookProviderData, CreateWebhookProviderErrors, CreateWebhookProviderResponses, CreateWebhookResponses, DeactivateApiKeyData, DeactivateApiKeyErrors, DeactivateApiKeyResponses, DeactivateConnectionData, DeactivateConnectionErrors, DeactivateConnectionResponses, DeactivateProviderData, DeactivateProviderErrors, DeactivateProviderResponses, DeleteAgentData, DeleteAgentErrors, DeleteAgentResponses, DeleteAlertData, DeleteAlertErrors, DeleteAlertResponses, DeleteAlertRuleData, DeleteAlertRuleErrors, DeleteAlertRuleResponses, DeleteApiKeyData, DeleteApiKeyErrors, DeleteApiKeyResponses, DeleteBackupData, DeleteBackupErrors, DeleteBackupResponses, DeleteBackupScheduleData, DeleteBackupScheduleErrors, DeleteBackupScheduleResponses, DeleteConnectionData, DeleteConnectionErrors, DeleteConnectionResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponses, DeleteDashboardData, DeleteDashboardErrors, DeleteDashboardResponses, DeleteDeploymentTokenData, DeleteDeploymentTokenErrors, DeleteDeploymentTokenResponses, DeleteDnsProviderData, DeleteDnsProviderErrors, DeleteDnsProviderResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponses, DeleteEmailDomainData, DeleteEmailDomainErrors, DeleteEmailDomainResponses, DeleteEmailProviderData, DeleteEmailProviderErrors, DeleteEmailProviderResponses, DeleteEnvironmentData, DeleteEnvironmentDomainData, DeleteEnvironmentDomainErrors, DeleteEnvironmentDomainResponses, DeleteEnvironmentErrors, DeleteEnvironmentResponses, DeleteEnvironmentVariableData, DeleteEnvironmentVariableErrors, DeleteEnvironmentVariableResponses, DeleteExternalImageData, DeleteExternalImageErrors, DeleteExternalImageResponses, DeleteFunnelData, DeleteFunnelErrors, DeleteFunnelResponses, DeleteGitProviderData, DeleteGitProviderErrors, DeleteGitProviderResponses, DeleteGlobalMcpData, DeleteGlobalMcpErrors, DeleteGlobalMcpResponses, DeleteGlobalSkillData, DeleteGlobalSkillErrors, DeleteGlobalSkillResponses, DeleteIpAccessControlData, DeleteIpAccessControlErrors, DeleteIpAccessControlResponses, DeleteMcpData, DeleteMcpErrors, DeleteMcpResponses, DeleteMonitorData, DeleteMonitorErrors, DeleteMonitorResponses, DeleteNotificationProviderData, DeleteNotificationProviderErrors, DeleteNotificationProviderResponses, DeleteOidcProviderData, DeleteOidcProviderResponses, DeleteOidcRoleMappingData, DeleteOidcRoleMappingResponses, DeletePreferencesData, DeletePreferencesErrors, DeletePreferencesResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteProjectSecretData, DeleteProjectSecretErrors, DeleteProjectSecretResponses, DeleteProviderKeyData, DeleteProviderKeyErrors, DeleteProviderKeyResponses, DeleteProviderSafelyData, DeleteProviderSafelyErrors, DeleteProviderSafelyResponses, DeleteReleaseSourceFilesData, DeleteReleaseSourceFilesErrors, DeleteReleaseSourceFilesResponses, DeleteReleaseSourceMapsData, DeleteReleaseSourceMapsErrors, DeleteReleaseSourceMapsResponses, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponses, DeleteS3SourceData, DeleteS3SourceErrors, DeleteS3SourceResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteSecretData, DeleteSecretErrors, DeleteSecretResponses, DeleteServiceData, DeleteServiceErrors, DeleteServiceResponses, DeleteSessionReplayData, DeleteSessionReplayErrors, DeleteSessionReplayResponses, DeleteSkillData, DeleteSkillErrors, DeleteSkillResponses, DeleteSourceMapData, DeleteSourceMapErrors, DeleteSourceMapResponses, DeleteStaticBundleData, DeleteStaticBundleErrors, DeleteStaticBundleResponses, DeleteTeamData, DeleteTeamErrors, DeleteTeamResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponses, DeployFromImageData, DeployFromImageErrors, DeployFromImageResponses, DeployFromImageUploadData, DeployFromImageUploadErrors, DeployFromImageUploadResponses, DeployFromStaticData, DeployFromStaticErrors, DeployFromStaticResponses, DeployFromUploadedSourceData, DeployFromUploadedSourceErrors, DeployFromUploadedSourceResponses, DeploymentMetricsGetLatestData, DeploymentMetricsGetLatestErrors, DeploymentMetricsGetLatestResponses, DeploymentMetricsGetRangeData, DeploymentMetricsGetRangeErrors, DeploymentMetricsGetRangeResponses, DeploymentMetricsToggleData, DeploymentMetricsToggleErrors, DeploymentMetricsToggleResponses, DestroySandboxData, DestroySandboxErrors, DestroySandboxResponses, DetachScheduleServiceData, DetachScheduleServiceErrors, DetachScheduleServiceResponses, DetectPublicPresetsData, DetectPublicPresetsErrors, DetectPublicPresetsResponses, DisableBackupScheduleData, DisableBackupScheduleErrors, DisableBackupScheduleResponses, DisableMfaData, DisableMfaErrors, DisableMfaResponses, DiscoverWorkloadsData, DiscoverWorkloadsErrors, DiscoverWorkloadsResponses, DomainData, DomainErrors, DomainResponses, DownloadGlobalSkillArchiveData, DownloadGlobalSkillArchiveErrors, DownloadGlobalSkillArchiveResponses, DownloadObjectData, DownloadObjectErrors, DownloadObjectResponses, DownloadSkillArchiveData, DownloadSkillArchiveErrors, DownloadSkillArchiveResponses, EmailStatusData, EmailStatusErrors, EmailStatusResponses, EmbeddingsData, EmbeddingsErrors, EmbeddingsResponses, EnableBackupScheduleData, EnableBackupScheduleErrors, EnableBackupScheduleResponses, EnrichVisitorData, EnrichVisitorErrors, EnrichVisitorResponses, ExecData, ExecDetachedData, ExecDetachedErrors, ExecDetachedResponses, ExecErrors, ExecResponses, ExecuteDeploymentOperationData, ExecuteDeploymentOperationErrors, ExecuteDeploymentOperationResponses, ExecuteImportData, ExecuteImportErrors, ExecuteImportResponses, ExtendTimeoutData, ExtendTimeoutErrors, ExtendTimeoutResponses, ExternalServiceEnablePgStatStatementsData, ExternalServiceEnablePgStatStatementsErrors, ExternalServiceEnablePgStatStatementsResponses, ExternalServiceMetricsByDatabaseData, ExternalServiceMetricsByDatabaseErrors, ExternalServiceMetricsByDatabaseResponses, ExternalServiceMetricsCreateAlertRuleData, ExternalServiceMetricsCreateAlertRuleErrors, ExternalServiceMetricsCreateAlertRuleResponses, ExternalServiceMetricsDeleteAlertRuleData, ExternalServiceMetricsDeleteAlertRuleErrors, ExternalServiceMetricsDeleteAlertRuleResponses, ExternalServiceMetricsGetAlertRulesData, ExternalServiceMetricsGetAlertRulesErrors, ExternalServiceMetricsGetAlertRulesResponses, ExternalServiceMetricsGetLatestData, ExternalServiceMetricsGetLatestErrors, ExternalServiceMetricsGetLatestResponses, ExternalServiceMetricsGetRangeData, ExternalServiceMetricsGetRangeErrors, ExternalServiceMetricsGetRangeResponses, ExternalServiceMetricsStatusData, ExternalServiceMetricsStatusErrors, ExternalServiceMetricsStatusResponses, ExternalServiceMetricsToggleData, ExternalServiceMetricsToggleErrors, ExternalServiceMetricsToggleResponses, ExternalServiceMetricsUpdateAlertRuleData, ExternalServiceMetricsUpdateAlertRuleErrors, ExternalServiceMetricsUpdateAlertRuleResponses, ExternalServiceResetPgStatStatementsData, ExternalServiceResetPgStatStatementsErrors, ExternalServiceResetPgStatStatementsResponses, FinalizeOrderData, FinalizeOrderErrors, FinalizeOrderResponses, FinalizeProjectReleaseData, FinalizeProjectReleaseErrors, FinalizeProjectReleaseResponses, FindConversationData, FindConversationErrors, FindConversationResponses, GenerateJoinTokenData, GenerateJoinTokenErrors, GenerateJoinTokenResponses, GeneratePresetDockerfileData, GeneratePresetDockerfileErrors, GeneratePresetDockerfileResponses, GetAccessInfoData, GetAccessInfoErrors, GetAccessInfoResponses, GetActiveVisitorsData, GetActiveVisitorsErrors, GetActiveVisitorsResponses, GetActivityGraphData, GetActivityGraphErrors, GetActivityGraphResponses, GetAdminGateData, GetAdminGateErrors, GetAdminGateResponses, GetAgentData, GetAgentErrors, GetAgentResponses, GetAggregatedBucketsData, GetAggregatedBucketsErrors, GetAggregatedBucketsResponses, GetAiAgentBreakdownData, GetAiAgentBreakdownErrors, GetAiAgentBreakdownResponses, GetAiAgentPagesData, GetAiAgentPagesErrors, GetAiAgentPagesResponses, GetAiAgentTimelineData, GetAiAgentTimelineErrors, GetAiAgentTimelineResponses, GetAiPageBreakdownData, GetAiPageBreakdownErrors, GetAiPageBreakdownResponses, GetAiStatusBreakdownData, GetAiStatusBreakdownErrors, GetAiStatusBreakdownResponses, GetAlertData, GetAlertErrors, GetAlertResponses, GetAlertRuleData, GetAlertRuleErrors, GetAlertRuleResponses, GetAllRepositoriesByNameData, GetAllRepositoriesByNameErrors, GetAllRepositoriesByNameResponses, GetAnalyticsActiveVisitorsData, GetAnalyticsActiveVisitorsErrors, GetAnalyticsActiveVisitorsResponses, GetAnalyticsEventsCountData, GetAnalyticsEventsCountErrors, GetAnalyticsEventsCountResponses, GetAnalyticsSessionEventsData, GetAnalyticsSessionEventsErrors, GetAnalyticsSessionEventsResponses, GetAnalyticsVisitorSessionsData, GetAnalyticsVisitorSessionsErrors, GetAnalyticsVisitorSessionsResponses, GetApiKeyData, GetApiKeyErrors, GetApiKeyPermissionsData, GetApiKeyPermissionsErrors, GetApiKeyPermissionsResponses, GetApiKeyResponses, GetAuditLogData, GetAuditLogErrors, GetAuditLogResponses, GetBackupData, GetBackupErrors, GetBackupResponses, GetBackupScheduleData, GetBackupScheduleErrors, GetBackupScheduleResponses, GetBranchesByRepositoryIdData, GetBranchesByRepositoryIdErrors, GetBranchesByRepositoryIdResponses, GetBucketedIncidentsData, GetBucketedIncidentsErrors, GetBucketedIncidentsResponses, GetBucketedStatusData, GetBucketedStatusErrors, GetBucketedStatusResponses, GetChallengeTokenData, GetChallengeTokenErrors, GetChallengeTokenResponses, GetChatReadinessData, GetChatReadinessErrors, GetChatReadinessResponses, GetCliStatusData, GetCliStatusErrors, GetCliStatusResponses, GetClusterHealthData, GetClusterHealthErrors, GetClusterHealthResponses, GetClusterMemberData, GetClusterMemberErrors, GetClusterMemberResponses, GetCmdData, GetCmdErrors, GetCmdResponses, GetContainerDetailData, GetContainerDetailErrors, GetContainerDetailResponses, GetContainerEnvironmentVariableData, GetContainerEnvironmentVariableErrors, GetContainerEnvironmentVariableResponses, GetContainerInfoData, GetContainerInfoErrors, GetContainerInfoResponses, GetContainerLogsByIdData, GetContainerLogsByIdErrors, GetContainerLogsData, GetContainerLogsErrors, GetContainerMetricsData, GetContainerMetricsErrors, GetContainerMetricsResponses, GetConversationData, GetConversationDetailData, GetConversationDetailErrors, GetConversationDetailResponses, GetConversationErrors, GetConversationResponses, GetConversationsData, GetConversationsErrors, GetConversationsResponses, GetCronByIdData, GetCronByIdErrors, GetCronByIdResponses, GetCronExecutionsData, GetCronExecutionsErrors, GetCronExecutionsResponses, GetCrossProjectTraceSiblingsData, GetCrossProjectTraceSiblingsErrors, GetCrossProjectTraceSiblingsResponses, GetCurrentMonitorStatusData, GetCurrentMonitorStatusErrors, GetCurrentMonitorStatusResponses, GetCurrentUserData, GetCurrentUserErrors, GetCurrentUserResponses, GetCustomDomainData, GetCustomDomainErrors, GetCustomDomainResponses, GetDashboardData, GetDashboardErrors, GetDashboardProjectsAnalyticsData, GetDashboardProjectsAnalyticsErrors, GetDashboardProjectsAnalyticsResponses, GetDashboardResponses, GetDeliveryData, GetDeliveryErrors, GetDeliveryResponses, GetDeploymentContainerLogContentData, GetDeploymentContainerLogContentErrors, GetDeploymentContainerLogContentResponses, GetDeploymentData, GetDeploymentErrors, GetDeploymentJobLogsData, GetDeploymentJobLogsErrors, GetDeploymentJobLogsResponses, GetDeploymentJobsData, GetDeploymentJobsErrors, GetDeploymentJobsResponses, GetDeploymentOperationsData, GetDeploymentOperationsErrors, GetDeploymentOperationsResponses, GetDeploymentOperationStatusData, GetDeploymentOperationStatusErrors, GetDeploymentOperationStatusResponses, GetDeploymentResponses, GetDeploymentTokenData, GetDeploymentTokenErrors, GetDeploymentTokenResponses, GetDiskStatusData, GetDiskStatusErrors, GetDiskStatusResponses, GetDnsChangesData, GetDnsChangesErrors, GetDnsChangesResponses, GetDnsProviderData, GetDnsProviderErrors, GetDnsProviderResponses, GetDomainByHostData, GetDomainByHostErrors, GetDomainByHostResponses, GetDomainByIdData, GetDomainByIdErrors, GetDomainByIdResponses, GetDomainByNameData, GetDomainByNameErrors, GetDomainByNameResponses, GetDomainData, GetDomainDnsRecordsData, GetDomainDnsRecordsErrors, GetDomainDnsRecordsResponses, GetDomainErrors, GetDomainOrderData, GetDomainOrderErrors, GetDomainOrderResponses, GetDomainResponses, GetEmailData, GetEmailErrors, GetEmailEventsData, GetEmailEventsErrors, GetEmailEventsResponses, GetEmailLinksData, GetEmailLinksErrors, GetEmailLinksResponses, GetEmailProviderData, GetEmailProviderErrors, GetEmailProviderResponses, GetEmailResponses, GetEmailStatsData, GetEmailStatsErrors, GetEmailStatsResponses, GetEmailTrackingData, GetEmailTrackingErrors, GetEmailTrackingResponses, GetEmailTrackingStatusData, GetEmailTrackingStatusErrors, GetEmailTrackingStatusResponses, GetEntityInfoData, GetEntityInfoErrors, GetEntityInfoResponses, GetEnvironmentCronsData, GetEnvironmentCronsErrors, GetEnvironmentCronsResponses, GetEnvironmentData, GetEnvironmentDomainsData, GetEnvironmentDomainsErrors, GetEnvironmentDomainsResponses, GetEnvironmentErrors, GetEnvironmentResponses, GetEnvironmentsData, GetEnvironmentsErrors, GetEnvironmentsResponses, GetEnvironmentVariablesData, GetEnvironmentVariablesErrors, GetEnvironmentVariablesResponses, GetEnvironmentVariableValueData, GetEnvironmentVariableValueErrors, GetEnvironmentVariableValueResponses, GetErrorDashboardStatsData, GetErrorDashboardStatsErrors, GetErrorDashboardStatsResponses, GetErrorEventData, GetErrorEventErrors, GetErrorEventResponses, GetErrorGroupData, GetErrorGroupErrors, GetErrorGroupResponses, GetErrorStatsData, GetErrorStatsErrors, GetErrorStatsResponses, GetErrorTimeSeriesData, GetErrorTimeSeriesErrors, GetErrorTimeSeriesResponses, GetEventDetailData, GetEventDetailErrors, GetEventDetailResponses, GetEventEntriesData, GetEventEntriesErrors, GetEventEntriesResponses, GetEventsCountData, GetEventsCountErrors, GetEventsCountResponses, GetEventsTimelineData, GetEventsTimelineErrors, GetEventsTimelineResponses, GetEventTypeBreakdownData, GetEventTypeBreakdownErrors, GetEventTypeBreakdownResponses, GetEventVisitorsData, GetEventVisitorsErrors, GetEventVisitorsResponses, GetExternalImageData, GetExternalImageErrors, GetExternalImageResponses, GetFileData, GetFileErrors, GetFileResponses, GetFlagData, GetFlagErrors, GetFlagResponses, GetFlagSnapshotData, GetFlagSnapshotErrors, GetFlagSnapshotResponses, GetFunnelMetricsData, GetFunnelMetricsErrors, GetFunnelMetricsResponses, GetGenaiTraceData, GetGenaiTraceErrors, GetGenaiTraceResponses, GetGeneralStatsData, GetGeneralStatsErrors, GetGeneralStatsResponses, GetGitProviderData, GetGitProviderErrors, GetGitProviderResponses, GetGlobalEventsData, GetGlobalEventsErrors, GetGlobalEventsResponses, GetGlobalEventStatsData, GetGlobalEventStatsErrors, GetGlobalEventStatsResponses, GetGlobalMcpData, GetGlobalMcpErrors, GetGlobalMcpResponses, GetGlobalSandboxStatusData, GetGlobalSandboxStatusErrors, GetGlobalSandboxStatusResponses, GetGlobalSkillData, GetGlobalSkillErrors, GetGlobalSkillResponses, GetGroupedPageMetricsData, GetGroupedPageMetricsErrors, GetGroupedPageMetricsResponses, GetHealthData, GetHealthErrors, GetHealthResponses, GetHourlyVisitsData, GetHourlyVisitsErrors, GetHourlyVisitsResponses, GetHttpChallengeDebugData, GetHttpChallengeDebugErrors, GetHttpChallengeDebugResponses, GetImportStatusData, GetImportStatusErrors, GetImportStatusResponses, GetIncidentData, GetIncidentErrors, GetIncidentResponses, GetIncidentUpdatesData, GetIncidentUpdatesErrors, GetIncidentUpdatesResponses, GetIpAccessControlData, GetIpAccessControlErrors, GetIpAccessControlResponses, GetIpGeolocationData, GetIpGeolocationErrors, GetIpGeolocationResponses, GetJoinTokenStatusData, GetJoinTokenStatusErrors, GetJoinTokenStatusResponses, GetLastDeploymentData, GetLastDeploymentErrors, GetLastDeploymentResponses, GetLatestScanData, GetLatestScanErrors, GetLatestScanResponses, GetLatestScansPerEnvironmentData, GetLatestScansPerEnvironmentErrors, GetLatestScansPerEnvironmentResponses, GetLiveVisitorsListData, GetLiveVisitorsListErrors, GetLiveVisitorsListResponses, GetLogContextData, GetLogContextErrors, GetLogContextResponses, GetMcpData, GetMcpErrors, GetMcpResponses, GetMetricsOverTimeData, GetMetricsOverTimeErrors, GetMetricsOverTimeResponses, GetMonitorData, GetMonitorErrors, GetMonitorResponses, GetNotificationProviderData, GetNotificationProviderErrors, GetNotificationProviderResponses, GetOnDemandCertStatusData, GetOnDemandCertStatusErrors, GetOnDemandCertStatusResponses, GetOrCreateDsnData, GetOrCreateDsnErrors, GetOrCreateDsnResponses, GetPageFlowData, GetPageFlowErrors, GetPageFlowResponses, GetPageHourlySessionsData, GetPageHourlySessionsErrors, GetPageHourlySessionsResponses, GetPagePathDetailData, GetPagePathDetailErrors, GetPagePathDetailResponses, GetPagePathsData, GetPagePathsErrors, GetPagePathsResponses, GetPagePathsSparklinesData, GetPagePathsSparklinesErrors, GetPagePathsSparklinesResponses, GetPagePathVisitorsData, GetPagePathVisitorsErrors, GetPagePathVisitorsResponses, GetPendingActionData, GetPendingActionErrors, GetPendingActionResponses, GetPerformanceMetricsData, GetPerformanceMetricsErrors, GetPerformanceMetricsResponses, GetPgUpgradeData, GetPgUpgradeErrors, GetPgUpgradeLogsData, GetPgUpgradeLogsErrors, GetPgUpgradeLogsResponses, GetPgUpgradeResponses, GetPipelineStatsData, GetPipelineStatsErrors, GetPipelineStatsResponses, GetPlatformInfoData, GetPlatformInfoErrors, GetPlatformInfoResponses, GetPostgresWalHealthData, GetPostgresWalHealthErrors, GetPostgresWalHealthResponses, GetPreferencesData, GetPreferencesErrors, GetPreferencesResponses, GetPreviewGatewayLogsData, GetPreviewGatewayLogsResponses, GetPreviewGatewaySettingsData, GetPreviewGatewaySettingsResponses, GetPreviewGatewayStatusData, GetPreviewGatewayStatusResponses, GetPricingData, GetPricingErrors, GetPricingResponses, GetPrivateIpData, GetPrivateIpErrors, GetPrivateIpResponses, GetProjectAlarmsSummaryData, GetProjectAlarmsSummaryErrors, GetProjectAlarmsSummaryResponses, GetProjectBySlugData, GetProjectBySlugErrors, GetProjectBySlugResponses, GetProjectData, GetProjectDeploymentsData, GetProjectDeploymentsErrors, GetProjectDeploymentsResponses, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectServiceEnvironmentVariablesData, GetProjectServiceEnvironmentVariablesErrors, GetProjectServiceEnvironmentVariablesResponses, GetProjectSessionReplaysData, GetProjectSessionReplaysErrors, GetProjectSessionReplaysResponses, GetProjectsHealthData, GetProjectsHealthErrors, GetProjectsHealthResponses, GetProjectsMonitorHealthData, GetProjectsMonitorHealthErrors, GetProjectsMonitorHealthResponses, GetProjectsResponses, GetProjectStatisticsData, GetProjectStatisticsErrors, GetProjectStatisticsResponses, GetProjectTemplateData, GetProjectTemplateErrors, GetProjectTemplateResponses, GetPropertyBreakdownData, GetPropertyBreakdownErrors, GetPropertyBreakdownResponses, GetPropertyTimelineData, GetPropertyTimelineErrors, GetPropertyTimelineResponses, GetProviderConnectionsData, GetProviderConnectionsErrors, GetProviderConnectionsResponses, GetProviderMetadataData, GetProviderMetadataErrors, GetProviderMetadataResponses, GetProvidersMetadataData, GetProvidersMetadataErrors, GetProvidersMetadataResponses, GetProxyLogByIdData, GetProxyLogByIdErrors, GetProxyLogByIdResponses, GetProxyLogByRequestIdData, GetProxyLogByRequestIdErrors, GetProxyLogByRequestIdResponses, GetProxyLogsData, GetProxyLogsErrors, GetProxyLogsResponses, GetPublicBranchesData, GetPublicBranchesErrors, GetPublicBranchesResponses, GetPublicIpData, GetPublicIpErrors, GetPublicIpResponses, GetPublicRepositoryData, GetPublicRepositoryErrors, GetPublicRepositoryResponses, GetQuotaData, GetQuotaErrors, GetQuotaResponses, GetRecentActivityData, GetRecentActivityErrors, GetRecentActivityResponses, GetRemoteExternalImageData, GetRemoteExternalImageErrors, GetRemoteExternalImageResponses, GetRepositoryBranchesData, GetRepositoryBranchesErrors, GetRepositoryBranchesResponses, GetRepositoryByIdData, GetRepositoryByIdErrors, GetRepositoryByIdResponses, GetRepositoryByNameData, GetRepositoryByNameErrors, GetRepositoryByNameResponses, GetRepositoryPresetByNameData, GetRepositoryPresetByNameErrors, GetRepositoryPresetByNameResponses, GetRepositoryPresetLiveData, GetRepositoryPresetLiveErrors, GetRepositoryPresetLiveResponses, GetRepositoryTagsData, GetRepositoryTagsErrors, GetRepositoryTagsResponses, GetResolvedEnvironmentVariablesData, GetResolvedEnvironmentVariablesErrors, GetResolvedEnvironmentVariablesResponses, GetResolvedEnvironmentVariableValueData, GetResolvedEnvironmentVariableValueErrors, GetResolvedEnvironmentVariableValueResponses, GetRestoreCapabilitiesData, GetRestoreCapabilitiesErrors, GetRestoreCapabilitiesResponses, GetRestoreRunData, GetRestoreRunErrors, GetRestoreRunResponses, GetRouteData, GetRouteErrors, GetRouteResponses, GetRunData, GetRunErrors, GetRunResponses, GetRunWithLogsData, GetRunWithLogsErrors, GetRunWithLogsResponses, GetS3CredentialsData, GetS3CredentialsErrors, GetS3CredentialsResponses, GetS3SourceData, GetS3SourceErrors, GetS3SourceResponses, GetSandboxData, GetSandboxErrors, GetSandboxResponses, GetSandboxStatusData, GetSandboxStatusErrors, GetSandboxStatusResponses, GetScanByDeploymentData, GetScanByDeploymentErrors, GetScanByDeploymentResponses, GetScanData, GetScanErrors, GetScanResponses, GetScanVulnerabilitiesData, GetScanVulnerabilitiesErrors, GetScanVulnerabilitiesResponses, GetServiceBySlugData, GetServiceBySlugErrors, GetServiceBySlugResponses, GetServiceData, GetServiceEnvironmentVariableData, GetServiceEnvironmentVariableErrors, GetServiceEnvironmentVariableResponses, GetServiceEnvironmentVariablesData, GetServiceEnvironmentVariablesErrors, GetServiceEnvironmentVariablesResponses, GetServiceErrors, GetServiceHealthStatusData, GetServiceHealthStatusErrors, GetServiceHealthStatusResponses, GetServicePreviewEnvironmentVariableNamesData, GetServicePreviewEnvironmentVariableNamesErrors, GetServicePreviewEnvironmentVariableNamesResponses, GetServicePreviewEnvironmentVariablesMaskedData, GetServicePreviewEnvironmentVariablesMaskedErrors, GetServicePreviewEnvironmentVariablesMaskedResponses, GetServiceResponses, GetServiceRuntimeData, GetServiceRuntimeErrors, GetServiceRuntimeResponses, GetServiceStatsData, GetServiceStatsErrors, GetServiceStatsResponses, GetServiceTypeParametersData, GetServiceTypeParametersErrors, GetServiceTypeParametersResponses, GetServiceTypesData, GetServiceTypesErrors, GetServiceTypesResponses, GetSessionDetailsData, GetSessionDetailsErrors, GetSessionDetailsResponses, GetSessionEventsData, GetSessionEventsErrors, GetSessionEventsResponses, GetSessionLogsData, GetSessionLogsErrors, GetSessionLogsResponses, GetSessionReplayData, GetSessionReplayErrors, GetSessionReplayEventsData, GetSessionReplayEventsErrors, GetSessionReplayEventsResponses, GetSessionReplayResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSkillData, GetSkillErrors, GetSkillResponses, GetSlowQueriesData, GetSlowQueriesErrors, GetSlowQueriesResponses, GetStaticBundleData, GetStaticBundleErrors, GetStaticBundleResponses, GetStatusOverviewData, GetStatusOverviewErrors, GetStatusOverviewResponses, GetTagsByRepositoryIdData, GetTagsByRepositoryIdErrors, GetTagsByRepositoryIdResponses, GetTeamData, GetTeamErrors, GetTeamResponses, GetTimeBucketStatsData, GetTimeBucketStatsErrors, GetTimeBucketStatsResponses, GetTodayStatsData, GetTodayStatsErrors, GetTodayStatsResponses, GetTraceData, GetTraceErrors, GetTraceResponses, GetUnifiedTraceData, GetUnifiedTraceErrors, GetUnifiedTraceResponses, GetUniqueCountsData, GetUniqueCountsErrors, GetUniqueCountsResponses, GetUniqueEventsData, GetUniqueEventsErrors, GetUniqueEventsResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, GetUptimeHistoryData, GetUptimeHistoryErrors, GetUptimeHistoryResponses, GetUsageByProviderData, GetUsageByProviderErrors, GetUsageByProviderResponses, GetUsageRecentData, GetUsageRecentErrors, GetUsageRecentResponses, GetUsageSummaryData, GetUsageSummaryErrors, GetUsageSummaryResponses, GetUsageTimeseriesData, GetUsageTimeseriesErrors, GetUsageTimeseriesResponses, GetUsageTopModelsData, GetUsageTopModelsErrors, GetUsageTopModelsResponses, GetVisitorByGuidData, GetVisitorByGuidErrors, GetVisitorByGuidResponses, GetVisitorByIdData, GetVisitorByIdErrors, GetVisitorByIdResponses, GetVisitorDetailsData, GetVisitorDetailsErrors, GetVisitorDetailsResponses, GetVisitorFacetsData, GetVisitorFacetsErrors, GetVisitorFacetsResponses, GetVisitorInfoData, GetVisitorInfoErrors, GetVisitorInfoResponses, GetVisitorJourneyData, GetVisitorJourneyErrors, GetVisitorJourneyResponses, GetVisitorsData, GetVisitorsErrors, GetVisitorSessionsData, GetVisitorSessionsErrors, GetVisitorSessionsResponses, GetVisitorsResponses, GetVisitorStatsData, GetVisitorStatsErrors, GetVisitorStatsResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponses, GrantProjectAccessData, GrantProjectAccessErrors, GrantProjectAccessResponses, HandleGitProviderOauthCallbackData, HandleGitProviderOauthCallbackErrors, HasAnalyticsEventsData, HasAnalyticsEventsErrors, HasAnalyticsEventsResponses, HasErrorGroupsData, HasErrorGroupsErrors, HasErrorGroupsResponses, HasPerformanceMetricsData, HasPerformanceMetricsErrors, HasPerformanceMetricsResponses, ImportExternalServiceData, ImportExternalServiceErrors, ImportExternalServiceResponses, IngestLogsByPathData, IngestLogsByPathErrors, IngestLogsByPathResponses, IngestLogsData, IngestLogsErrors, IngestLogsResponses, IngestMetricsByPathData, IngestMetricsByPathErrors, IngestMetricsByPathResponses, IngestMetricsData, IngestMetricsErrors, IngestMetricsResponses, IngestSentryEnvelopeData, IngestSentryEnvelopeErrors, IngestSentryEnvelopeResponses, IngestSentryEventData, IngestSentryEventErrors, IngestSentryEventResponses, IngestTracesByPathData, IngestTracesByPathErrors, IngestTracesByPathResponses, IngestTracesData, IngestTracesErrors, IngestTracesResponses, InitSessionReplayData, InitSessionReplayErrors, InitSessionReplayResponses, InspectDropArchiveData, InspectDropArchiveErrors, InspectDropArchiveResponses, JobLogsData, JobLogsErrors, JobLogsResponses, JobStatusData, JobStatusErrors, JobStatusResponses, KillJobData, KillJobErrors, KillJobResponses, KvDelData, KvDelErrors, KvDelResponses, KvDisableData, KvDisableErrors, KvDisableResponses, KvEnableData, KvEnableErrors, KvEnableResponses, KvExpireData, KvExpireErrors, KvExpireResponses, KvGetData, KvGetErrors, KvGetResponses, KvIncrData, KvIncrErrors, KvIncrResponses, KvKeysData, KvKeysErrors, KvKeysResponses, KvSetData, KvSetErrors, KvSetResponses, KvStatusData, KvStatusErrors, KvStatusResponses, KvTtlData, KvTtlErrors, KvTtlResponses, KvUpdateData, KvUpdateErrors, KvUpdateResponses, LatestRunForSourceData, LatestRunForSourceErrors, LatestRunForSourceResponses, LinkCustomDomainToCertificateData, LinkCustomDomainToCertificateErrors, LinkCustomDomainToCertificateResponses, LinkServiceToProjectData, LinkServiceToProjectErrors, LinkServiceToProjectResponses, ListAgentRunsData, ListAgentRunsErrors, ListAgentRunsResponses, ListAgentsData, ListAgentsErrors, ListAgentsResponses, ListAiProvidersData, ListAiProvidersErrors, ListAiProvidersResponses, ListAlertRulesData, ListAlertRulesErrors, ListAlertRulesResponses, ListAlertsData, ListAlertsErrors, ListAlertsResponses, ListAllConversationsData, ListAllConversationsErrors, ListAllConversationsResponses, ListAllRunsData, ListAllRunsErrors, ListAllRunsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysResponses, ListAuditLogsData, ListAuditLogsErrors, ListAuditLogsResponses, ListAvailableContainersData, ListAvailableContainersErrors, ListAvailableContainersResponses, ListBackupAlertsData, ListBackupAlertsErrors, ListBackupAlertsResponses, ListBackupChildrenData, ListBackupChildrenErrors, ListBackupChildrenResponses, ListBackupSchedulesData, ListBackupSchedulesErrors, ListBackupSchedulesResponses, ListBackupsForScheduleData, ListBackupsForScheduleErrors, ListBackupsForScheduleResponses, ListCommitsByRepositoryIdData, ListCommitsByRepositoryIdErrors, ListCommitsByRepositoryIdResponses, ListConnectionsData, ListConnectionsErrors, ListConnectionsResponses, ListContainersAtPathData, ListContainersAtPathErrors, ListContainersAtPathResponses, ListContainersData, ListContainersErrors, ListContainersResponses, ListConversationsData, ListConversationsErrors, ListConversationsResponses, ListCustomDomainsForProjectData, ListCustomDomainsForProjectErrors, ListCustomDomainsForProjectResponses, ListDashboardsData, ListDashboardsErrors, ListDashboardsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponses, ListDeploymentContainerLogsData, ListDeploymentContainerLogsErrors, ListDeploymentContainerLogsResponses, ListDeploymentTokensData, ListDeploymentTokensErrors, ListDeploymentTokensResponses, ListDnsProvidersData, ListDnsProvidersErrors, ListDnsProvidersResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponses, ListDsnsData, ListDsnsErrors, ListDsnsResponses, ListEmailDomainsData, ListEmailDomainsErrors, ListEmailDomainsResponses, ListEmailProvidersData, ListEmailProvidersErrors, ListEmailProvidersResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponses, ListEnrollmentTokensData, ListEnrollmentTokensErrors, ListEnrollmentTokensResponses, ListEntitiesData, ListEntitiesErrors, ListEntitiesResponses, ListErrorEventsData, ListErrorEventsErrors, ListErrorEventsResponses, ListErrorGroupsData, ListErrorGroupsErrors, ListErrorGroupsResponses, ListEventsData, ListEventsResponses, ListEventTypesData, ListEventTypesResponses, ListExternalImagesData, ListExternalImagesErrors, ListExternalImagesResponses, ListExternalPluginsData, ListExternalPluginsErrors, ListExternalPluginsResponses, ListExternalServiceBackupsData, ListExternalServiceBackupsErrors, ListExternalServiceBackupsResponses, ListFlagsData, ListFlagsErrors, ListFlagsResponses, ListFunnelsData, ListFunnelsErrors, ListFunnelsResponses, ListGitProvidersData, ListGitProvidersErrors, ListGitProvidersResponses, ListGlobalMcpsData, ListGlobalMcpsErrors, ListGlobalMcpsResponses, ListGlobalSkillsData, ListGlobalSkillsErrors, ListGlobalSkillsResponses, ListIncidentsData, ListIncidentsErrors, ListIncidentsResponses, ListInsightsData, ListInsightsErrors, ListInsightsResponses, ListIpAccessControlData, ListIpAccessControlErrors, ListIpAccessControlResponses, ListJobsData, ListJobsErrors, ListJobsResponses, ListKnownAiAgentsData, ListKnownAiAgentsErrors, ListKnownAiAgentsResponses, ListManagedDomainsData, ListManagedDomainsErrors, ListManagedDomainsResponses, ListMcpsData, ListMcpsErrors, ListMcpsResponses, ListMetricLabelKeysData, ListMetricLabelKeysErrors, ListMetricLabelKeysResponses, ListMetricLabelValuesData, ListMetricLabelValuesErrors, ListMetricLabelValuesResponses, ListMetricNamesData, ListMetricNamesErrors, ListMetricNamesResponses, ListModelsData, ListModelsErrors, ListModelsResponses, ListMonitorsData, ListMonitorsErrors, ListMonitorsResponses, ListNotificationProvidersData, ListNotificationProvidersErrors, ListNotificationProvidersResponses, ListOidcProvidersData, ListOidcProvidersResponses, ListOidcProviderUsersData, ListOidcProviderUsersErrors, ListOidcProviderUsersResponses, ListOidcRoleMappingsData, ListOidcRoleMappingsResponses, ListOnDemandCertsData, ListOnDemandCertsErrors, ListOnDemandCertsResponses, ListOrdersData, ListOrdersErrors, ListOrdersResponses, ListPeersData, ListPeersErrors, ListPeersResponses, ListPendingActionsData, ListPendingActionsErrors, ListPendingActionsResponses, ListPgUpgradesData, ListPgUpgradesErrors, ListPgUpgradesResponses, ListPresetsData, ListPresetsErrors, ListPresetsResponses, ListProjectAccessData, ListProjectAccessErrors, ListProjectAccessResponses, ListProjectAlarmsData, ListProjectAlarmsErrors, ListProjectAlarmsResponses, ListProjectScansData, ListProjectScansErrors, ListProjectScansResponses, ListProjectSecretsData, ListProjectSecretsErrors, ListProjectSecretsResponses, ListProjectServicesData, ListProjectServicesErrors, ListProjectServicesResponses, ListProjectTemplatesData, ListProjectTemplatesErrors, ListProjectTemplatesResponses, ListProjectTemplateTagsData, ListProjectTemplateTagsErrors, ListProjectTemplateTagsResponses, ListProviderKeysData, ListProviderKeysErrors, ListProviderKeysResponses, ListProviderZonesData, ListProviderZonesErrors, ListProviderZonesResponses, ListPublicProvidersData, ListPublicProvidersResponses, ListReleaseFilesData, ListReleaseFilesErrors, ListReleaseFilesResponses, ListReleasesData, ListReleasesErrors, ListReleasesResponses, ListRemoteExternalImagesData, ListRemoteExternalImagesErrors, ListRemoteExternalImagesResponses, ListRepositoriesByConnectionData, ListRepositoriesByConnectionErrors, ListRepositoriesByConnectionResponses, ListRepositoriesByProviderData, ListRepositoriesByProviderErrors, ListRepositoriesByProviderResponses, ListRestoreRunsForServiceData, ListRestoreRunsForServiceResponses, ListRootContainersData, ListRootContainersErrors, ListRootContainersResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponses, ListS3SourcesData, ListS3SourcesErrors, ListS3SourcesResponses, ListSandboxesData, ListSandboxesResponses, ListScheduleRunJobsData, ListScheduleRunJobsErrors, ListScheduleRunJobsResponses, ListScheduleRunsData, ListScheduleRunsErrors, ListScheduleRunsResponses, ListScheduleServicesData, ListScheduleServicesErrors, ListScheduleServicesResponses, ListSecretsData, ListSecretsErrors, ListSecretsResponses, ListServiceHealthStatusesData, ListServiceHealthStatusesErrors, ListServiceHealthStatusesResponses, ListServiceProjectsData, ListServiceProjectsErrors, ListServiceProjectsResponses, ListServiceSchedulesData, ListServiceSchedulesErrors, ListServiceSchedulesResponses, ListServicesData, ListServicesErrors, ListServicesResponses, ListSkillsData, ListSkillsErrors, ListSkillsResponses, ListSourceBackupsData, ListSourceBackupsErrors, ListSourceBackupsResponses, ListSourceFilesData, ListSourceFilesErrors, ListSourceFilesResponses, ListSourceMapsData, ListSourceMapsErrors, ListSourceMapsResponses, ListSourcesData, ListSourcesErrors, ListSourcesResponses, ListStaticBundlesData, ListStaticBundlesErrors, ListStaticBundlesResponses, ListSyncedRepositoriesData, ListSyncedRepositoriesErrors, ListSyncedRepositoriesResponses, ListTeamMembersData, ListTeamMembersErrors, ListTeamMembersResponses, ListTeamProjectsData, ListTeamProjectsErrors, ListTeamProjectsResponses, ListTeamsData, ListTeamsErrors, ListTeamsResponses, ListUsersData, ListUsersErrors, ListUsersResponses, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponses, LoginData, LoginErrors, LoginResponses, LogoutData, LogoutErrors, LogoutResponses, LookupDnsARecordsData, LookupDnsARecordsErrors, LookupDnsARecordsResponses, MintEnrollmentTokenData, MintEnrollmentTokenErrors, MintEnrollmentTokenResponses, MkdirData, MkdirErrors, MkdirResponses, NodeHeartbeatData, NodeHeartbeatErrors, NodeHeartbeatResponses, NodeMetricsGetRangeData, NodeMetricsGetRangeErrors, NodeMetricsGetRangeResponses, ObservabilityFullEventData, ObservabilityFullEventErrors, ObservabilityFullEventResponses, ObservabilityListEventsData, ObservabilityListEventsErrors, ObservabilityListEventsResponses, OidcCallbackData, PatchAdminGateData, PatchAdminGateErrors, PatchAdminGateResponses, PatchPreviewGatewaySettingsData, PatchPreviewGatewaySettingsResponses, PauseDeploymentData, PauseDeploymentErrors, PauseDeploymentResponses, PauseSandboxData, PauseSandboxErrors, PauseSandboxResponses, PlanRestoreData, PlanRestoreErrors, PlanRestoreResponses, PostDnsAckData, PostDnsAckErrors, PostDnsAckResponses, PreviewAlertData, PreviewAlertErrors, PreviewAlertResponses, PreviewFunnelMetricsData, PreviewFunnelMetricsErrors, PreviewFunnelMetricsResponses, PreviewHostnameModeData, PreviewHostnameModeErrors, PreviewHostnameModeResponses, PromoteClusterMemberData, PromoteClusterMemberErrors, PromoteClusterMemberResponses, PromoteDeploymentData, PromoteDeploymentErrors, PromoteDeploymentResponses, ProvisionDomainData, ProvisionDomainErrors, ProvisionDomainResponses, PurgeProjectLogsData, PurgeProjectLogsErrors, PurgeProjectLogsResponses, PushExternalImageData, PushExternalImageErrors, PushExternalImageResponses, QueryDataData, QueryDataErrors, QueryDataResponses, QueryGenaiTracesData, QueryGenaiTracesErrors, QueryGenaiTracesResponses, QueryLogsData, QueryLogsErrors, QueryLogsResponses, QueryMetricsData, QueryMetricsErrors, QueryMetricsResponses, QueryTracesData, QueryTracesErrors, QueryTracesResponses, QueryTraceSummariesData, QueryTraceSummariesErrors, QueryTraceSummariesResponses, ReadFileData, ReadFileErrors, ReadFileResponses, ReAnalyzeData, ReAnalyzeErrors, ReAnalyzeResponses, RecordConsoleEventData, RecordConsoleEventErrors, RecordConsoleEventResponses, RecordEventMetricsData, RecordEventMetricsErrors, RecordEventMetricsResponses, RecordFlagExposureData, RecordFlagExposureErrors, RecordFlagExposureResponses, RecordSpeedMetricsData, RecordSpeedMetricsErrors, RecordSpeedMetricsResponses, RefreshRouteTableData, RefreshRouteTableErrors, RefreshRouteTableResponses, RegenerateDsnData, RegenerateDsnErrors, RegenerateDsnResponses, RegisterExternalImageData, RegisterExternalImageErrors, RegisterExternalImageResponses, RegisterNodeData, RegisterNodeErrors, RegisterNodeResponses, ReinstallGitlabWebhookData, ReinstallGitlabWebhookErrors, ReinstallGitlabWebhookResponses, RejectPendingActionData, RejectPendingActionErrors, RejectPendingActionResponses, ReloadPluginsData, ReloadPluginsErrors, ReloadPluginsResponses, RemoveClusterMemberData, RemoveClusterMemberErrors, RemoveClusterMemberResponses, RemoveManagedDomainData, RemoveManagedDomainErrors, RemoveManagedDomainResponses, RemoveRoleData, RemoveRoleErrors, RemoveRoleResponses, RemoveTeamMemberData, RemoveTeamMemberErrors, RemoveTeamMemberResponses, RenameConversationData, RenameConversationErrors, RenameConversationResponses, RenewDomainData, RenewDomainErrors, RenewDomainResponses, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponses, ResetPasswordData, ResetPasswordErrors, ResetPasswordResponses, ResizeSandboxData, ResizeSandboxErrors, ResizeSandboxResponses, ResolveAlarmData, ResolveAlarmErrors, ResolveAlarmResponses, RestartContainerData, RestartContainerErrors, RestartContainerResponses, RestartPreviewGatewayData, RestartPreviewGatewayResponses, RestartSandboxData, RestartSandboxErrors, RestartSandboxResponses, RestoreFlagData, RestoreFlagErrors, RestoreFlagResponses, RestoreUserData, RestoreUserErrors, RestoreUserResponses, ResumeDeploymentData, ResumeDeploymentErrors, ResumeDeploymentResponses, ResumeSandboxData, ResumeSandboxErrors, ResumeSandboxResponses, RetryClusterData, RetryClusterErrors, RetryClusterResponses, RetryDeliveryData, RetryDeliveryErrors, RetryDeliveryResponses, RetryPgUpgradeData, RetryPgUpgradeErrors, RetryPgUpgradeResponses, RetryRunData, RetryRunErrors, RetryRunResponses, RevealGlobalMcpConfigData, RevealGlobalMcpConfigErrors, RevealGlobalMcpConfigResponses, RevealMcpConfigData, RevealMcpConfigErrors, RevealMcpConfigResponses, RevealNotificationProviderConfigData, RevealNotificationProviderConfigErrors, RevealNotificationProviderConfigResponses, RevealServiceParameterData, RevealServiceParameterErrors, RevealServiceParameterResponses, RevenueCreateIntegrationData, RevenueCreateIntegrationErrors, RevenueCreateIntegrationResponses, RevenueDeleteIntegrationData, RevenueDeleteIntegrationResponses, RevenueGlobalEventsData, RevenueGlobalEventsResponses, RevenueImportInvoicesCsvData, RevenueImportInvoicesCsvErrors, RevenueImportInvoicesCsvResponses, RevenueImportSubscriptionsCsvData, RevenueImportSubscriptionsCsvErrors, RevenueImportSubscriptionsCsvResponses, RevenueListIntegrationsData, RevenueListIntegrationsResponses, RevenueListProvidersData, RevenueListProvidersResponses, RevenueMetricsCustomersData, RevenueMetricsCustomersResponses, RevenueMetricsGlobalMrrData, RevenueMetricsGlobalMrrResponses, RevenueMetricsGlobalSummaryData, RevenueMetricsGlobalSummaryResponses, RevenueMetricsMrrData, RevenueMetricsMrrResponses, RevenueMetricsSummaryData, RevenueMetricsSummaryResponses, RevenueRecentEventsData, RevenueRecentEventsResponses, RevenueRotateTokenData, RevenueRotateTokenResponses, RevenueUpdateConfigData, RevenueUpdateConfigErrors, RevenueUpdateConfigResponses, RevenueUpdateSecretData, RevenueUpdateSecretErrors, RevenueUpdateSecretResponses, RevokeDsnData, RevokeDsnErrors, RevokeDsnResponses, RevokeEnrollmentTokenData, RevokeEnrollmentTokenErrors, RevokeEnrollmentTokenResponses, RevokeJoinTokenData, RevokeJoinTokenErrors, RevokeJoinTokenResponses, RevokeProjectAccessData, RevokeProjectAccessErrors, RevokeProjectAccessResponses, RollbackPgUpgradeData, RollbackPgUpgradeErrors, RollbackPgUpgradeResponses, RollbackToDeploymentData, RollbackToDeploymentErrors, RollbackToDeploymentResponses, RootfsGcData, RootfsGcResponses, RootfsReportData, RootfsReportResponses, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponses, RotateDeploymentTokenData, RotateDeploymentTokenErrors, RotateDeploymentTokenResponses, RunBackupForSourceData, RunBackupForSourceErrors, RunBackupForSourceResponses, RunConnectionHealthCheckData, RunConnectionHealthCheckErrors, RunConnectionHealthCheckResponses, RunExternalServiceBackupData, RunExternalServiceBackupErrors, RunExternalServiceBackupResponses, RunScheduleNowData, RunScheduleNowErrors, RunScheduleNowResponses, SandboxCreatePreviewLinkData, SandboxCreatePreviewLinkErrors, SandboxCreatePreviewLinkResponses, SaveAgentTokenData, SaveAgentTokenErrors, SaveAgentTokenResponses, SaveAiProviderCredentialData, SaveAiProviderCredentialErrors, SaveAiProviderCredentialResponses, SearchLogsData, SearchLogsErrors, SearchLogsResponses, SendEmailData, SendEmailErrors, SendEmailResponses, SetDefaultS3SourceData, SetDefaultS3SourceErrors, SetDefaultS3SourceResponses, SetFlagEnvironmentData, SetFlagEnvironmentErrors, SetFlagEnvironmentResponses, SetPreviewPasswordData, SetPreviewPasswordErrors, SetPreviewPasswordResponses, SetupDnsChallengeData, SetupDnsChallengeErrors, SetupDnsChallengeResponses, SetupDnsData, SetupDnsErrors, SetupDnsResponses, SetupEmailTrackingData, SetupEmailTrackingErrors, SetupEmailTrackingResponses, SetupMfaData, SetupMfaErrors, SetupMfaResponses, SleepEnvironmentData, SleepEnvironmentErrors, SleepEnvironmentResponses, SmokeTestAgentData, SmokeTestAgentErrors, SmokeTestAgentResponses, SourceSandboxData, SourceSandboxErrors, SourceSandboxResponses, StartAnalysisData, StartAnalysisErrors, StartAnalysisResponses, StartContainerData, StartContainerErrors, StartContainerResponses, StartFixData, StartFixErrors, StartFixResponses, StartGitProviderOauthData, StartGitProviderOauthErrors, StartOidcLoginBySlugData, StartOidcLoginBySlugErrors, StartPgUpgradeData, StartPgUpgradeErrors, StartPgUpgradeResponses, StartRestoreData, StartRestoreErrors, StartRestoreResponses, StartServiceData, StartServiceErrors, StartServiceResponses, StatPathData, StatPathErrors, StatPathResponses, StopContainerData, StopContainerErrors, StopContainerResponses, StopSandboxData, StopSandboxErrors, StopSandboxResponses, StopServiceData, StopServiceErrors, StopServiceResponses, StreamContainerMetricsData, StreamContainerMetricsErrors, StreamContainerMetricsResponses, StreamEventsData, StreamEventsErrors, StreamEventsResponses, StreamRunEventsData, StreamRunEventsErrors, StreamRunEventsResponses, SyncRepositoriesData, SyncRepositoriesErrors, SyncRepositoriesResponses, TailDeploymentJobLogsData, TailDeploymentJobLogsErrors, TailLogsData, TailLogsErrors, TailLogsResponses, TeardownDeploymentData, TeardownDeploymentErrors, TeardownDeploymentResponses, TeardownEnvironmentData, TeardownEnvironmentErrors, TeardownEnvironmentResponses, TestNotificationProviderData, TestNotificationProviderErrors, TestNotificationProviderResponses, TestOidcProviderData, TestOidcProviderResponses, TestProviderConnectionData, TestProviderConnectionErrors, TestProviderConnectionResponses, TestProviderData, TestProviderErrors, TestProviderKeyByIdData, TestProviderKeyByIdErrors, TestProviderKeyByIdResponses, TestProviderKeyInlineData, TestProviderKeyInlineErrors, TestProviderKeyInlineResponses, TestProviderResponses, TestS3ConnectionPreviewData, TestS3ConnectionPreviewErrors, TestS3ConnectionPreviewResponses, TestS3SourceConnectionData, TestS3SourceConnectionErrors, TestS3SourceConnectionResponses, TrackClickData, TrackClickErrors, TrackOpenData, TrackOpenErrors, TrackOpenResponses, TriggerAgentData, TriggerAgentErrors, TriggerAgentResponses, TriggerProjectPipelineData, TriggerProjectPipelineErrors, TriggerProjectPipelineResponses, TriggerScanData, TriggerScanErrors, TriggerScanResponses, TriggerServiceHealthCheckData, TriggerServiceHealthCheckErrors, TriggerServiceHealthCheckResponses, TriggerWeeklyDigestData, TriggerWeeklyDigestErrors, TriggerWeeklyDigestResponses, UnlinkServiceFromProjectData, UnlinkServiceFromProjectErrors, UnlinkServiceFromProjectResponses, UpdateAgentData, UpdateAgentErrors, UpdateAgentResponses, UpdateAiProviderData, UpdateAiProviderErrors, UpdateAiProviderResponses, UpdateAlertData, UpdateAlertErrors, UpdateAlertResponses, UpdateAlertRuleData, UpdateAlertRuleErrors, UpdateAlertRuleResponses, UpdateApiKeyData, UpdateApiKeyErrors, UpdateApiKeyResponses, UpdateAutomaticDeployData, UpdateAutomaticDeployErrors, UpdateAutomaticDeployResponses, UpdateBackupScheduleData, UpdateBackupScheduleErrors, UpdateBackupScheduleResponses, UpdateCloudflareProviderData, UpdateCloudflareProviderErrors, UpdateCloudflareProviderResponses, UpdateConnectionTokenData, UpdateConnectionTokenErrors, UpdateConnectionTokenResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainResponses, UpdateDashboardData, UpdateDashboardErrors, UpdateDashboardResponses, UpdateDeploymentTokenData, UpdateDeploymentTokenErrors, UpdateDeploymentTokenResponses, UpdateEmailProviderData, UpdateEmailProviderErrors, UpdateEmailProviderResponses, UpdateEnvironmentSettingsData, UpdateEnvironmentSettingsErrors, UpdateEnvironmentSettingsResponses, UpdateEnvironmentSubdomainData, UpdateEnvironmentSubdomainErrors, UpdateEnvironmentSubdomainResponses, UpdateEnvironmentVariableData, UpdateEnvironmentVariableErrors, UpdateEnvironmentVariableResponses, UpdateErrorGroupData, UpdateErrorGroupErrors, UpdateErrorGroupResponses, UpdateFlagData, UpdateFlagErrors, UpdateFlagResponses, UpdateFunnelData, UpdateFunnelErrors, UpdateFunnelResponses, UpdateGitProviderCredentialsData, UpdateGitProviderCredentialsErrors, UpdateGitProviderCredentialsResponses, UpdateGitSettingsData, UpdateGitSettingsErrors, UpdateGitSettingsResponses, UpdateGlobalMcpData, UpdateGlobalMcpErrors, UpdateGlobalMcpResponses, UpdateGlobalSkillData, UpdateGlobalSkillErrors, UpdateGlobalSkillResponses, UpdateIncidentStatusData, UpdateIncidentStatusErrors, UpdateIncidentStatusResponses, UpdateIpAccessControlData, UpdateIpAccessControlErrors, UpdateIpAccessControlResponses, UpdateManagedDomainData, UpdateManagedDomainErrors, UpdateManagedDomainResponses, UpdateMcpData, UpdateMcpErrors, UpdateMcpResponses, UpdateNotificationEmailProviderData, UpdateNotificationEmailProviderErrors, UpdateNotificationEmailProviderResponses, UpdateNotificationProviderData, UpdateNotificationProviderErrors, UpdateNotificationProviderResponses, UpdateOidcProviderData, UpdateOidcProviderResponses, UpdatePreferencesData, UpdatePreferencesErrors, UpdatePreferencesResponses, UpdateProjectData, UpdateProjectDeploymentConfigData, UpdateProjectDeploymentConfigErrors, UpdateProjectDeploymentConfigResponses, UpdateProjectErrors, UpdateProjectResponses, UpdateProjectSecretData, UpdateProjectSecretErrors, UpdateProjectSecretResponses, UpdateProjectSettingsData, UpdateProjectSettingsErrors, UpdateProjectSettingsResponses, UpdateProviderData, UpdateProviderErrors, UpdateProviderKeyData, UpdateProviderKeyErrors, UpdateProviderKeyResponses, UpdateProviderResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteResponses, UpdateS3SourceData, UpdateS3SourceErrors, UpdateS3SourceResponses, UpdateSelfData, UpdateSelfErrors, UpdateSelfResponses, UpdateServiceData, UpdateServiceErrors, UpdateServiceResourcesData, UpdateServiceResourcesErrors, UpdateServiceResourcesResponses, UpdateServiceResponses, UpdateSessionDurationData, UpdateSessionDurationErrors, UpdateSessionDurationResponses, UpdateSettingsData, UpdateSettingsErrors, UpdateSettingsResponses, UpdateSkillData, UpdateSkillErrors, UpdateSkillResponses, UpdateSlackProviderData, UpdateSlackProviderErrors, UpdateSlackProviderResponses, UpdateSpeedMetricsData, UpdateSpeedMetricsErrors, UpdateSpeedMetricsResponses, UpdateTeamData, UpdateTeamErrors, UpdateTeamMemberRoleData, UpdateTeamMemberRoleErrors, UpdateTeamMemberRoleResponses, UpdateTeamResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookProviderData, UpdateWebhookProviderErrors, UpdateWebhookProviderResponses, UpdateWebhookResponses, UpgradePreviewGatewayData, UpgradePreviewGatewayResponses, UpgradeServiceData, UpgradeServiceErrors, UpgradeServiceResponses, UploadGlobalSkillData, UploadGlobalSkillErrors, UploadGlobalSkillResponses, UploadReleaseFileData, UploadReleaseFileErrors, UploadReleaseFileResponses, UploadSkillData, UploadSkillErrors, UploadSkillResponses, UploadSourceFileData, UploadSourceFileErrors, UploadSourceFileResponses, UploadSourceMapData, UploadSourceMapErrors, UploadSourceMapResponses, UploadStaticBundleData, UploadStaticBundleErrors, UploadStaticBundleResponses, UpsertSecretData, UpsertSecretErrors, UpsertSecretResponses, ValidateConnectionData, ValidateConnectionErrors, ValidateConnectionResponses, ValidateEmailData, ValidateEmailErrors, ValidateEmailResponses, VerifyAndEnableMfaData, VerifyAndEnableMfaErrors, VerifyAndEnableMfaResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponses, VerifyEmailData, VerifyEmailErrors, VerifyEmailResponses, VerifyManagedDomainData, VerifyManagedDomainErrors, VerifyManagedDomainResponses, VerifyMfaChallengeData, VerifyMfaChallengeErrors, VerifyMfaChallengeResponses, VerifyStepUpData, VerifyStepUpErrors, VerifyStepUpResponses, WakeEnvironmentData, WakeEnvironmentErrors, WakeEnvironmentResponses, WebhookTriggerData, WebhookTriggerErrors, WebhookTriggerResponses, WorkflowDryRunData, WorkflowDryRunErrors, WorkflowDryRunResponses, WriteFileData, WriteFileErrors, WriteFileResponses, WriteFilesData, WriteFilesErrors, WriteFilesResponses } from './types.gen'; export type Options = Options2 & { /** @@ -750,6 +750,15 @@ export const startOidcLoginBySlug = (optio export const listPublicProviders = (options?: Options): RequestResult => (options?.client ?? client).get({ url: '/auth/oidc/providers', ...options }); +export const changeRequiredPassword = (options: Options): RequestResult => (options.client ?? client).post({ + url: '/auth/password-change-required', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } +}); + export const requestPasswordReset = (options: Options): RequestResult => (options.client ?? client).post({ url: '/auth/password-reset/request', ...options, diff --git a/web/src/api/client/types.gen.ts b/web/src/api/client/types.gen.ts index 2e5a9e062..3c47b5446 100644 --- a/web/src/api/client/types.gen.ts +++ b/web/src/api/client/types.gen.ts @@ -1334,7 +1334,10 @@ export type AuthFlavorDto = { export type AuthResponse = { message: string; + mfa_enrollment_required: boolean; mfa_required: boolean; + mfa_setup?: null | MfaSetupResponse; + password_change_required: boolean; success: boolean; user_id?: number | null; }; @@ -3927,6 +3930,7 @@ export type CreateTeamRequest = { export type CreateUserRequest = { email?: string | null; + must_change_password?: boolean; password?: string | null; roles: Array; username: string; @@ -4737,6 +4741,19 @@ export type DeploymentMetadata = { * ID of the deployment this was rolled back from (if applicable) */ rolledBackFromId?: number | null; + /** + * Uploaded source archive content type. + */ + sourceBundleContentType?: string | null; + /** + * Uploaded source archive ID. Source archives are extracted before the + * regular preset build pipeline and do not require Git metadata. + */ + sourceBundleId?: number | null; + /** + * Uploaded source archive path in the Temps data directory. + */ + sourceBundlePath?: string | null; /** * Static bundle content type (for proper extraction: application/gzip or application/zip) */ @@ -13274,6 +13291,18 @@ export type RequestRow = { user_agent?: string | null; }; +export type RequiredPasswordChangeRequest = { + new_password: string; +}; + +export type RequiredPasswordChangeResponse = { + message: string; + mfa_enrollment_required: boolean; + mfa_setup?: null | MfaSetupResponse; + success: boolean; + user_id: number; +}; + export type ResetPasswordRequest = { new_password: string; token: string; @@ -13782,6 +13811,7 @@ export type RouteUser = { id: number; image: string; mfa_enabled: boolean; + must_change_password: boolean; name: string; updated_at: number; username: string; @@ -22341,6 +22371,37 @@ export type ListPublicProvidersResponses = { export type ListPublicProvidersResponse = ListPublicProvidersResponses[keyof ListPublicProvidersResponses]; +export type ChangeRequiredPasswordData = { + body: RequiredPasswordChangeRequest; + path?: never; + query?: never; + url: '/auth/password-change-required'; +}; + +export type ChangeRequiredPasswordErrors = { + /** + * Password does not meet requirements + */ + 400: unknown; + /** + * Password-change session is missing or expired + */ + 401: unknown; + /** + * Internal server error + */ + 500: unknown; +}; + +export type ChangeRequiredPasswordResponses = { + /** + * Required password change completed + */ + 200: RequiredPasswordChangeResponse; +}; + +export type ChangeRequiredPasswordResponse = ChangeRequiredPasswordResponses[keyof ChangeRequiredPasswordResponses]; + export type RequestPasswordResetData = { body: EmailRequest; path?: never; diff --git a/web/src/components/dashboard/Sidebar.tsx b/web/src/components/dashboard/Sidebar.tsx index b1b5c4626..11ee01350 100644 --- a/web/src/components/dashboard/Sidebar.tsx +++ b/web/src/components/dashboard/Sidebar.tsx @@ -76,16 +76,10 @@ import { } from 'lucide-react' import { ProjectResponse } from '@/api/client' -import { - getProjectBySlugOptions, - hasAnalyticsEventsOptions, - hasErrorGroupsOptions, - listCustomDomainsForProjectOptions, - listMonitorsOptions, - listProjectServicesOptions, -} from '@/api/client/@tanstack/react-query.gen' +import { getProjectBySlugOptions } from '@/api/client/@tanstack/react-query.gen' import { useAuth } from '@/contexts/AuthContext' import { useGettingStarted } from '@/hooks/useGettingStarted' +import { useProjectSetup } from '@/hooks/useProjectSetup' import { useCanViewAuditLogs } from '@/hooks/useAuditAccess' import { usePluginsContext } from '@/contexts/PluginsContext' import { resolvePluginIcon } from '@/lib/pluginIcons' @@ -990,99 +984,25 @@ const projectBaseNav: ProjectNavItem[] = [ }, ] -interface ProjectSetupStep { - id: string - title: string - href: string - done: boolean - icon: LucideIcon -} - function ProjectSetupNavItem({ project }: { project: ProjectResponse }) { const { isMinimal, isMobile } = useSidebar() const compact = isMinimal && !isMobile + const setup = useProjectSetup(project) + const remainingSteps = setup.steps.filter((step) => !step.done) - const analyticsQuery = useQuery({ - ...hasAnalyticsEventsOptions({ path: { project_id: project.id } }), - }) - const errorsQuery = useQuery({ - ...hasErrorGroupsOptions({ path: { project_id: project.id } }), - }) - const domainsQuery = useQuery({ - ...listCustomDomainsForProjectOptions({ - path: { project_id: project.id }, - }), - }) - const monitorsQuery = useQuery({ - ...listMonitorsOptions({ path: { project_id: project.id } }), - }) - const servicesQuery = useQuery({ - ...listProjectServicesOptions({ path: { project_id: project.id } }), - }) - - const isLoading = - analyticsQuery.isLoading || - errorsQuery.isLoading || - domainsQuery.isLoading || - monitorsQuery.isLoading || - servicesQuery.isLoading - - const steps: ProjectSetupStep[] = [ - { - id: 'analytics', - title: 'Install analytics SDK', - href: `/projects/${project.slug}/analytics/setup`, - done: !!analyticsQuery.data?.has_events, - icon: BarChart3, - }, - { - id: 'errors', - title: 'Install error tracking SDK', - href: `/projects/${project.slug}/errors/setup`, - done: !!errorsQuery.data?.has_error_groups, - icon: ShieldAlert, - }, - { - id: 'domain', - title: 'Connect a custom domain', - href: `/projects/${project.slug}/domains`, - done: (domainsQuery.data?.domains?.length ?? 0) > 0, - icon: Globe, - }, - { - id: 'monitoring', - title: 'Add an uptime monitor', - href: `/projects/${project.slug}/monitors`, - done: (monitorsQuery.data?.length ?? 0) > 0, - icon: Activity, - }, - { - id: 'storage', - title: 'Link database or storage', - href: `/projects/${project.slug}/storage`, - done: (servicesQuery.data?.length ?? 0) > 0, - icon: Database, - }, - ] - - const remainingSteps = steps.filter((step) => !step.done) - const completedCount = steps.length - remainingSteps.length - const percent = Math.round((completedCount / steps.length) * 100) - - if (isLoading || remainingSteps.length === 0) return null + if (setup.isLoading || remainingSteps.length === 0) return null if (compact) { - const nextStep = remainingSteps[0] return ( - + @@ -1098,28 +1018,32 @@ function ProjectSetupNavItem({ project }: { project: ProjectResponse }) { return (
-
+
Project setup - {completedCount}/{steps.length} + {setup.completedCount}/{setup.totalCount} +
-
+
    {visibleSteps.map((step) => (
  • @@ -1136,8 +1060,13 @@ function ProjectSetupNavItem({ project }: { project: ProjectResponse }) {
  • ))} {hiddenCount > 0 && ( -
  • - +{hiddenCount} more {hiddenCount === 1 ? 'step' : 'steps'} +
  • + + +{hiddenCount} more {hiddenCount === 1 ? 'step' : 'steps'} +
  • )}
diff --git a/web/src/components/drop/DetectedPresetCard.tsx b/web/src/components/drop/DetectedPresetCard.tsx new file mode 100644 index 000000000..e1304b827 --- /dev/null +++ b/web/src/components/drop/DetectedPresetCard.tsx @@ -0,0 +1,157 @@ +import type { DropPresetCandidate } from '@/api/client' +import { PresetIcon } from '@/components/presets/PresetIcon' +import { cn } from '@/lib/utils' +import { AnimatePresence, motion, useReducedMotion } from 'framer-motion' +import { CheckCircle2, ScanSearch } from 'lucide-react' +import { useEffect, useState } from 'react' + +export function DetectedPresetCard({ + candidate, + isDetecting, + phase = 'detecting', +}: { + candidate?: DropPresetCandidate + isDetecting: boolean + phase?: 'packing' | 'detecting' +}) { + const reduceMotion = useReducedMotion() + const [elapsedSeconds, setElapsedSeconds] = useState(0) + const transition = reduceMotion + ? { duration: 0 } + : { duration: 0.32, ease: [0.22, 1, 0.36, 1] as const } + + useEffect(() => { + if (!isDetecting) return + const startedAt = Date.now() + const timer = window.setInterval(() => { + setElapsedSeconds(Math.floor((Date.now() - startedAt) / 1000)) + }, 1000) + return () => { + window.clearInterval(timer) + setElapsedSeconds(0) + } + }, [isDetecting]) + + const detectionTitle = + phase === 'packing' ? 'Packaging project files' : 'Inspecting project files' + const detectionDescription = + elapsedSeconds >= 5 + ? `Still working — larger projects can take a little longer. ${elapsedSeconds}s elapsed. You can cancel with the X.` + : phase === 'packing' + ? 'Creating a secure archive in your browser…' + : 'Uploading the archive and reading framework manifests…' + + return ( +
+ + {isDetecting ? ( + +
+ + {!reduceMotion && ( + + )} +
+
+

{detectionTitle}

+

+ {detectionDescription} +

+
+ {!reduceMotion && ( + + )} + + ) : candidate ? ( + + + + +
+
+

{candidate.label}

+ + {candidate.confidence} confidence + +
+

+ {candidate.reason} +

+
+ +
+ ) : ( + +
+ +
+
+

+ Preset detection +

+

+ Select a folder or archive and Temps will identify the framework + automatically. +

+
+
+ )} +
+
+ ) +} diff --git a/web/src/components/drop/DetectedPresetGrid.tsx b/web/src/components/drop/DetectedPresetGrid.tsx new file mode 100644 index 000000000..77dff39ff --- /dev/null +++ b/web/src/components/drop/DetectedPresetGrid.tsx @@ -0,0 +1,88 @@ +import type { DropPresetCandidate } from '@/api/client' +import { PresetIcon } from '@/components/presets/PresetIcon' +import { cn } from '@/lib/utils' +import { Check, Folder } from 'lucide-react' + +export function DetectedPresetGrid({ + candidates, + selectedIndex, + onSelect, + disabled = false, +}: { + candidates: DropPresetCandidate[] + selectedIndex: number + onSelect: (index: number) => void + disabled?: boolean +}) { + return ( +
+ {candidates.map((candidate, index) => { + const selected = index === selectedIndex + const directory = candidate.directory || '.' + + return ( + + ) + })} +
+ ) +} diff --git a/web/src/components/drop/DropEnvironmentVariables.tsx b/web/src/components/drop/DropEnvironmentVariables.tsx new file mode 100644 index 000000000..daa6702c9 --- /dev/null +++ b/web/src/components/drop/DropEnvironmentVariables.tsx @@ -0,0 +1,160 @@ +import { Button } from '@/components/ui/button' +import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import type { DropEnvironmentVariable } from '@/lib/drop-environment-variables' +import { Eye, EyeOff, KeyRound, Plus, Trash2 } from 'lucide-react' +import { useState } from 'react' + +let nextVariableId = 0 + +function createVariableId(): string { + nextVariableId += 1 + return `drop-env-${nextVariableId}` +} + +export function DropEnvironmentVariables({ + variables, + onChange, + disabled = false, +}: { + variables: DropEnvironmentVariable[] + onChange: (variables: DropEnvironmentVariable[]) => void + disabled?: boolean +}) { + const [visibleValues, setVisibleValues] = useState>(new Set()) + + const update = (id: string, field: 'key' | 'value', value: string) => { + onChange( + variables.map((variable) => + variable.id === id ? { ...variable, [field]: value } : variable + ) + ) + } + + const add = () => { + onChange([...variables, { id: createVariableId(), key: '', value: '' }]) + } + + const remove = (id: string) => { + onChange(variables.filter((variable) => variable.id !== id)) + setVisibleValues((current) => { + const next = new Set(current) + next.delete(id) + return next + }) + } + + const toggleVisible = (id: string) => { + setVisibleValues((current) => { + const next = new Set(current) + if (next.has(id)) next.delete(id) + else next.add(id) + return next + }) + } + + return ( +
+
+
+ +
+

Environment variables

+

+ Optional values available to the first deployment. +

+
+
+ +
+ + {variables.length > 0 && ( +
+ {variables.map((variable, index) => { + const valueVisible = visibleValues.has(variable.id) + return ( +
+
+ + + update(variable.id, 'key', event.target.value) + } + /> +
+
+ +
+ + update(variable.id, 'value', event.target.value) + } + /> + +
+
+ +
+ ) + })} +
+ )} +
+ ) +} diff --git a/web/src/components/presets/PresetIcon.tsx b/web/src/components/presets/PresetIcon.tsx new file mode 100644 index 000000000..c5fbd68c2 --- /dev/null +++ b/web/src/components/presets/PresetIcon.tsx @@ -0,0 +1,40 @@ +import { Boxes } from 'lucide-react' +import { useState } from 'react' +import { cn } from '@/lib/utils' +import { presetIconPath } from '@/components/presets/preset-icon-paths' + +export function PresetIcon({ + preset, + label, + className, + imageClassName, +}: { + preset: string + label?: string + className?: string + imageClassName?: string +}) { + const [failedPreset, setFailedPreset] = useState(null) + const iconPath = presetIconPath(preset) + const canShowIcon = !!iconPath && failedPreset !== preset + + return ( +
+ {canShowIcon ? ( + {`${label setFailedPreset(preset)} + /> + ) : ( + + )} +
+ ) +} diff --git a/web/src/components/presets/preset-icon-paths.ts b/web/src/components/presets/preset-icon-paths.ts new file mode 100644 index 000000000..5ab90c3bb --- /dev/null +++ b/web/src/components/presets/preset-icon-paths.ts @@ -0,0 +1,44 @@ +const PRESET_ICON_PATHS: Record = { + angular: '/presets/angular.svg', + astro: '/presets/astro.svg', + autopack: '/presets/autopack.svg', + custom: '/presets/custom.svg', + dart: '/presets/dart.svg', + deno: '/presets/deno.svg', + django: '/presets/django.svg', + docker: '/presets/docker.svg', + dockercompose: '/presets/docker.svg', + dockerfile: '/presets/dockerfile.svg', + docusaurus: '/presets/docusaurus.svg', + dotnet: '/presets/dotnet.svg', + elixir: '/presets/elixir.svg', + fastapi: '/presets/fastapi.svg', + flask: '/presets/flask.svg', + go: '/presets/go.svg', + java: '/presets/java.svg', + laravel: '/presets/laravel.svg', + nextjs: '/presets/nextjs.svg', + nixpacks: '/presets/nixpacks.svg', + nixpacksnode: '/presets/nodejs.svg', + nixpacksstatic: '/presets/static.svg', + node: '/presets/nodejs.svg', + nodejs: '/presets/nodejs.svg', + nuxt: '/presets/nuxt.svg', + php: '/presets/php.svg', + python: '/presets/python.svg', + rails: '/presets/rails.svg', + react: '/presets/react.svg', + remix: '/presets/remix.svg', + rsbuild: '/presets/rsbuild.svg', + ruby: '/presets/ruby.svg', + rust: '/presets/rust.svg', + solidstart: '/presets/solidstart.svg', + static: '/presets/static.svg', + sveltekit: '/presets/sveltekit.svg', + vite: '/presets/vite.svg', + vue: '/presets/vue.svg', +} + +export function presetIconPath(preset: string): string | undefined { + return PRESET_ICON_PATHS[preset.toLowerCase().replace(/[^a-z0-9]/g, '')] +} diff --git a/web/src/components/templates/TemplateImage.tsx b/web/src/components/templates/TemplateImage.tsx index d201c6d2e..35eb25200 100644 --- a/web/src/components/templates/TemplateImage.tsx +++ b/web/src/components/templates/TemplateImage.tsx @@ -1,33 +1,7 @@ import { useState } from 'react' import { GitBranch } from 'lucide-react' import { cn } from '@/lib/utils' - -const PRESET_ICONS: Record = { - nextjs: '/presets/nextjs.svg', - fastapi: '/presets/fastapi.svg', - django: '/presets/django.svg', - remix: '/presets/remix.svg', - nuxt: '/presets/nuxt.svg', - astro: '/presets/astro.svg', - rust: '/presets/rust.svg', - go: '/presets/go.svg', - nixpacks: '/presets/nixpacks.svg', - vite: '/presets/vite.svg', - react: '/presets/react.svg', - vue: '/presets/vue.svg', - angular: '/presets/angular.svg', - flask: '/presets/flask.svg', - laravel: '/presets/laravel.svg', - rails: '/presets/rails.svg', - nodejs: '/presets/nodejs.svg', - sveltekit: '/presets/sveltekit.svg', - solidstart: '/presets/solidstart.svg', - docusaurus: '/presets/docusaurus.svg', - dockerfile: '/presets/dockerfile.svg', - docker: '/presets/docker.svg', - static: '/presets/static.svg', - rsbuild: '/presets/rsbuild.svg', -} +import { presetIconPath } from '@/components/presets/preset-icon-paths' interface TemplateImageProps { imageUrl?: string | null @@ -58,7 +32,7 @@ export function TemplateImage({ const [presetIconFailed, setPresetIconFailed] = useState(false) const showImage = !!imageUrl && !imageFailed - const presetIcon = PRESET_ICONS[preset.toLowerCase()] + const presetIcon = presetIconPath(preset) const showPresetIcon = !showImage && !!presetIcon && !presetIconFailed return ( diff --git a/web/src/components/users/RolePermissionDetails.tsx b/web/src/components/users/RolePermissionDetails.tsx new file mode 100644 index 000000000..99bb38138 --- /dev/null +++ b/web/src/components/users/RolePermissionDetails.tsx @@ -0,0 +1,126 @@ +import { getApiKeyPermissionsOptions } from '@/api/client/@tanstack/react-query.gen' +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' +import { Badge } from '@/components/ui/badge' +import { ScrollArea } from '@/components/ui/scroll-area' +import { Skeleton } from '@/components/ui/skeleton' +import { + categoryLabel, + groupRolePermissions, + permissionAction, +} from '@/lib/role-permissions' +import { useQuery } from '@tanstack/react-query' +import { Globe2, ShieldAlert } from 'lucide-react' + +const ROLE_SCOPE = { + user: { + title: 'All-project access', + description: + 'Can access every existing project and every project created later. Project access is not limited to selected projects.', + }, + admin: { + title: 'Full platform control', + description: + 'Can manage all projects, users, roles, settings, and system resources, including destructive operations.', + }, +} as const + +export function RolePermissionDetails({ roleName }: { roleName: string }) { + const { data, isLoading, isError } = useQuery({ + ...getApiKeyPermissionsOptions({}), + }) + + const role = data?.roles.find((item) => item.name === roleName) + const groups = groupRolePermissions(role, data?.permissions ?? []) + const permissionCount = groups.reduce( + (total, group) => total + group.permissions.length, + 0, + ) + const scope = ROLE_SCOPE[roleName as keyof typeof ROLE_SCOPE] + + return ( +
+ {scope && ( + + {roleName === 'admin' ? ( + + ) : ( + + )} + {scope.title} + +

+ {scope.description} +

+
+
+ )} + +
+
+

Exact permissions

+

+ Granted directly by the {roleName} role. +

+
+ {role && ( + + {permissionCount} permissions + + )} +
+ + {isLoading ? ( +
+ + + +
+ ) : isError || !role ? ( + + Permissions unavailable + +

+ The exact permission list could not be loaded. No user has been + created yet. +

+
+
+ ) : ( + +
+ {groups.map((group) => ( +
+
+

+ {categoryLabel(group.category)} +

+
+ {group.permissions.length} +
+
+
    + {group.permissions.map((permission) => ( +
  • +
    + {permissionAction(permission.name)} +
    +
    + {permission.name} +
    +
  • + ))} +
+
+ ))} +
+
+ )} +
+ ) +} diff --git a/web/src/components/users/UsersManagement.tsx b/web/src/components/users/UsersManagement.tsx index cae75f63f..372fdc03b 100644 --- a/web/src/components/users/UsersManagement.tsx +++ b/web/src/components/users/UsersManagement.tsx @@ -2,7 +2,6 @@ import { assignRoleMutation, - createUserMutation, deleteUserMutation, removeRoleMutation, } from '@/api/client/@tanstack/react-query.gen' @@ -37,30 +36,11 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { EmptyState } from '@/components/ui/empty-state' -import { - Form, - FormControl, - FormField, - FormItem, - FormLabel, - FormMessage, -} from '@/components/ui/form' -import { Input } from '@/components/ui/input' -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from '@/components/ui/select' import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group' import { Label } from '@/components/ui/label' -import { zodResolver } from '@hookform/resolvers/zod' import { useMutation, useQueryClient } from '@tanstack/react-query' import { Edit2, - Eye, - EyeOff, MoreHorizontal, Plus, Shield, @@ -68,27 +48,21 @@ import { UserPlus, } from 'lucide-react' import { useState } from 'react' -import { useForm } from 'react-hook-form' import { useNavigate } from 'react-router' import { toast } from 'sonner' -import { z } from 'zod' - -const createUserSchema = z.object({ - name: z.string().min(3, 'Name must be at least 3 characters'), - email: z.email('Invalid email address'), - password: z.string().min(8, 'Password must be at least 8 characters'), - role: z.string().min(1, 'Please select a role'), -}) - -type CreateUserFormData = z.infer +import { RolePermissionDetails } from './RolePermissionDetails' const availableRoles = [ { value: 'admin', label: 'Administrator', - description: 'Full access to all features', + description: 'Full control of projects, users, settings, and the system.', + }, + { + value: 'user', + label: 'User', + description: 'Can deploy and operate every existing and future project.', }, - { value: 'user', label: 'User', description: 'Standard user access' }, ] interface UsersManagementProps { @@ -96,8 +70,6 @@ interface UsersManagementProps { isLoading: boolean reloadUsers: () => void onEditUser: (user: { id: number; name: string; email: string }) => void - isCreateDialogOpen: boolean - onCreateDialogOpenChange: (open: boolean) => void } export function UsersManagement({ @@ -105,42 +77,13 @@ export function UsersManagement({ isLoading, reloadUsers, onEditUser, - isCreateDialogOpen, - onCreateDialogOpenChange, }: UsersManagementProps) { const [userToDelete, setUserToDelete] = useState(null) const [userToManageRoles, setUserToManageRoles] = useState(null) - const [showPassword, setShowPassword] = useState(false) const queryClient = useQueryClient() const navigate = useNavigate() - const form = useForm({ - resolver: zodResolver(createUserSchema), - defaultValues: { - name: '', - email: '', - password: '', - role: 'user', - }, - }) - - // Use register mutation for creating users with passwords - const createUser = useMutation({ - ...createUserMutation(), - meta: { - errorTitle: 'Failed to create user', - }, - onSuccess: async () => { - // Roles are already assigned in the body during creation - // No need to assign them again here - that would create duplicates - toast.success('User created successfully') - onCreateDialogOpenChange(false) - form.reset() - reloadUsers() - }, - }) - const deleteUser = useMutation({ ...deleteUserMutation(), meta: { @@ -205,17 +148,6 @@ export function UsersManagement({ }, }) - const handleCreateUser = async (data: CreateUserFormData) => { - await createUser.mutateAsync({ - body: { - username: data.name, - email: data.email, - roles: [data.role], - password: data.password, - }, - }) - } - const handleDeleteUser = async (userId: number) => { await deleteUser.mutateAsync({ path: { @@ -271,128 +203,10 @@ export function UsersManagement({

onCreateDialogOpenChange(true)} + onClick={() => navigate('/settings/users/new')} label="Add User" icon={} /> - - - - Create New User - -
- - ( - - Name - - - - - - )} - /> - ( - - Email - - - - - - )} - /> - ( - - Password - -
- - -
-
- -
- )} - /> - ( - - Role - - - - )} - /> - - - - - -
-
!open && setUserToManageRoles(null)} > - + Manage User Role

@@ -500,6 +314,19 @@ export function UsersManagement({ })} )} + {userToManageRoles && ( +

+ [role.name, role]) + ).values() + )[0]?.name || 'user' + } + /> +
+ )} diff --git a/web/src/hooks/useProjectSetup.test.ts b/web/src/hooks/useProjectSetup.test.ts new file mode 100644 index 000000000..8a9bbe75f --- /dev/null +++ b/web/src/hooks/useProjectSetup.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, test } from 'bun:test' +import { buildProjectSetupSteps } from './useProjectSetup' + +describe('buildProjectSetupSteps', () => { + test('builds every project-scoped setup destination', () => { + const steps = buildProjectSetupSteps('storefront', { + hasAnalyticsEvents: false, + hasErrorGroups: false, + customDomainCount: 0, + monitorCount: 0, + serviceCount: 0, + hasTelemetryTraces: false, + }) + + expect(steps.map((step) => step.id)).toEqual([ + 'analytics', + 'errors', + 'domain', + 'monitoring', + 'storage', + 'telemetry', + ]) + expect(steps.map((step) => step.href)).toEqual([ + '/projects/storefront/analytics/setup', + '/projects/storefront/errors/setup', + '/projects/storefront/domains', + '/projects/storefront/monitors', + '/projects/storefront/storage', + '/projects/storefront/traces#traces-setup', + ]) + }) + + test('derives completion from project activation signals', () => { + const steps = buildProjectSetupSteps('storefront', { + hasAnalyticsEvents: true, + hasErrorGroups: false, + customDomainCount: 2, + monitorCount: 1, + serviceCount: 0, + hasTelemetryTraces: true, + }) + + expect(steps.filter((step) => step.done).map((step) => step.id)).toEqual([ + 'analytics', + 'domain', + 'monitoring', + 'telemetry', + ]) + }) +}) diff --git a/web/src/hooks/useProjectSetup.ts b/web/src/hooks/useProjectSetup.ts new file mode 100644 index 000000000..14e6b54b2 --- /dev/null +++ b/web/src/hooks/useProjectSetup.ts @@ -0,0 +1,183 @@ +import type { ProjectResponse } from '@/api/client' +import { + hasAnalyticsEventsOptions, + hasErrorGroupsOptions, + listCustomDomainsForProjectOptions, + listMonitorsOptions, + listProjectServicesOptions, + queryTraceSummariesOptions, +} from '@/api/client/@tanstack/react-query.gen' +import { useQuery } from '@tanstack/react-query' +import { + Activity, + BarChart3, + Database, + Globe, + ShieldAlert, + Workflow, + type LucideIcon, +} from 'lucide-react' + +export type ProjectSetupStepId = + 'analytics' | 'errors' | 'domain' | 'monitoring' | 'storage' | 'telemetry' + +export interface ProjectSetupStep { + id: ProjectSetupStepId + title: string + description: string + href: string + cta: string + done: boolean + icon: LucideIcon +} + +export interface ProjectSetupSignals { + hasAnalyticsEvents: boolean + hasErrorGroups: boolean + customDomainCount: number + monitorCount: number + serviceCount: number + hasTelemetryTraces: boolean +} + +export function buildProjectSetupSteps( + projectSlug: string, + signals: ProjectSetupSignals +): ProjectSetupStep[] { + const base = `/projects/${projectSlug}` + + return [ + { + id: 'analytics', + title: 'Install the analytics SDK', + description: + 'Understand traffic, pages, visitors, funnels, and performance with project-scoped analytics.', + href: `${base}/analytics/setup`, + cta: 'View analytics setup', + done: signals.hasAnalyticsEvents, + icon: BarChart3, + }, + { + id: 'errors', + title: 'Install the error tracking SDK', + description: + 'Capture application exceptions with stack traces, releases, and the request context needed to debug them.', + href: `${base}/errors/setup`, + cta: 'View error tracking setup', + done: signals.hasErrorGroups, + icon: ShieldAlert, + }, + { + id: 'domain', + title: 'Connect a custom domain', + description: + 'Give the project a production hostname and let Temps provision and renew its TLS certificate.', + href: `${base}/domains`, + cta: 'Manage domains', + done: signals.customDomainCount > 0, + icon: Globe, + }, + { + id: 'monitoring', + title: 'Add an uptime monitor', + description: + 'Continuously check the production endpoint and surface outages before users report them.', + href: `${base}/monitors`, + cta: 'Configure monitoring', + done: signals.monitorCount > 0, + icon: Activity, + }, + { + id: 'storage', + title: 'Link database or storage', + description: + 'Attach a managed service to this project so application data and deployment configuration stay together.', + href: `${base}/storage`, + cta: 'Open project storage', + done: signals.serviceCount > 0, + icon: Database, + }, + { + id: 'telemetry', + title: 'Set up OpenTelemetry', + description: + 'Send distributed traces from this application to connect requests across services and deployments.', + href: `${base}/traces#traces-setup`, + cta: 'View OpenTelemetry setup', + done: signals.hasTelemetryTraces, + icon: Workflow, + }, + ] +} + +export function useProjectSetup(project: ProjectResponse) { + const analyticsQuery = useQuery({ + ...hasAnalyticsEventsOptions({ path: { project_id: project.id } }), + }) + const errorsQuery = useQuery({ + ...hasErrorGroupsOptions({ path: { project_id: project.id } }), + }) + const domainsQuery = useQuery({ + ...listCustomDomainsForProjectOptions({ + path: { project_id: project.id }, + }), + }) + const monitorsQuery = useQuery({ + ...listMonitorsOptions({ path: { project_id: project.id } }), + }) + const servicesQuery = useQuery({ + ...listProjectServicesOptions({ path: { project_id: project.id } }), + }) + const telemetryQuery = useQuery({ + ...queryTraceSummariesOptions({ + query: { + project_id: project.id, + limit: 1, + include_total: false, + }, + }), + }) + + const steps = buildProjectSetupSteps(project.slug, { + hasAnalyticsEvents: !!analyticsQuery.data?.has_events, + hasErrorGroups: !!errorsQuery.data?.has_error_groups, + customDomainCount: domainsQuery.data?.domains?.length ?? 0, + monitorCount: monitorsQuery.data?.length ?? 0, + serviceCount: servicesQuery.data?.length ?? 0, + hasTelemetryTraces: (telemetryQuery.data?.data?.length ?? 0) > 0, + }) + const completedCount = steps.filter((step) => step.done).length + const totalCount = steps.length + + return { + steps, + completedCount, + totalCount, + percent: Math.round((completedCount / totalCount) * 100), + nextStep: steps.find((step) => !step.done), + allDone: completedCount === totalCount, + isLoading: + analyticsQuery.isLoading || + errorsQuery.isLoading || + domainsQuery.isLoading || + monitorsQuery.isLoading || + servicesQuery.isLoading || + telemetryQuery.isLoading, + isError: + analyticsQuery.isError || + errorsQuery.isError || + domainsQuery.isError || + monitorsQuery.isError || + servicesQuery.isError || + telemetryQuery.isError, + refetch: () => + Promise.all([ + analyticsQuery.refetch(), + errorsQuery.refetch(), + domainsQuery.refetch(), + monitorsQuery.refetch(), + servicesQuery.refetch(), + telemetryQuery.refetch(), + ]), + } +} diff --git a/web/src/lib/drop-archive.ts b/web/src/lib/drop-archive.ts index a19eec62e..d44daf5b0 100644 --- a/web/src/lib/drop-archive.ts +++ b/web/src/lib/drop-archive.ts @@ -94,13 +94,27 @@ function writeU32(view: DataView, offset: number, value: number) { view.setUint32(offset, value >>> 0, true) } -function crc32(bytes: Uint8Array): number { +function throwIfAborted(signal?: AbortSignal) { + if (signal?.aborted) { + throw new DOMException('Preset detection was cancelled', 'AbortError') + } +} + +async function crc32(bytes: Uint8Array, signal?: AbortSignal): Promise { let crc = 0xffffffff - for (const byte of bytes) { - crc ^= byte - for (let bit = 0; bit < 8; bit += 1) { - crc = (crc >>> 1) ^ (0xedb88320 & -(crc & 1)) + const yieldEveryBytes = 2 * 1024 * 1024 + for (let offset = 0; offset < bytes.length; offset += yieldEveryBytes) { + throwIfAborted(signal) + const end = Math.min(offset + yieldEveryBytes, bytes.length) + for (let index = offset; index < end; index += 1) { + crc ^= bytes[index] + for (let bit = 0; bit < 8; bit += 1) { + crc = (crc >>> 1) ^ (0xedb88320 & -(crc & 1)) + } } + // Keep the clear button responsive while a large folder is checksummed. + if (end < bytes.length) + await new Promise((resolve) => setTimeout(resolve, 0)) } return (crc ^ 0xffffffff) >>> 0 } @@ -117,7 +131,8 @@ function dosTimestamp(date: Date): { date: number; time: number } { } async function createStoredZip( - entries: Array<{ path: string; contents: Blob }> + entries: Array<{ path: string; contents: Blob }>, + signal?: AbortSignal ): Promise { const localParts: BlobPart[] = [] const centralParts: BlobPart[] = [] @@ -126,9 +141,10 @@ async function createStoredZip( const now = dosTimestamp(new Date()) for (const entry of entries) { + throwIfAborted(signal) const name = textEncoder.encode(cleanPath(entry.path)) const contents = new Uint8Array(await entry.contents.arrayBuffer()) - const checksum = crc32(contents) + const checksum = await crc32(contents, signal) const localHeader = new ArrayBuffer(30) const localView = new DataView(localHeader) @@ -204,8 +220,10 @@ function redirectPage(target: string): Blob { export async function prepareDrop( rawFiles: DropFile[], - selectedRootPage?: string + selectedRootPage?: string, + signal?: AbortSignal ): Promise { + throwIfAborted(signal) if (rawFiles.length === 1 && isDropArchive(rawFiles[0].file.name)) { if (rawFiles[0].file.size > 500 * 1024 * 1024) { throw new Error('Drop exceeds the 500 MB upload limit') @@ -238,7 +256,7 @@ export async function prepareDrop( } } - const archive = await createStoredZip(entries) + const archive = await createStoredZip(entries, signal) return { file: new File([archive], 'temps-drop.zip', { type: 'application/zip' }), fileCount: files.length, diff --git a/web/src/lib/drop-environment-variables.test.ts b/web/src/lib/drop-environment-variables.test.ts new file mode 100644 index 000000000..8fa7a86a1 --- /dev/null +++ b/web/src/lib/drop-environment-variables.test.ts @@ -0,0 +1,37 @@ +import { describe, expect, test } from 'bun:test' +import { + serializeDropEnvironmentVariables, + validateDropEnvironmentVariables, +} from './drop-environment-variables' + +const variable = (key: string, value = '') => ({ id: key, key, value }) + +describe('drop environment variables', () => { + test('accepts empty values and serializes trimmed keys', () => { + const variables = [ + variable(' API_URL ', 'https://example.com'), + variable('EMPTY'), + ] + + expect(validateDropEnvironmentVariables(variables)).toBeNull() + expect(serializeDropEnvironmentVariables(variables)).toEqual([ + ['API_URL', 'https://example.com'], + ['EMPTY', ''], + ]) + }) + + test('rejects missing, invalid, and duplicate keys', () => { + expect(validateDropEnvironmentVariables([variable('')])).toContain( + 'needs a key' + ) + expect(validateDropEnvironmentVariables([variable('1INVALID')])).toContain( + 'not a valid' + ) + expect( + validateDropEnvironmentVariables([ + variable('API_URL'), + variable('API_URL'), + ]) + ).toContain('more than once') + }) +}) diff --git a/web/src/lib/drop-environment-variables.ts b/web/src/lib/drop-environment-variables.ts new file mode 100644 index 000000000..5b3cb2010 --- /dev/null +++ b/web/src/lib/drop-environment-variables.ts @@ -0,0 +1,31 @@ +export interface DropEnvironmentVariable { + id: string + key: string + value: string +} + +const ENVIRONMENT_VARIABLE_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/ + +export function validateDropEnvironmentVariables( + variables: DropEnvironmentVariable[] +): string | null { + const seen = new Set() + + for (const variable of variables) { + const key = variable.key.trim() + if (!key) return 'Every environment variable needs a key' + if (!ENVIRONMENT_VARIABLE_KEY.test(key)) { + return `${key} is not a valid environment variable key` + } + if (seen.has(key)) return `${key} is defined more than once` + seen.add(key) + } + + return null +} + +export function serializeDropEnvironmentVariables( + variables: DropEnvironmentVariable[] +): Array<[string, string]> { + return variables.map((variable) => [variable.key.trim(), variable.value]) +} diff --git a/web/src/lib/drop-preset-detection.test.ts b/web/src/lib/drop-preset-detection.test.ts new file mode 100644 index 000000000..8aca31b08 --- /dev/null +++ b/web/src/lib/drop-preset-detection.test.ts @@ -0,0 +1,66 @@ +import { describe, expect, test } from 'bun:test' +import { prepareAndInspectDrop } from './drop-preset-detection' + +describe('prepareAndInspectDrop', () => { + test('packages selected files and returns the detected preset', async () => { + let inspectedArchive: File | undefined + const result = await prepareAndInspectDrop( + [ + { + file: new File(['

Hello

'], 'index.html'), + path: 'index.html', + }, + ], + undefined, + async (archive) => { + inspectedArchive = archive + return { + suggestedName: 'hello', + candidates: [ + { + confidence: 'high', + directory: '.', + isStatic: true, + label: 'Static site', + preset: 'static', + reason: 'Found index.html', + }, + ], + } + } + ) + + expect(inspectedArchive).toBeInstanceOf(File) + expect(result.archive).toBe(inspectedArchive!) + expect(result.inspection.candidates[0]?.preset).toBe('static') + }) + + test('rejects an inspection with no deployable candidates', async () => { + await expect( + prepareAndInspectDrop( + [{ file: new File(['{}'], 'package.json'), path: 'package.json' }], + undefined, + async () => ({ suggestedName: 'empty', candidates: [] }) + ) + ).rejects.toThrow('No deployable project preset was detected') + }) + + test('cancels before uploading when the user clears the selection', async () => { + const controller = new AbortController() + controller.abort() + let inspectCalled = false + + await expect( + prepareAndInspectDrop( + [{ file: new File(['{}'], 'package.json'), path: 'package.json' }], + undefined, + async () => { + inspectCalled = true + return { suggestedName: 'cancelled', candidates: [] } + }, + { signal: controller.signal } + ) + ).rejects.toMatchObject({ name: 'AbortError' }) + expect(inspectCalled).toBe(false) + }) +}) diff --git a/web/src/lib/drop-preset-detection.ts b/web/src/lib/drop-preset-detection.ts new file mode 100644 index 000000000..83719595e --- /dev/null +++ b/web/src/lib/drop-preset-detection.ts @@ -0,0 +1,32 @@ +import type { DropInspectionResponse } from '@/api/client' +import { prepareDrop, type DropFile } from '@/lib/drop-archive' + +export interface PreparedDropInspection { + archive: File + inspection: DropInspectionResponse +} + +interface PrepareAndInspectOptions { + signal?: AbortSignal + onArchivePrepared?: (archive: File) => void +} + +export async function prepareAndInspectDrop( + files: DropFile[], + rootPage: string | undefined, + inspect: (archive: File) => Promise, + options: PrepareAndInspectOptions = {} +): Promise { + const prepared = await prepareDrop(files, rootPage, options.signal) + options.onArchivePrepared?.(prepared.file) + const inspection = await inspect(prepared.file) + + if (!inspection) { + throw new Error('Preset detection returned no result') + } + if (inspection.candidates.length === 0) { + throw new Error('No deployable project preset was detected') + } + + return { archive: prepared.file, inspection } +} diff --git a/web/src/lib/password-policy.test.ts b/web/src/lib/password-policy.test.ts new file mode 100644 index 000000000..61632471b --- /dev/null +++ b/web/src/lib/password-policy.test.ts @@ -0,0 +1,44 @@ +import { describe, expect, test } from 'bun:test' +import { + PASSWORD_REQUIREMENTS, + generateCompliantPassword, + passwordRequirementResults, + passwordSchema, +} from './password-policy' + +describe('password policy', () => { + test('matches every server-side password requirement', () => { + expect(PASSWORD_REQUIREMENTS.map((requirement) => requirement.id)).toEqual([ + 'length', + 'uppercase', + 'lowercase', + 'number', + 'special', + ]) + expect(passwordSchema.safeParse('ValidPass1!').success).toBe(true) + }) + + test('reports unmet requirements independently', () => { + const results = passwordRequirementResults('password') + expect( + results.filter((result) => result.met).map((result) => result.id) + ).toEqual(['length', 'lowercase']) + }) + + test('generates random passwords that meet the complete policy', () => { + const generated = Array.from({ length: 20 }, () => + generateCompliantPassword() + ) + + expect(generated.every((password) => password.length === 20)).toBe(true) + expect( + generated.every((password) => passwordSchema.safeParse(password).success) + ).toBe(true) + expect(new Set(generated).size).toBe(generated.length) + }) + + test('rejects generated password lengths outside the server limits', () => { + expect(() => generateCompliantPassword(7)).toThrow(RangeError) + expect(() => generateCompliantPassword(129)).toThrow(RangeError) + }) +}) diff --git a/web/src/lib/password-policy.ts b/web/src/lib/password-policy.ts new file mode 100644 index 000000000..d7ad846bb --- /dev/null +++ b/web/src/lib/password-policy.ts @@ -0,0 +1,91 @@ +import { z } from 'zod' + +export const PASSWORD_REQUIREMENTS = [ + { + id: 'length', + label: '8–128 characters', + test: (password: string) => password.length >= 8 && password.length <= 128, + }, + { + id: 'uppercase', + label: 'One uppercase letter', + test: (password: string) => /[A-Z]/.test(password), + }, + { + id: 'lowercase', + label: 'One lowercase letter', + test: (password: string) => /[a-z]/.test(password), + }, + { + id: 'number', + label: 'One number', + test: (password: string) => /[0-9]/.test(password), + }, + { + id: 'special', + label: 'One special character', + test: (password: string) => /[^a-zA-Z0-9]/.test(password), + }, +] as const + +export const passwordSchema = z + .string() + .min(8, 'Password must be at least 8 characters long') + .max(128, 'Password must not exceed 128 characters') + .regex(/[A-Z]/, 'Password must contain at least one uppercase letter') + .regex(/[a-z]/, 'Password must contain at least one lowercase letter') + .regex(/[0-9]/, 'Password must contain at least one digit') + .regex(/[^a-zA-Z0-9]/, 'Password must contain at least one special character') + +export function passwordRequirementResults(password: string) { + return PASSWORD_REQUIREMENTS.map((requirement) => ({ + ...requirement, + met: requirement.test(password), + })) +} + +const PASSWORD_ALPHABETS = { + uppercase: 'ABCDEFGHJKLMNPQRSTUVWXYZ', + lowercase: 'abcdefghijkmnopqrstuvwxyz', + number: '23456789', + special: '!@#$%^&*_-+=', +} as const + +const PASSWORD_CHARACTERS = Object.values(PASSWORD_ALPHABETS).join('') + +function secureRandomIndex(length: number): number { + const maximum = Math.floor(256 / length) * length + const randomByte = new Uint8Array(1) + + do { + crypto.getRandomValues(randomByte) + } while (randomByte[0] >= maximum) + + return randomByte[0] % length +} + +/** Generate a copy-friendly password with every server-required character class. */ +export function generateCompliantPassword(length = 20): string { + if (length < 8 || length > 128) { + throw new RangeError('Password length must be between 8 and 128 characters') + } + + const characters = Object.values(PASSWORD_ALPHABETS).map( + (alphabet) => alphabet[secureRandomIndex(alphabet.length)] + ) + while (characters.length < length) { + characters.push( + PASSWORD_CHARACTERS[secureRandomIndex(PASSWORD_CHARACTERS.length)] + ) + } + + for (let index = characters.length - 1; index > 0; index -= 1) { + const swapIndex = secureRandomIndex(index + 1) + ;[characters[index], characters[swapIndex]] = [ + characters[swapIndex], + characters[index], + ] + } + + return characters.join('') +} diff --git a/web/src/lib/role-permissions.test.ts b/web/src/lib/role-permissions.test.ts new file mode 100644 index 000000000..ec5198d30 --- /dev/null +++ b/web/src/lib/role-permissions.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, test } from 'bun:test' +import type { PermissionInfo, RoleInfo } from '@/api/client' +import { + categoryLabel, + groupRolePermissions, + permissionAction, +} from './role-permissions' + +const permissions: PermissionInfo[] = [ + { name: 'projects:read', category: 'PROJECTS', description: 'View projects' }, + { name: 'users:manage', category: 'USERS', description: 'Manage users' }, + { + name: 'projects:create', + category: 'PROJECTS', + description: 'Create projects', + }, +] + +const role: RoleInfo = { + name: 'admin', + description: 'Administrator', + permissions: [ + 'users:manage', + 'projects:read', + 'projects:create', + 'projects:read', + ], +} + +describe('role permissions', () => { + test('groups every granted permission without dropping identifiers', () => { + const groups = groupRolePermissions(role, permissions) + expect(groups.map((group) => group.category)).toEqual(['projects', 'users']) + expect( + groups.flatMap((group) => group.permissions.map((item) => item.name)) + ).toEqual(['projects:read', 'projects:create', 'users:manage']) + }) + + test('formats categories and actions for display', () => { + expect(categoryLabel('api_keys')).toBe('Api Keys') + expect(permissionAction('notification_providers:create')).toBe('create') + }) +}) diff --git a/web/src/lib/role-permissions.ts b/web/src/lib/role-permissions.ts new file mode 100644 index 000000000..bf7f5d492 --- /dev/null +++ b/web/src/lib/role-permissions.ts @@ -0,0 +1,51 @@ +import type { PermissionInfo, RoleInfo } from '@/api/client' + +export type PermissionGroup = { + category: string + permissions: PermissionInfo[] +} + +export function groupRolePermissions( + role: RoleInfo | undefined, + availablePermissions: PermissionInfo[] +): PermissionGroup[] { + if (!role) return [] + + const permissionByName = new Map( + availablePermissions.map((permission) => [permission.name, permission]) + ) + const groups = new Map() + const seen = new Set() + + for (const name of role.permissions) { + if (seen.has(name)) continue + seen.add(name) + const permission = permissionByName.get(name) ?? { + name, + category: name.split(':')[0] || 'OTHER', + description: 'Permission for this resource', + } + const category = permission.category.toLowerCase() + const existing = groups.get(category) ?? [] + existing.push(permission) + groups.set(category, existing) + } + + return Array.from(groups, ([category, permissions]) => ({ + category, + permissions, + })).sort((left, right) => left.category.localeCompare(right.category)) +} + +export function permissionAction(permissionName: string): string { + const segments = permissionName.split(':') + const action = segments[segments.length - 1] ?? permissionName + return action.replace(/_/g, ' ') +} + +export function categoryLabel(category: string): string { + return category + .split(/[_-]/) + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(' ') +} diff --git a/web/src/pages/Account.tsx b/web/src/pages/Account.tsx index 2dc6477ea..bb88bd6d3 100644 --- a/web/src/pages/Account.tsx +++ b/web/src/pages/Account.tsx @@ -60,16 +60,14 @@ type FormValues = z.infer const passwordSchema = z .object({ current_password: z.string().min(1, 'Current password is required'), - new_password: z - .string() - .min(8, 'Password must be at least 8 characters'), + new_password: z.string().min(8, 'Password must be at least 8 characters'), confirm_password: z.string().min(1, 'Please confirm your new password'), mfa_code: z .string() .optional() .refine( (v) => !v || /^\d{6}$/.test(v) || v.length >= 8, - 'Enter a 6-digit TOTP code or a recovery code', + 'Enter a 6-digit TOTP code or a recovery code' ), revoke_other_sessions: z.boolean(), }) @@ -150,16 +148,18 @@ export function Account() { }, }) - const { mutate: changePassword, isPending: isChangingPassword } = useMutation({ - ...changePasswordSelfMutation(), - meta: { - errorTitle: 'Failed to change password', - }, - onSuccess: () => { - toast.success('Password changed successfully') - passwordForm.reset() - }, - }) + const { mutate: changePassword, isPending: isChangingPassword } = useMutation( + { + ...changePasswordSelfMutation(), + meta: { + errorTitle: 'Failed to change password', + }, + onSuccess: () => { + toast.success('Password changed successfully') + passwordForm.reset() + }, + } + ) const mfaForm = useForm({ resolver: zodResolver(mfaVerifySchema), @@ -300,7 +300,9 @@ export function Account() {
Role
- + {user.role} @@ -511,6 +513,25 @@ export function Account() { {mfaSetupData?.secret_key}
+ {mfaSetupData?.recovery_codes?.length ? ( +
+
Recovery codes
+

+ Save these somewhere secure before enabling MFA. Each code can + be used once. +

+
+ {mfaSetupData.recovery_codes.map((code) => ( + {code} + ))} +
+
+ ) : ( +

+ Recovery codes could not be prepared. Close this dialog and + restart MFA setup. +

+ )}
- +
+

+ Create user +

+

+ Create login credentials, choose the platform role, and review + every permission before granting access. +

+
+
+
+ + + +
+ + + Account details + + +
+ ( + + Name + + + + + + )} + /> + ( + + Email + + + + + + )} + /> +
+ + ( + + Temporary password + +
+ + + + + + + Generate secure password + + + +
+
+ + The password must meet every requirement below. + + +
    + {PASSWORD_REQUIREMENTS.map((requirement, index) => { + const met = requirementResults[index]?.met ?? false + return ( +
  • + {met ? ( + + ) : ( + + )} +
    {requirement.label}
    +
  • + ) + })} +
+
+ )} + /> + + ( + +
+ + + +
+ + Require a new password at first sign-in + + + The temporary password only starts a protected + password-change session. The user cannot access the + platform until they choose a new password. + +
+
+
+ )} + /> +
+
+ + + + Role + + + ( + + + + {ROLE_OPTIONS.map((role) => ( + + ))} + + + + + )} + /> + + + + + + Team membership + + +
+ ( + + Team + + + Optional. Adds the user to the selected team after + creating their account. + + {teamsQuery.isError && ( +

+ Teams could not be loaded. You can still create the + user and add them from the Teams page later. +

+ )} + +
+ )} + /> + + ( + + Team role + + + { + TEAM_ROLE_OPTIONS.find( + (role) => role.value === selectedTeamRole + )?.description + } + + + + )} + /> +
+ + {selectedTeamId && ( +
+ Team membership and the platform role are separate. A User + still has all-project access from their platform role; + joining a team does not narrow those permissions. +
+ )} +
+
+ +
+ + +
+
+ + + + + {selectedRole === 'admin' ? 'Administrator' : 'User'} access + + + + + + + + + + ) +} diff --git a/web/src/pages/Drop.tsx b/web/src/pages/Drop.tsx index dacc86442..668677e7e 100644 --- a/web/src/pages/Drop.tsx +++ b/web/src/pages/Drop.tsx @@ -10,6 +10,9 @@ import { type ProjectResponse, } from '@/api/client' import { DropZone } from '@/components/drop/DropZone' +import { DropEnvironmentVariables } from '@/components/drop/DropEnvironmentVariables' +import { DetectedPresetCard } from '@/components/drop/DetectedPresetCard' +import { DetectedPresetGrid } from '@/components/drop/DetectedPresetGrid' import { PageContainer } from '@/components/layout/PageContainer' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' @@ -24,17 +27,29 @@ import { import { useBreadcrumbs } from '@/contexts/BreadcrumbContext' import { usePageTitle } from '@/hooks/usePageTitle' import { - formatDetectedProjectLabel, htmlRootCandidates, isDropArchive, - prepareDrop, type DropFile, } from '@/lib/drop-archive' import { dropErrorMessage, inferredProjectName } from '@/lib/drop-files' +import { + serializeDropEnvironmentVariables, + validateDropEnvironmentVariables, + type DropEnvironmentVariable, +} from '@/lib/drop-environment-variables' +import { prepareAndInspectDrop } from '@/lib/drop-preset-detection' import { ensureDropProjectName } from '@/lib/drop-project-name' import { cn } from '@/lib/utils' -import { ArrowRight, Check, Loader2, RotateCcw, UploadCloud } from 'lucide-react' -import { useEffect, useMemo, useState } from 'react' +import { AnimatePresence, motion, useReducedMotion } from 'framer-motion' +import { + ArrowRight, + Check, + Loader2, + RotateCcw, + UploadCloud, + X, +} from 'lucide-react' +import { useEffect, useMemo, useRef, useState } from 'react' import { Link, useNavigate } from 'react-router' type DropStage = @@ -46,7 +61,11 @@ type DropStage = | 'deploying' | 'done' -function stageLabel(stage: DropStage): string { +function stageLabel( + stage: DropStage, + detectedLabel?: string, + hasFiles = false +): string { switch (stage) { case 'packing': return 'Packing files locally' @@ -61,12 +80,14 @@ function stageLabel(stage: DropStage): string { case 'done': return 'Deployment started' default: - return 'Ready to deploy' + if (detectedLabel) return `Deploy ${detectedLabel}` + return hasFiles ? 'Retry preset detection' : 'Select project files' } } export function Drop() { const navigate = useNavigate() + const reduceMotion = useReducedMotion() const { setBreadcrumbs } = useBreadcrumbs() const [files, setFiles] = useState([]) const [projectName, setProjectName] = useState('') @@ -83,6 +104,11 @@ export function Drop() { null ) const [selectedCandidateIndex, setSelectedCandidateIndex] = useState('0') + const [environmentVariables, setEnvironmentVariables] = useState< + DropEnvironmentVariable[] + >([]) + const detectionRunRef = useRef(0) + const detectionAbortRef = useRef(null) usePageTitle('Drop') useEffect(() => { @@ -91,6 +117,12 @@ export function Drop() { { label: 'Drop' }, ]) }, [setBreadcrumbs]) + useEffect( + () => () => { + detectionAbortRef.current?.abort() + }, + [] + ) const normalizedCandidates = useMemo(() => htmlRootCandidates(files), [files]) const hasRootIndex = normalizedCandidates.some( @@ -98,8 +130,70 @@ export function Drop() { ) const isArchive = files.length === 1 && isDropArchive(files[0].file.name) const isBusy = !['idle', 'done'].includes(stage) + const selectedCandidate = + inspection?.candidates[Number(selectedCandidateIndex)] + const transition = reduceMotion + ? { duration: 0 } + : { duration: 0.32, ease: [0.22, 1, 0.36, 1] as const } + + const inspectArchive = async (archive: File, signal?: AbortSignal) => { + const response = await inspectDropArchive({ + throwOnError: true, + body: { file: archive }, + signal, + }) + return response.data + } + + async function detectSelection( + nextFiles: DropFile[], + nextRootPage: string, + runId: number + ) { + detectionAbortRef.current?.abort() + const controller = new AbortController() + detectionAbortRef.current = controller + try { + setStage('packing') + const result = await prepareAndInspectDrop( + nextFiles, + nextRootPage || undefined, + (archive) => inspectArchive(archive, controller.signal), + { + signal: controller.signal, + onArchivePrepared: (archive) => { + if (detectionRunRef.current !== runId) return + setPreparedArchive(archive) + setStage('detecting') + }, + } + ) + if (detectionRunRef.current !== runId) return + + setPreparedArchive(result.archive) + setInspection(result.inspection) + setSelectedCandidateIndex('0') + if (!nameWasEdited) { + setProjectName(ensureDropProjectName(result.inspection.suggestedName)) + } + setStage('idle') + } catch (caught) { + if (detectionRunRef.current !== runId) return + setError(dropErrorMessage(caught)) + setPreparedArchive(null) + setInspection(null) + setStage('idle') + } finally { + if (detectionAbortRef.current === controller) { + detectionAbortRef.current = null + } + } + } const setSelection = (nextFiles: DropFile[]) => { + const runId = ++detectionRunRef.current + detectionAbortRef.current?.abort() + detectionAbortRef.current = null setFiles(nextFiles) setError(null) setProject(null) @@ -112,13 +206,20 @@ export function Drop() { const hasIndex = candidates.some( (path) => path.toLowerCase() === 'index.html' ) - setRootPage(hasIndex ? '' : candidates[0] || '') + const nextRootPage = hasIndex ? '' : candidates[0] || '' + setRootPage(nextRootPage) if (!nameWasEdited) { setProjectName(ensureDropProjectName(inferredProjectName(nextFiles))) } + if (nextFiles.length > 0) { + void detectSelection(nextFiles, nextRootPage, runId) + } } const reset = () => { + detectionRunRef.current += 1 + detectionAbortRef.current?.abort() + detectionAbortRef.current = null setFiles([]) setProjectName('') setNameWasEdited(false) @@ -130,6 +231,7 @@ export function Drop() { setPreparedArchive(null) setInspection(null) setSelectedCandidateIndex('0') + setEnvironmentVariables([]) } const deploy = async () => { @@ -141,27 +243,18 @@ export function Drop() { setProjectName(normalizedProjectName) setError(null) try { - let archive = preparedArchive - let detected = inspection + const archive = preparedArchive + const detected = inspection if (!archive || !detected) { - setStage('packing') - const prepared = await prepareDrop(files, rootPage || undefined) - archive = prepared.file - setPreparedArchive(archive) + const runId = ++detectionRunRef.current + await detectSelection(files, rootPage, runId) + return + } - setStage('detecting') - const inspectResponse = await inspectDropArchive({ - throwOnError: true, - body: { file: archive }, - }) - detected = inspectResponse.data - if (!detected) throw new Error('Preset detection returned no result') - setInspection(detected) - setSelectedCandidateIndex('0') - if (!nameWasEdited) { - setProjectName(ensureDropProjectName(detected.suggestedName)) - } - setStage('idle') + const environmentVariableError = + validateDropEnvironmentVariables(environmentVariables) + if (environmentVariableError) { + setError(environmentVariableError) return } @@ -183,6 +276,8 @@ export function Drop() { project_type: candidate.isStatic ? 'static' : 'server', automatic_deploy: false, storage_service_ids: [], + environment_variables: + serializeDropEnvironmentVariables(environmentVariables), }, }) createdProject = projectResult.data @@ -332,161 +427,200 @@ export function Drop() {
-
- - - + +

+ Failed setup is rolled back automatically. +

+ + )} +
- ) } diff --git a/web/src/pages/Login.tsx b/web/src/pages/Login.tsx index a176d76ae..9a89c187a 100644 --- a/web/src/pages/Login.tsx +++ b/web/src/pages/Login.tsx @@ -21,25 +21,35 @@ import { consumeReturnTo } from '@/lib/return-to' * through to a generic message. */ const OIDC_ERROR_MESSAGES: Record = { - idp_error: 'Your identity provider rejected the login. Check that your account is allowed.', - idp_unreachable: "We couldn't reach your identity provider. Try again in a moment.", - idp_rejected_code: 'Your identity provider rejected the authorization code. Try signing in again.', - state_invalid: 'This SSO link is invalid or has already been used. Start sign-in again.', + idp_error: + 'Your identity provider rejected the login. Check that your account is allowed.', + idp_unreachable: + "We couldn't reach your identity provider. Try again in a moment.", + idp_rejected_code: + 'Your identity provider rejected the authorization code. Try signing in again.', + state_invalid: + 'This SSO link is invalid or has already been used. Start sign-in again.', state_expired: 'This SSO link expired. Start sign-in again.', - id_token_invalid: 'Your identity provider returned an invalid token. Contact your administrator.', + id_token_invalid: + 'Your identity provider returned an invalid token. Contact your administrator.', callback_invalid: 'The SSO callback was malformed. Start sign-in again.', - email_missing: 'Your identity provider did not return an email address. Grant the "email" scope and try again.', - email_not_verified: 'Your identity provider has not confirmed your email. Verify it at the IdP, then try again.', - user_not_provisioned: 'No Temps account exists for this email. Ask an administrator to create one.', + email_missing: + 'Your identity provider did not return an email address. Grant the "email" scope and try again.', + email_not_verified: + 'Your identity provider has not confirmed your email. Verify it at the IdP, then try again.', + user_not_provisioned: + 'No Temps account exists for this email. Ask an administrator to create one.', provider_disabled: 'This SSO provider is currently disabled.', provider_not_found: 'The SSO provider configuration was not found.', - no_provider_configured: 'No SSO provider is configured on this Temps instance.', + no_provider_configured: + 'No SSO provider is configured on this Temps instance.', issuer_invalid: 'The SSO provider URL is invalid.', return_to_invalid: 'Invalid post-login redirect target.', role_invalid: 'The role assigned by the SSO provider is invalid.', role_mapping_not_found: 'No matching SSO role mapping.', provider_conflict: 'SSO provider configuration conflict.', - internal_error: 'An internal error occurred while processing the SSO callback.', + internal_error: + 'An internal error occurred while processing the SSO callback.', } function oidcErrorMessage(reason: string | null): string { @@ -76,12 +86,26 @@ export const Login = () => { errorTitle: 'Login failed', }, onSuccess: async (data) => { + if (data.password_change_required) { + navigate('/auth/change-password', { replace: true }) + return + } + if (data.mfa_required) { toast.success('Please complete MFA verification') navigate('/mfa-verify') return } + if (data.mfa_enrollment_required && data.mfa_setup) { + toast.success('Set up multi-factor authentication to continue') + navigate('/auth/change-password', { + replace: true, + state: { mfaSetup: data.mfa_setup }, + }) + return + } + toast.success('Logged in successfully') await queryClient.invalidateQueries({ queryKey: ['getCurrentUser'] }) await refetch() @@ -134,7 +158,9 @@ export const Login = () => { onSubmit={handleSubmit} isLoading={isLoading || login.isPending} oidcProviders={emailStatus?.oidc_providers ?? []} - passwordResetAvailable={emailStatus?.password_reset_available ?? false} + passwordResetAvailable={ + emailStatus?.password_reset_available ?? false + } /> diff --git a/web/src/pages/ProjectDetail.tsx b/web/src/pages/ProjectDetail.tsx index 53640afe4..98f6c4caa 100644 --- a/web/src/pages/ProjectDetail.tsx +++ b/web/src/pages/ProjectDetail.tsx @@ -49,6 +49,7 @@ import Traces from './Traces' import LogsList from './LogsList' import Metrics from './Metrics' import { ProjectTour } from '@/components/project/ProjectTour' +import { ProjectSetup } from './ProjectSetup' import { ProjectAgentActivity } from './AiGateway' import { AutofixerPage } from '@/components/autofixer/AutofixerPage' import { AutofixRedirect } from '@/components/autofixer/AutofixRedirect' @@ -347,6 +348,7 @@ export function ProjectDetail() { /> } /> + } /> } diff --git a/web/src/pages/ProjectDrop.tsx b/web/src/pages/ProjectDrop.tsx index 487412f7c..734b499f1 100644 --- a/web/src/pages/ProjectDrop.tsx +++ b/web/src/pages/ProjectDrop.tsx @@ -8,6 +8,8 @@ import { type EnvironmentResponse, type ProjectResponse, } from '@/api/client' +import { DetectedPresetCard } from '@/components/drop/DetectedPresetCard' +import { DetectedPresetGrid } from '@/components/drop/DetectedPresetGrid' import { DropZone } from '@/components/drop/DropZone' import { Button } from '@/components/ui/button' import { Label } from '@/components/ui/label' @@ -20,21 +22,26 @@ import { } from '@/components/ui/select' import { usePageTitle } from '@/hooks/usePageTitle' import { - formatDetectedProjectLabel, htmlRootCandidates, isDropArchive, - prepareDrop, type DropFile, } from '@/lib/drop-archive' import { dropErrorMessage } from '@/lib/drop-files' +import { prepareAndInspectDrop } from '@/lib/drop-preset-detection' import { cn } from '@/lib/utils' -import { Loader2, UploadCloud } from 'lucide-react' -import { useEffect, useMemo, useState } from 'react' +import { AnimatePresence, motion, useReducedMotion } from 'framer-motion' +import { Loader2, UploadCloud, X } from 'lucide-react' +import { useEffect, useMemo, useRef, useState } from 'react' import { useNavigate } from 'react-router' -type Stage = 'idle' | 'packing' | 'detecting' | 'saving' | 'uploading' | 'deploying' +type Stage = + 'idle' | 'packing' | 'detecting' | 'saving' | 'uploading' | 'deploying' -function stageLabel(stage: Stage, detected: boolean): string { +function stageLabel( + stage: Stage, + detectedLabel?: string, + hasFiles = false +): string { switch (stage) { case 'packing': return 'Packing files locally' @@ -47,7 +54,8 @@ function stageLabel(stage: Stage, detected: boolean): string { case 'deploying': return 'Starting deployment' default: - return detected ? 'Deploy' : 'Detect preset' + if (detectedLabel) return `Deploy ${detectedLabel}` + return hasFiles ? 'Retry preset detection' : 'Select project files' } } @@ -70,6 +78,7 @@ function stageLabel(stage: Stage, detected: boolean): string { */ export function ProjectDrop({ project }: { project: ProjectResponse }) { const navigate = useNavigate() + const reduceMotion = useReducedMotion() const [files, setFiles] = useState([]) const [rootPage, setRootPage] = useState('') const [stage, setStage] = useState('idle') @@ -81,6 +90,8 @@ export function ProjectDrop({ project }: { project: ProjectResponse }) { const [candidateIndex, setCandidateIndex] = useState('0') const [environments, setEnvironments] = useState([]) const [environmentId, setEnvironmentId] = useState('') + const detectionRunRef = useRef(0) + const detectionAbortRef = useRef(null) usePageTitle(`Upload source · ${project.name}`) @@ -89,6 +100,9 @@ export function ProjectDrop({ project }: { project: ProjectResponse }) { const hasRootIndex = htmlPages.some((p) => p.toLowerCase() === 'index.html') const isArchive = files.length === 1 && isDropArchive(files[0].file.name) const candidate = inspection?.candidates[Number(candidateIndex)] + const transition = reduceMotion + ? { duration: 0 } + : { duration: 0.32, ease: [0.22, 1, 0.36, 1] as const } // Environments are needed before the first deploy; production is the sane // default so the common case is zero clicks. @@ -113,19 +127,71 @@ export function ProjectDrop({ project }: { project: ProjectResponse }) { } }, [project.id]) - // Once detection returns, prefer the candidate matching the project's current - // build directory — a repeat upload of the same app should not silently - // switch which directory gets built. - useEffect(() => { - if (!inspection) return - const current = (project.directory || '.').replace(/^\.\/+/, '') || '.' - const match = inspection.candidates.findIndex( - (c) => (c.directory || '.') === current - ) - setCandidateIndex(String(match >= 0 ? match : 0)) - }, [inspection, project.directory]) + useEffect( + () => () => { + detectionAbortRef.current?.abort() + }, + [] + ) + + const inspectArchive = async (archive: File, signal?: AbortSignal) => { + const response = await inspectDropArchive({ + throwOnError: true, + body: { file: archive }, + signal, + }) + return response.data + } + + async function detectSelection( + nextFiles: DropFile[], + nextRootPage: string, + runId: number + ) { + detectionAbortRef.current?.abort() + const controller = new AbortController() + detectionAbortRef.current = controller + try { + setStage('packing') + const result = await prepareAndInspectDrop( + nextFiles, + nextRootPage || undefined, + (archive) => inspectArchive(archive, controller.signal), + { + signal: controller.signal, + onArchivePrepared: (archive) => { + if (detectionRunRef.current !== runId) return + setPreparedArchive(archive) + setStage('detecting') + }, + } + ) + if (detectionRunRef.current !== runId) return + setPreparedArchive(result.archive) + setInspection(result.inspection) + const current = (project.directory || '.').replace(/^\.\/+/, '') || '.' + const match = result.inspection.candidates.findIndex( + (candidate) => (candidate.directory || '.') === current + ) + setCandidateIndex(String(match >= 0 ? match : 0)) + setStage('idle') + } catch (caught) { + if (detectionRunRef.current !== runId) return + setError(dropErrorMessage(caught)) + setPreparedArchive(null) + setInspection(null) + setStage('idle') + } finally { + if (detectionAbortRef.current === controller) { + detectionAbortRef.current = null + } + } + } const select = (next: DropFile[]) => { + const runId = ++detectionRunRef.current + detectionAbortRef.current?.abort() + detectionAbortRef.current = null setFiles(next) setError(null) setPreparedArchive(null) @@ -134,37 +200,33 @@ export function ProjectDrop({ project }: { project: ProjectResponse }) { setStage('idle') const candidates = htmlRootCandidates(next) const hasIndex = candidates.some((p) => p.toLowerCase() === 'index.html') - setRootPage(hasIndex ? '' : candidates[0] || '') + const nextRootPage = hasIndex ? '' : candidates[0] || '' + setRootPage(nextRootPage) + if (next.length > 0) { + void detectSelection(next, nextRootPage, runId) + } } const run = async () => { if (files.length === 0 || isBusy || !environmentId) return setError(null) try { - // First press packs + detects and stops, so the user can confirm the - // detected directory before anything is written. if (!preparedArchive || !inspection) { - setStage('packing') - const prepared = await prepareDrop(files, rootPage || undefined) - setPreparedArchive(prepared.file) - - setStage('detecting') - const response = await inspectDropArchive({ - throwOnError: true, - body: { file: prepared.file }, - }) - if (!response.data) throw new Error('Preset detection returned no result') - setInspection(response.data) - setStage('idle') + const runId = ++detectionRunRef.current + await detectSelection(files, rootPage, runId) return } if (!candidate) throw new Error('Choose a detected project') // Only persist directory/preset, and only when they actually changed. - const currentDirectory = (project.directory || '.').replace(/^\.\/+/, '') || '.' + const currentDirectory = + (project.directory || '.').replace(/^\.\/+/, '') || '.' const nextDirectory = candidate.directory || '.' - if (nextDirectory !== currentDirectory || candidate.preset !== project.preset) { + if ( + nextDirectory !== currentDirectory || + candidate.preset !== project.preset + ) { setStage('saving') await updateProjectSettings({ throwOnError: true, @@ -236,144 +298,179 @@ export function ProjectDrop({ project }: { project: ProjectResponse }) {

-
- - - + + + )} +
) diff --git a/web/src/pages/ProjectSetup.tsx b/web/src/pages/ProjectSetup.tsx new file mode 100644 index 000000000..4a24fc184 --- /dev/null +++ b/web/src/pages/ProjectSetup.tsx @@ -0,0 +1,226 @@ +import type { ProjectResponse } from '@/api/client' +import { ErrorAlert } from '@/components/utils/ErrorAlert' +import { Button } from '@/components/ui/button' +import { Card, CardContent } from '@/components/ui/card' +import { Skeleton } from '@/components/ui/skeleton' +import { useProjectSetup } from '@/hooks/useProjectSetup' +import { usePageTitle } from '@/hooks/usePageTitle' +import { cn } from '@/lib/utils' +import { + ArrowRight, + BadgeCheck, + Check, + CheckCircle2, + Sparkles, +} from 'lucide-react' +import { Link } from 'react-router' + +export function ProjectSetup({ project }: { project: ProjectResponse }) { + const setup = useProjectSetup(project) + usePageTitle(`${project.name} setup`) + + if (setup.isLoading) { + return + } + + if (setup.isError) { + return ( +
+ setup.refetch()} + /> +
+ ) + } + + return ( +
+
+
+
+ + Production readiness +
+

+ Project setup +

+

+ Connect the pieces that make {project.name} observable, reachable, + and ready to operate in production. +

+
+
+ + {setup.completedCount} + + + / {setup.totalCount} complete + +
+
+ + + +
+
+ {setup.allDone ? ( +
+
+ +
+
+

+ Setup complete +

+

+ This project is production-ready +

+

+ Every recommended project integration is connected and + reporting. +

+
+
+ ) : ( +
+
+ +
+
+

+ Recommended next step +

+

+ {setup.nextStep?.title} +

+

+ {setup.nextStep?.description} +

+
+
+ )} + + {setup.nextStep && ( + + )} +
+ +
+
+
+
+ + {setup.percent}% + +
+
+ + + +
+
+

All project setup items

+

+ Completed items remain available so you can revisit their + configuration at any time. +

+
+ +
+ {setup.steps.map((step, index) => { + const Icon = step.icon + return ( + +
+
+ {step.done ? ( + + ) : ( + + )} +
+ + {String(index + 1).padStart(2, '0')} + +
+ +
+
+

{step.title}

+ {step.done && ( + + Complete + + )} +
+

+ {step.description} +

+
+ + + {step.done ? 'Review configuration' : step.cta} + + + + ) + })} +
+
+
+ ) +} + +function ProjectSetupSkeleton() { + return ( +
+
+ + + +
+ +
+ {Array.from({ length: 6 }).map((_, index) => ( + + ))} +
+
+ ) +} diff --git a/web/src/pages/RequiredPasswordChange.tsx b/web/src/pages/RequiredPasswordChange.tsx new file mode 100644 index 000000000..c0d3ff6ff --- /dev/null +++ b/web/src/pages/RequiredPasswordChange.tsx @@ -0,0 +1,300 @@ +import { + changeRequiredPasswordMutation, + verifyMfaChallengeMutation, +} from '@/api/client/@tanstack/react-query.gen' +import type { MfaSetupResponse } from '@/api/client' +import { Button } from '@/components/ui/button' +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@/components/ui/card' +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@/components/ui/form' +import { Input } from '@/components/ui/input' +import { usePageTitle } from '@/hooks/usePageTitle' +import { + PASSWORD_REQUIREMENTS, + passwordRequirementResults, + passwordSchema, +} from '@/lib/password-policy' +import { zodResolver } from '@hookform/resolvers/zod' +import { useMutation } from '@tanstack/react-query' +import { Check, Circle, Loader2 } from 'lucide-react' +import { useState } from 'react' +import { useForm } from 'react-hook-form' +import { useLocation, useNavigate } from 'react-router' +import { toast } from 'sonner' +import { z } from 'zod' + +const requiredPasswordChangeSchema = z + .object({ + newPassword: passwordSchema, + confirmPassword: z.string(), + }) + .refine((data) => data.newPassword === data.confirmPassword, { + message: 'Passwords do not match', + path: ['confirmPassword'], + }) + +type RequiredPasswordChangeFormData = z.infer< + typeof requiredPasswordChangeSchema +> + +const mfaCodeSchema = z.object({ + code: z.string().regex(/^\d{6}$/, 'Enter the 6-digit code'), +}) + +type MfaCodeFormData = z.infer + +export function RequiredPasswordChange() { + usePageTitle('Choose a new password') + const navigate = useNavigate() + const location = useLocation() + const resumedSetup = ( + location.state as { mfaSetup?: MfaSetupResponse } | null + )?.mfaSetup + const [mfaSetup, setMfaSetup] = useState( + resumedSetup ?? null + ) + const form = useForm({ + resolver: zodResolver(requiredPasswordChangeSchema), + defaultValues: { newPassword: '', confirmPassword: '' }, + }) + const newPassword = form.watch('newPassword') + const requirementResults = passwordRequirementResults(newPassword) + const mfaForm = useForm({ + resolver: zodResolver(mfaCodeSchema), + defaultValues: { code: '' }, + }) + + const changePassword = useMutation({ + ...changeRequiredPasswordMutation(), + meta: { errorTitle: 'Password change failed' }, + onSuccess: (data) => { + if (data.mfa_enrollment_required && data.mfa_setup) { + setMfaSetup(data.mfa_setup) + toast.success('Password changed. Set up MFA to continue.') + return + } + toast.success('Password changed. Log in with your new password.') + navigate('/', { replace: true }) + }, + }) + + const verifyMfa = useMutation({ + ...verifyMfaChallengeMutation(), + meta: { errorTitle: 'MFA verification failed' }, + onSuccess: () => { + toast.success('MFA enabled successfully') + navigate('/dashboard', { replace: true }) + }, + }) + + const handleSubmit = async (data: RequiredPasswordChangeFormData) => { + await changePassword.mutateAsync({ + body: { new_password: data.newPassword }, + }) + } + + if (mfaSetup) { + return ( +
+ + + Secure your administrator account + + Scan this code with an authenticator app, save the recovery codes, + then enter the current 6-digit code. + + + +
+ QR code for multi-factor authentication +
+
+
Manual setup key
+ + {mfaSetup.secret_key} + +
+ {mfaSetup.recovery_codes.length > 0 ? ( +
+
Recovery codes
+

+ Store these somewhere safe. Each code can be used once. +

+
+ {mfaSetup.recovery_codes.map((code) => ( + {code} + ))} +
+
+ ) : ( +

+ Recovery codes could not be prepared. Log in again to restart + MFA setup before enabling it. +

+ )} +
+ + verifyMfa.mutate({ body: data }) + )} + className="space-y-4" + > + ( + + Verification code + + + + + + )} + /> + + + +
+
+
+ ) + } + + return ( +
+
+
+ Temps logo +
Temps
+
+ + + + + Choose a new password + + + Your administrator requires you to replace the temporary password + before accessing Temps. + + + +
+ + ( + + New password + + + + + Meet every requirement below. + + +
    + {PASSWORD_REQUIREMENTS.map((requirement, index) => { + const met = requirementResults[index]?.met ?? false + return ( +
  • + {met ? ( + + ) : ( + + )} +
    {requirement.label}
    +
  • + ) + })} +
+
+ )} + /> + ( + + Confirm new password + + + + + + )} + /> + + + +
+
+
+
+ ) +} diff --git a/web/src/pages/ResetPassword.tsx b/web/src/pages/ResetPassword.tsx index 3260d8ef8..39893fb81 100644 --- a/web/src/pages/ResetPassword.tsx +++ b/web/src/pages/ResetPassword.tsx @@ -25,24 +25,11 @@ import { Link, useNavigate, useSearchParams } from 'react-router' import { toast } from 'sonner' import { z } from 'zod' import { usePageTitle } from '@/hooks/usePageTitle' +import { passwordSchema } from '@/lib/password-policy' -// Mirrors `validate_password_complexity` in -// temps-auth/src/auth_service.rs. Kept in sync so the user gets inline -// feedback instead of a round-trip 400. The server remains the source -// of truth and re-validates. const resetPasswordSchema = z .object({ - newPassword: z - .string() - .min(8, 'Password must be at least 8 characters long') - .max(128, 'Password must not exceed 128 characters') - .regex(/[A-Z]/, 'Password must contain at least one uppercase letter') - .regex(/[a-z]/, 'Password must contain at least one lowercase letter') - .regex(/[0-9]/, 'Password must contain at least one digit') - .regex( - /[^a-zA-Z0-9]/, - 'Password must contain at least one special character', - ), + newPassword: passwordSchema, confirmPassword: z.string(), }) .refine((data) => data.newPassword === data.confirmPassword, { diff --git a/web/src/pages/Users.tsx b/web/src/pages/Users.tsx index eb9ceaf1e..6a33735f9 100644 --- a/web/src/pages/Users.tsx +++ b/web/src/pages/Users.tsx @@ -6,6 +6,7 @@ import { useKeyboardShortcut } from '@/hooks/useKeyboardShortcut' import { usePageTitle } from '@/hooks/usePageTitle' import { useEffect, useState } from 'react' import { UserEditDialog } from '@/components/users/UserEditDialog' +import { useNavigate } from 'react-router' export function Users() { const { setBreadcrumbs } = useBreadcrumbs() @@ -14,7 +15,7 @@ export function Users() { name: string email: string } | null>(null) - const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false) + const navigate = useNavigate() const { data: users, @@ -34,7 +35,7 @@ export function Users() { useKeyboardShortcut({ key: 'n', - callback: () => setIsCreateDialogOpen(true), + callback: () => navigate('/settings/users/new'), }) usePageTitle('Users') @@ -47,8 +48,6 @@ export function Users() { isLoading={isLoading} reloadUsers={refetch} onEditUser={setSelectedUser} - isCreateDialogOpen={isCreateDialogOpen} - onCreateDialogOpenChange={setIsCreateDialogOpen} />
{selectedUser && ( From 8d79d40592a0106901d3bb9d8cba34913476947e Mon Sep 17 00:00:00 2001 From: David Viejo Date: Tue, 4 Aug 2026 22:25:07 +0200 Subject: [PATCH 2/5] fix(ci): use beta sandbox image in deployment tests --- .github/scripts/test-nightly-release-workflows.sh | 8 +++++++- .github/workflows/e2e-tests.yml | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/scripts/test-nightly-release-workflows.sh b/.github/scripts/test-nightly-release-workflows.sh index 02c4e1bed..6bb2a04e2 100755 --- a/.github/scripts/test-nightly-release-workflows.sh +++ b/.github/scripts/test-nightly-release-workflows.sh @@ -5,6 +5,7 @@ repository_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" nightly_workflow="$repository_root/.github/workflows/nightly-release.yml" release_workflow="$repository_root/.github/workflows/release.yml" sandbox_workflow="$repository_root/.github/workflows/sandbox-images-beta.yml" +e2e_workflow="$repository_root/.github/workflows/e2e-tests.yml" decision_script="$repository_root/.github/scripts/nightly-release-decision.sh" validation_script="$repository_root/.github/scripts/validate-release-ref.sh" @@ -43,13 +44,18 @@ if [[ "$tag_aware_dispatch_count" -ne 5 ]]; then fail "expected release channel and version logic to distinguish dry-runs from tag dispatches" fi -ruby - "$repository_root" "$nightly_workflow" "$release_workflow" "$sandbox_workflow" <<'RUBY' +ruby - "$repository_root" "$nightly_workflow" "$release_workflow" "$sandbox_workflow" "$e2e_workflow" <<'RUBY' require "yaml" repository_root = ARGV[0] nightly = YAML.safe_load(File.read(ARGV[1]), aliases: true) release = YAML.safe_load(File.read(ARGV[2]), aliases: true) sandbox = YAML.safe_load(File.read(ARGV[3]), aliases: true) +e2e = YAML.safe_load(File.read(ARGV[4]), aliases: true) + +e2e_sandbox_channel = e2e.dig("jobs", "e2e-test", "env", "TEMPS_SANDBOX_CHANNEL") +abort "E2E must pull the beta sandbox images published for main and PR builds" unless + e2e_sandbox_channel == "beta" check_permissions = nightly.dig("jobs", "check-and-tag", "permissions") abort "check-and-tag permissions are not read-actions/write-contents" unless diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 8869c5dd3..23f665554 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -56,6 +56,11 @@ jobs: # 0/false/off/no/disabled — see temps-telemetry/src/service.rs.) TEMPS_TELEMETRY: "0" TEMPS_BIN: ./ci-prebuilt/temps + # Main and PR builds exercise the beta binary channel. Point sandbox + # pulls at the matching published image set; the default stable tag is + # only published by a stable release and otherwise forces a multi-minute + # local image build that exceeds Playwright's request timeout. + TEMPS_SANDBOX_CHANNEL: beta steps: - name: Free up disk space From 6817da1df1f5220a9c96f1a5547bdb6389b8e9cb Mon Sep 17 00:00:00 2001 From: David Viejo Date: Wed, 5 Aug 2026 08:20:03 +0200 Subject: [PATCH 3/5] fix(console): resolve onboarding review findings --- crates/temps-auth/src/handlers.rs | 96 +++- crates/temps-auth/src/user_service.rs | 419 ++++++++++++++---- .../src/handlers/remote_deployments.rs | 1 + web/e2e/authenticated/drop-handoff.spec.ts | 141 ++++++ web/e2e/authenticated/user-creation.spec.ts | 107 +++++ .../fixtures/drop-folder-site/assets/app.js | 1 + web/e2e/fixtures/drop-folder-site/index.html | 10 + web/src/api/client/sdk.gen.ts | 7 +- web/src/api/client/types.gen.ts | 6 +- .../dashboard/FirstProjectOnboarding.tsx | 144 +++++- .../users/RolePermissionDetails.tsx | 28 +- web/src/components/users/UsersManagement.tsx | 10 +- web/src/lib/drop-handoff.test.ts | 14 + web/src/lib/drop-handoff.ts | 16 + web/src/lib/role-permissions.test.ts | 22 + web/src/lib/role-permissions.ts | 41 +- web/src/pages/CreateUser.tsx | 106 ++++- web/src/pages/Drop.tsx | 36 +- web/src/pages/ProjectDrop.tsx | 23 +- 19 files changed, 1043 insertions(+), 185 deletions(-) create mode 100644 web/e2e/authenticated/drop-handoff.spec.ts create mode 100644 web/e2e/authenticated/user-creation.spec.ts create mode 100644 web/e2e/fixtures/drop-folder-site/assets/app.js create mode 100644 web/e2e/fixtures/drop-folder-site/index.html create mode 100644 web/src/lib/drop-handoff.test.ts create mode 100644 web/src/lib/drop-handoff.ts diff --git a/crates/temps-auth/src/handlers.rs b/crates/temps-auth/src/handlers.rs index 77512834f..d27a845b8 100644 --- a/crates/temps-auth/src/handlers.rs +++ b/crates/temps-auth/src/handlers.rs @@ -124,6 +124,32 @@ async fn record_mfa_rejection( } } +async fn record_pending_login( + state: &AuthState, + metadata: &RequestMetadata, + user_id: i32, + login_method: &'static str, +) { + if let Err(error) = state + .audit_service + .create_audit_log(&LoginAudit { + context: AuditContext { + user_id, + ip_address: Some(metadata.ip_address.to_string()), + user_agent: metadata.user_agent.as_str().to_string(), + }, + success: true, + login_method: login_method.to_string(), + }) + .await + { + error!( + user_id, + login_method, "Failed to record pending login audit event: {}", error + ); + } +} + fn invalid_mfa_problem() -> Problem { problem_new(StatusCode::UNAUTHORIZED) .with_title("MFA Verification Failed") @@ -1037,6 +1063,14 @@ pub async fn login( let mut headers = HeaderMap::new(); headers.insert(SET_COOKIE, cookie_header); + record_pending_login( + state.as_ref(), + &metadata, + user.id, + "password-change-required", + ) + .await; + return Ok(( headers, Json(AuthResponse { @@ -1315,6 +1349,14 @@ pub async fn login( let mut headers = HeaderMap::new(); headers.insert(SET_COOKIE, cookie_header); + record_pending_login( + state.as_ref(), + &metadata, + user_id, + "password-mfa-enrollment-pending", + ) + .await; + Ok(( headers, Json(AuthResponse { @@ -2697,9 +2739,10 @@ async fn disable_mfa( mod tests { use super::{ assign_role, authorize_admin_target, authorize_role_assignment, bounded_audit_identity, - create_user, delete_user, login, normalized_login_email, parse_user_roles, remove_role, - restore_user, update_user, verify_mfa_challenge, AdminTargetDenied, AssignRoleRequest, - CreateUserRequest, LoginRequest, RoleChangeDenied, UpdateUserRequest, + create_user, delete_user, login, normalized_login_email, parse_user_roles, + record_pending_login, remove_role, restore_user, update_user, verify_mfa_challenge, + AdminTargetDenied, AssignRoleRequest, CreateUserRequest, LoginRequest, RoleChangeDenied, + UpdateUserRequest, }; use crate::auth_service::UserAuthError; use crate::context::AuthContext; @@ -3024,6 +3067,53 @@ mod tests { ); } + #[tokio::test] + async fn pending_password_and_mfa_logins_are_durably_audited() { + let audit = Arc::new(RecordingAuditLogger::default()); + let state = auth_state_with_audit( + MockDatabase::new(DatabaseBackend::Postgres).into_connection(), + audit.clone(), + ); + let metadata = request_metadata(); + + record_pending_login(state.as_ref(), &metadata, 41, "password-change-required").await; + record_pending_login( + state.as_ref(), + &metadata, + 42, + "password-mfa-enrollment-pending", + ) + .await; + + let events = audit.events(); + assert_eq!(events.len(), 2); + assert_eq!(events[0].operation_type, "LOGIN_SUCCESS"); + assert_eq!(events[0].user_id, Some(41)); + assert_eq!(events[0].data["login_method"], "password-change-required"); + assert_eq!(events[1].operation_type, "LOGIN_SUCCESS"); + assert_eq!(events[1].user_id, Some(42)); + assert_eq!( + events[1].data["login_method"], + "password-mfa-enrollment-pending" + ); + } + + #[tokio::test] + async fn pending_login_audit_failure_does_not_block_authentication_progress() { + let state = auth_state_with_audit( + MockDatabase::new(DatabaseBackend::Postgres).into_connection(), + Arc::new(FailingAuditLogger), + ); + + record_pending_login( + state.as_ref(), + &request_metadata(), + 41, + "password-change-required", + ) + .await; + } + #[tokio::test] async fn invalid_credentials_are_audited_with_normalized_identity() { let audit = Arc::new(RecordingAuditLogger::default()); diff --git a/crates/temps-auth/src/user_service.rs b/crates/temps-auth/src/user_service.rs index be9b3b182..6cfbb46fe 100644 --- a/crates/temps-auth/src/user_service.rs +++ b/crates/temps-auth/src/user_service.rs @@ -8,16 +8,19 @@ use sea_orm::{ QueryFilter, QueryOrder, QuerySelect, Set, TransactionTrait, }; use serde::{Deserialize, Serialize}; +use std::collections::HashMap; use std::io::Cursor; use std::sync::Arc; use temps_core::UtcDateTime; use temps_entities::types::RoleType; use thiserror::Error; +use tokio::sync::{Mutex, OwnedMutexGuard, OwnedSemaphorePermit, Semaphore}; use totp_rs::{Algorithm, Secret, TOTP}; use tracing::{debug, error, info, warn}; const MAX_USER_EMAIL_BYTES: usize = 254; const MAX_USER_NAME_CHARS: usize = 100; +const MAX_CONCURRENT_MFA_SETUPS: usize = 2; pub(crate) fn normalize_user_email(email: &str) -> Option { let normalized = email.trim().to_lowercase(); @@ -136,6 +139,78 @@ pub struct MfaSetupData { pub recovery_codes: Vec, } +struct MfaSetupCandidate { + secret_key: String, + qr_code: String, + recovery_codes: Vec, + hashed_recovery_codes: Vec, +} + +fn generate_mfa_setup_candidate(email: &str) -> Result { + use argon2::password_hash::{rand_core::OsRng, PasswordHasher, SaltString}; + use argon2::Argon2; + + let secret: Vec = (0..20).map(|_| rand::rng().random::()).collect(); + let secret_key = base32::encode(base32::Alphabet::Rfc4648 { padding: true }, &secret); + let recovery_codes: Vec = (0..8) + .map(|_| { + (0..6) + .map(|_| rand::rng().random_range(0..10).to_string()) + .collect() + }) + .collect(); + + let argon2 = Argon2::default(); + let hashed_recovery_codes = recovery_codes + .iter() + .map(|code| { + let salt = SaltString::generate(&mut OsRng); + argon2 + .hash_password(code.as_bytes(), &salt) + .map(|hash| hash.to_string()) + .map_err(|error| { + UserServiceError::Mfa(format!("Failed to hash MFA recovery code: {}", error)) + }) + }) + .collect::, _>>()?; + + TOTP::new( + Algorithm::SHA1, + 6, + 1, + 30, + Secret::Raw(secret).to_bytes().map_err(|error| { + UserServiceError::Mfa(format!("Failed to create TOTP secret: {}", error)) + })?, + ) + .map_err(|error| UserServiceError::Mfa(format!("Failed to create TOTP: {}", error)))?; + + let otp_auth_url = format!( + "otpauth://totp/Temps:{}?secret={}&issuer=Temps&algorithm=SHA1&digits=6&period=30", + email, secret_key + ); + let qr = QrCode::new(otp_auth_url) + .map_err(|error| UserServiceError::Mfa(format!("Failed to generate QR code: {}", error)))?; + let qr_image = qr.render::>().quiet_zone(false).build(); + let mut bytes = Vec::new(); + qr_image + .write_to(&mut Cursor::new(&mut bytes), image::ImageFormat::Png) + .map_err(|error| { + UserServiceError::Mfa(format!("Failed to encode MFA QR code: {}", error)) + })?; + let qr_code = format!( + "data:image/png;base64,{}", + base64::engine::general_purpose::STANDARD.encode(bytes) + ); + + Ok(MfaSetupCandidate { + secret_key, + qr_code, + recovery_codes, + hashed_recovery_codes, + }) +} + #[derive(Debug, Serialize, Deserialize)] pub struct ServiceUser { pub id: i32, @@ -194,11 +269,64 @@ impl From for ServiceRole { pub struct UserService { db: Arc, + mfa_setup_global: Arc, + mfa_setup_users: Arc>>>>, +} + +struct MfaSetupPermit { + _user: OwnedMutexGuard<()>, + _global: OwnedSemaphorePermit, +} + +async fn run_mfa_setup_blocking( + permit: MfaSetupPermit, + work: F, +) -> Result<(MfaSetupPermit, T), UserServiceError> +where + T: Send + 'static, + F: FnOnce() -> Result + Send + 'static, +{ + let (permit, result) = tokio::task::spawn_blocking(move || (permit, work())) + .await + .map_err(|error| { + UserServiceError::Internal(format!("MFA setup worker failed: {}", error)) + })?; + Ok((permit, result?)) } impl UserService { pub fn new(db: Arc) -> Self { - Self { db } + Self { + db, + mfa_setup_global: Arc::new(Semaphore::new(MAX_CONCURRENT_MFA_SETUPS)), + mfa_setup_users: Arc::new(Mutex::new(HashMap::new())), + } + } + + async fn acquire_mfa_setup_permit( + &self, + user_id: i32, + ) -> Result { + let user_lock = { + let mut users = self.mfa_setup_users.lock().await; + users + .entry(user_id) + .or_insert_with(|| Arc::new(Mutex::new(()))) + .clone() + }; + let user = user_lock.lock_owned().await; + let global = self + .mfa_setup_global + .clone() + .acquire_owned() + .await + .map_err(|_| { + UserServiceError::Internal("MFA setup concurrency limiter closed".to_string()) + })?; + Ok(MfaSetupPermit { + _user: user, + _global: global, + }) } pub async fn initialize_roles(&self) -> Result<(), UserServiceError> { @@ -558,6 +686,15 @@ impl UserService { let user = new_user.insert(&transaction).await?; + // Build the response from the records already resolved inside this + // transaction. Once commit succeeds there must be no fallible read + // that can turn a successfully-created account into an HTTP 500. + let response_roles = resolved_roles + .iter() + .cloned() + .map(ServiceRole::from) + .collect(); + // Assign roles for role in resolved_roles { let new_user_role = temps_entities::user_roles::ActiveModel { @@ -574,9 +711,10 @@ impl UserService { transaction.commit().await?; info!("Created new user with id: {}", user.id); - - // Fetch the user with roles to return - self.get_user_with_roles(user.id).await + Ok(UserWithRoles { + user: ServiceUser::from(user), + roles: response_roles, + }) } pub async fn delete_user( @@ -704,97 +842,60 @@ impl UserService { } pub async fn setup_mfa(&self, user_id: i32) -> Result { + // Serialize setup per user and cap total Argon2 work across accounts. + // This guard is acquired before any database or CPU work so repeated + // requests cannot amplify password hashing for one account. + let permit = self.acquire_mfa_setup_permit(user_id).await?; + + // Fetch the display identity before generating the candidate. The + // exclusive database lock below is only held for the final + // compare-and-write, never for Argon2 or QR rendering. + let initial_user = temps_entities::users::Entity::find_by_id(user_id) + .one(self.db.as_ref()) + .await? + .ok_or_else(|| UserServiceError::NotFound(format!("User {} not found", user_id)))?; + + if initial_user.mfa_enabled { + return Err(UserServiceError::MfaAlreadyEnabled(user_id)); + } + + // Argon2 and PNG encoding are intentionally kept off Tokio's async + // workers. An unverified enrollment is replaceable as one complete + // bundle, so every successful retry rotates all credentials together. + let email = initial_user.email; + // The permit moves into the non-cancellable blocking task. If the HTTP + // request is cancelled, Argon2 retains both guards until it actually + // exits instead of silently escaping the concurrency cap. + let (_permit, candidate) = + run_mfa_setup_blocking(permit, move || generate_mfa_setup_candidate(&email)).await?; + + // Lock only for the final state check and atomic bundle replacement. + // A concurrent request may have enabled MFA while the candidate was + // generated, so the condition must be checked again under the lock. let transaction = self.db.begin().await?; let user = temps_entities::users::Entity::find_by_id(user_id) .lock_exclusive() .one(&transaction) .await? .ok_or_else(|| UserServiceError::NotFound(format!("User {} not found", user_id)))?; - if user.mfa_enabled { return Err(UserServiceError::MfaAlreadyEnabled(user_id)); } - // An unverified enrollment is replaceable as a complete bundle. A - // retry rotates both the TOTP secret and recovery codes, ensuring the - // response always contains usable plaintext recovery credentials. - // Any older concurrent response fails verification instead of enabling - // MFA with recovery codes the user never received. - let secret: Vec = (0..20).map(|_| rand::rng().random::()).collect(); - let secret_b32 = base32::encode(base32::Alphabet::Rfc4648 { padding: true }, &secret); - - let recovery_codes: Vec = (0..8) - .map(|_| { - (0..6) - .map(|_| rand::rng().random_range(0..10).to_string()) - .collect() - }) - .collect(); - - // Hash recovery codes before storing using Argon2id - use argon2::password_hash::{rand_core::OsRng, PasswordHasher, SaltString}; - use argon2::Argon2; - - let argon2 = Argon2::default(); - let hashed_recovery_codes: Vec = recovery_codes - .iter() - .map(|code| { - let salt = SaltString::generate(&mut OsRng); - argon2 - .hash_password(code.as_bytes(), &salt) - .map(|hash| hash.to_string()) - .map_err(|e| { - UserServiceError::Mfa(format!("Failed to hash recovery code: {}", e)) - }) - }) - .collect::, UserServiceError>>()?; - - // Create TOTP with proper parameters & verify it - TOTP::new( - Algorithm::SHA1, - 6, - 1, - 30, - Secret::Raw(secret.clone()).to_bytes().map_err(|e| { - UserServiceError::Mfa(format!("Failed to create TOTP secret: {}", e)) - })?, - ) - .map_err(|e| UserServiceError::Mfa(format!("Failed to create TOTP: {}", e)))?; - - // Generate the otpauth URL manually - let otp_auth_url = format!( - "otpauth://totp/Temps:{}?secret={}&issuer=Temps&algorithm=SHA1&digits=6&period=30", - user.email, // Use email for MFA identifier - secret_b32 - ); - - // Generate QR code - let qr = QrCode::new(otp_auth_url) - .map_err(|e| UserServiceError::Mfa(format!("Failed to generate QR code: {}", e)))?; - let qr_image = qr.render::>().quiet_zone(false).build(); - - // Convert QR code to base64 PNG - let mut bytes: Vec = Vec::new(); - qr_image - .write_to(&mut Cursor::new(&mut bytes), image::ImageFormat::Png) - .map_err(|e| UserServiceError::Mfa(format!("Failed to encode QR code: {}", e)))?; - let qr_base64 = base64::engine::general_purpose::STANDARD.encode(&bytes); - let qr_data_url = format!("data:image/png;base64,{}", qr_base64); - let mut user_update: temps_entities::users::ActiveModel = user.into(); - user_update.mfa_secret = Set(Some(secret_b32.clone())); + user_update.mfa_secret = Set(Some(candidate.secret_key.clone())); user_update.mfa_enabled = Set(false); user_update.mfa_recovery_codes = Set(Some( - serde_json::to_string(&hashed_recovery_codes) + serde_json::to_string(&candidate.hashed_recovery_codes) .map_err(UserServiceError::Serialization)?, )); user_update.update(&transaction).await?; transaction.commit().await?; Ok(MfaSetupData { - secret_key: secret_b32, - qr_code: qr_data_url, - recovery_codes, + secret_key: candidate.secret_key, + qr_code: candidate.qr_code, + recovery_codes: candidate.recovery_codes, }) } @@ -1192,6 +1293,56 @@ mod tests { .any(|statement| { statement.sql.starts_with("INSERT INTO \"user_roles\"") })); } + #[tokio::test] + async fn create_user_returns_committed_records_without_a_post_commit_read() { + let new_user = user(false, None); + let db = Arc::new( + MockDatabase::new(DatabaseBackend::Postgres) + .append_query_results([vec![role(RoleType::User)]]) + .append_query_results([vec![new_user.clone()]]) + .append_query_results([vec![temps_entities::user_roles::Model { + id: 1, + user_id: new_user.id, + role_id: 2, + created_at: Utc::now(), + updated_at: Utc::now(), + }]]) + .into_connection(), + ); + let service = UserService::new(db.clone()); + + let created = service + .create_user( + "Created User".to_string(), + "created@example.com".to_string(), + None, + vec![RoleType::User], + false, + ) + .await + .expect("committed user should be returned without another query"); + + assert_eq!(created.user.id, new_user.id); + assert_eq!(created.roles.len(), 1); + assert_eq!(created.roles[0].name, RoleType::User.as_str()); + drop(service); + let log = Arc::try_unwrap(db) + .expect("service released the database") + .into_transaction_log(); + let statements: Vec<_> = log + .iter() + .flat_map(|transaction| transaction.statements()) + .collect(); + assert_eq!( + statements + .iter() + .filter(|statement| statement.sql.starts_with("SELECT")) + .count(), + 1, + "only role resolution may read during account creation" + ); + } + #[tokio::test] async fn verification_fails_closed_when_mfa_is_disabled() { let db = Arc::new( @@ -1205,6 +1356,115 @@ mod tests { assert!(matches!(result, Err(UserServiceError::MfaNotSetup(7)))); } + #[tokio::test] + async fn mfa_setup_limits_parallel_work_globally_and_per_user() { + use std::time::Duration; + + let service = UserService::new(Arc::new( + MockDatabase::new(DatabaseBackend::Postgres).into_connection(), + )); + let first_user = service + .acquire_mfa_setup_permit(7) + .await + .expect("first setup should acquire a permit"); + + let duplicate = tokio::time::timeout( + Duration::from_millis(25), + service.acquire_mfa_setup_permit(7), + ) + .await; + assert!( + duplicate.is_err(), + "a second setup for the same account must be serialized" + ); + + let second_user = service + .acquire_mfa_setup_permit(8) + .await + .expect("a second account may use the remaining global permit"); + let global_overflow = tokio::time::timeout( + Duration::from_millis(25), + service.acquire_mfa_setup_permit(9), + ) + .await; + assert!( + global_overflow.is_err(), + "MFA setup must cap total concurrent password hashing" + ); + + drop(first_user); + service + .acquire_mfa_setup_permit(9) + .await + .expect("a queued account should proceed after a permit is released"); + drop(second_user); + } + + #[tokio::test] + async fn cancelled_mfa_setup_holds_admission_until_blocking_work_exits() { + use std::sync::mpsc; + use std::time::Duration; + + let service = Arc::new(UserService::new(Arc::new( + MockDatabase::new(DatabaseBackend::Postgres).into_connection(), + ))); + let first = service + .acquire_mfa_setup_permit(7) + .await + .expect("first setup should acquire a permit"); + let second = service + .acquire_mfa_setup_permit(8) + .await + .expect("second setup should fill the global limit"); + let (started_tx, started_rx) = tokio::sync::oneshot::channel(); + let (release_tx, release_rx) = mpsc::channel(); + + let task = tokio::spawn(run_mfa_setup_blocking(first, move || { + let _ = started_tx.send(()); + release_rx.recv().map_err(|error| { + UserServiceError::Internal(format!( + "MFA cancellation test release failed: {}", + error + )) + })?; + Ok(()) + })); + started_rx + .await + .expect("blocking setup should report that it started"); + task.abort(); + let cancelled = task.await; + assert!(matches!(cancelled, Err(error) if error.is_cancelled())); + + assert!( + tokio::time::timeout( + Duration::from_millis(25), + service.acquire_mfa_setup_permit(7) + ) + .await + .is_err(), + "cancellation must not release the per-user guard while work continues" + ); + assert!( + tokio::time::timeout( + Duration::from_millis(25), + service.acquire_mfa_setup_permit(9) + ) + .await + .is_err(), + "cancellation must not release the global permit while work continues" + ); + + release_tx + .send(()) + .expect("blocking work should still own its release receiver"); + tokio::time::timeout(Duration::from_secs(1), service.acquire_mfa_setup_permit(9)) + .await + .expect("permit should be released after blocking work exits") + .expect("limiter should remain open"); + drop(second); + } + #[tokio::test] async fn setup_mfa_retry_rotates_complete_unverified_credential_bundle() { let mut pending = user(false, Some("[\"existing-hash\"]".to_string())); @@ -1212,7 +1472,7 @@ mod tests { let updated = pending.clone(); let db = Arc::new( MockDatabase::new(DatabaseBackend::Postgres) - .append_query_results([vec![pending], vec![updated]]) + .append_query_results([vec![pending.clone()], vec![pending], vec![updated]]) .into_connection(), ); let service = UserService::new(db.clone()); @@ -1246,12 +1506,13 @@ mod tests { } #[tokio::test] - async fn setup_mfa_cannot_replace_enabled_mfa() { + async fn setup_mfa_rechecks_enabled_state_under_the_write_lock() { + let pending = user(false, Some("[\"pending-hash\"]".to_string())); let enabled = user(true, Some("[\"existing-hash\"]".to_string())); let expected_secret = enabled.mfa_secret.clone(); let db = Arc::new( MockDatabase::new(DatabaseBackend::Postgres) - .append_query_results([vec![enabled]]) + .append_query_results([vec![pending], vec![enabled]]) .into_connection(), ); let service = UserService::new(db.clone()); diff --git a/crates/temps-deployments/src/handlers/remote_deployments.rs b/crates/temps-deployments/src/handlers/remote_deployments.rs index a1dd5844e..25f43fc05 100644 --- a/crates/temps-deployments/src/handlers/remote_deployments.rs +++ b/crates/temps-deployments/src/handlers/remote_deployments.rs @@ -1763,6 +1763,7 @@ pub async fn deploy_from_image_upload( post, tag = "Static Bundles", path = "/projects/{project_id}/upload/static", + request_body(content = SourceArchiveUpload, content_type = "multipart/form-data"), responses( (status = 201, description = "Bundle uploaded successfully", body = StaticBundleResponse), (status = 400, description = "Invalid request or unsupported format"), diff --git a/web/e2e/authenticated/drop-handoff.spec.ts b/web/e2e/authenticated/drop-handoff.spec.ts new file mode 100644 index 000000000..1bc8c8a94 --- /dev/null +++ b/web/e2e/authenticated/drop-handoff.spec.ts @@ -0,0 +1,141 @@ +import { expect, test } from '../fixtures' +import path from 'node:path' + +test.describe('empty-state Drop handoff', () => { + test('uploads a ZIP from the project card and starts detection on /drop', async ({ + page, + }) => { + await page.route(/\/api\/projects(?:\?.*)?$/, async (route) => { + if (route.request().method() === 'GET') { + await route.fulfill({ + json: { projects: [], page: 1, per_page: 20, total: 0 }, + }) + return + } + await route.fulfill({ + status: 201, + json: { id: 42, name: 'browser-folder', slug: 'browser-folder' }, + }) + }) + await page.route('**/api/drop/inspect', async (route) => { + await route.fulfill({ + json: { + suggestedName: 'browser-folder', + candidates: [ + { + preset: 'static', + label: 'Static HTML', + directory: '.', + confidence: 'high', + reason: 'index.html found', + isStatic: true, + }, + ], + }, + }) + }) + await page.route('**/api/projects/42/environments', async (route) => { + await route.fulfill({ + json: [ + { + id: 7, + project_id: 42, + name: 'production', + slug: 'production', + main_url: 'https://browser-folder.example.test', + is_preview: false, + }, + ], + }) + }) + let staticUploadWasMultipart = false + await page.route('**/api/projects/42/upload/static', async (route) => { + const request = route.request() + staticUploadWasMultipart = + request + .headers() + ['content-type']?.startsWith('multipart/form-data;') === true && + request.postDataBuffer()?.includes(Buffer.from('name="file"')) === true + await route.fulfill({ + status: 201, + json: { id: 91, project_id: 42 }, + }) + }) + await page.route( + '**/api/projects/42/environments/7/deploy/static', + async (route) => { + await route.fulfill({ status: 201, json: { id: 301 } }) + } + ) + + await page.goto('/projects') + await expect( + page.getByRole('heading', { name: 'Drop project files' }) + ).toBeVisible() + + const chooserPromise = page.waitForEvent('filechooser') + await page.getByRole('button', { name: 'Upload ZIP' }).click() + const chooser = await chooserPromise + await chooser.setFiles({ + name: 'site.zip', + mimeType: 'application/zip', + buffer: Buffer.from('browser-test-archive'), + }) + + await page.waitForURL(/\/drop$/) + await expect( + page.getByText('Static HTML', { exact: true }).first() + ).toBeVisible() + await expect(page.getByLabel('Project name')).toHaveValue('browser-folder') + await page.getByRole('button', { name: 'Deploy Static HTML' }).click() + await expect(page.getByText('Drop accepted')).toBeVisible() + expect(staticUploadWasMultipart).toBe(true) + }) + + test('hands a selected folder to /drop with nested paths intact', async ({ + page, + }) => { + await page.route(/\/api\/projects(?:\?.*)?$/, async (route) => { + if (route.request().method() !== 'GET') return route.continue() + await route.fulfill({ + json: { projects: [], page: 1, per_page: 20, total: 0 }, + }) + }) + let archiveContainsNestedPath = false + await page.route('**/api/drop/inspect', async (route) => { + const body = route.request().postDataBuffer() + archiveContainsNestedPath = + body?.includes(Buffer.from('index.html')) === true && + body.includes(Buffer.from('assets/app.js')) + await route.fulfill({ + json: { + suggestedName: 'drop-folder-site', + candidates: [ + { + preset: 'static', + label: 'Static HTML', + directory: '.', + confidence: 'high', + reason: 'index.html found', + isStatic: true, + }, + ], + }, + }) + }) + + await page.goto('/projects') + const chooserPromise = page.waitForEvent('filechooser') + await page.getByRole('button', { name: 'Open folder' }).click() + const chooser = await chooserPromise + await chooser.setFiles( + path.join(process.cwd(), 'e2e/fixtures/drop-folder-site') + ) + + await page.waitForURL(/\/drop$/) + await expect(page.getByLabel('Project name')).toHaveValue( + 'drop-folder-site' + ) + expect(archiveContainsNestedPath).toBe(true) + }) +}) diff --git a/web/e2e/authenticated/user-creation.spec.ts b/web/e2e/authenticated/user-creation.spec.ts new file mode 100644 index 000000000..ee5022bc9 --- /dev/null +++ b/web/e2e/authenticated/user-creation.spec.ts @@ -0,0 +1,107 @@ +import { expect, test } from '../fixtures' + +test.describe('user creation', () => { + test('retries a failed team assignment without creating the account twice', async ({ + page, + }) => { + let createRequests = 0 + let teamRequests = 0 + const now = new Date().toISOString() + + await page.route(/\/api\/teams(?:\?.*)?$/, async (route) => { + if (route.request().method() !== 'GET') return route.continue() + await route.fulfill({ + json: { + teams: [ + { + id: 99, + name: 'Platform', + slug: 'platform', + description: null, + created_by: 1, + created_at: now, + updated_at: now, + }, + ], + page: 1, + page_size: 100, + total: 1, + }, + }) + }) + await page.route('**/api/users', async (route) => { + if (route.request().method() !== 'POST') return route.continue() + createRequests += 1 + await route.fulfill({ + status: 201, + json: { + user: { + id: 501, + name: 'Alex Morgan', + email: 'alex@example.com', + image: '', + mfa_enabled: false, + email_verified: false, + must_change_password: true, + deleted_at: null, + created_at: Date.now(), + updated_at: Date.now(), + }, + roles: [ + { + id: 2, + name: 'user', + created_at: Date.now(), + updated_at: Date.now(), + }, + ], + }, + }) + }) + await page.route('**/api/teams/99/members', async (route) => { + teamRequests += 1 + if (teamRequests === 1) { + await route.fulfill({ + status: 500, + json: { detail: 'temporary failure' }, + }) + return + } + await route.fulfill({ + status: 201, + json: { + id: 1, + team_id: 99, + user_id: 501, + role: 'viewer', + added_by: 1, + user_name: 'Alex Morgan', + user_email: 'alex@example.com', + created_at: now, + updated_at: now, + }, + }) + }) + + await page.goto('/settings/users/new') + await page.getByLabel('Name').fill('Alex Morgan') + await page.getByLabel('Email').fill('alex@example.com') + await page + .getByRole('button', { name: 'Generate a secure temporary password' }) + .click() + await page.getByLabel('Team', { exact: true }).click() + await page.getByRole('option', { name: 'Platform' }).click() + await page.getByRole('button', { name: 'Create user' }).click() + + await expect( + page.getByText('Account created; team assignment pending') + ).toBeVisible() + expect(createRequests).toBe(1) + expect(teamRequests).toBe(1) + + await page.getByRole('button', { name: 'Retry team assignment' }).click() + await page.waitForURL(/\/settings\/users$/) + expect(createRequests).toBe(1) + expect(teamRequests).toBe(2) + }) +}) diff --git a/web/e2e/fixtures/drop-folder-site/assets/app.js b/web/e2e/fixtures/drop-folder-site/assets/app.js new file mode 100644 index 000000000..1459b786f --- /dev/null +++ b/web/e2e/fixtures/drop-folder-site/assets/app.js @@ -0,0 +1 @@ +document.body.dataset.dropFixture = 'ready' diff --git a/web/e2e/fixtures/drop-folder-site/index.html b/web/e2e/fixtures/drop-folder-site/index.html new file mode 100644 index 000000000..d320803bb --- /dev/null +++ b/web/e2e/fixtures/drop-folder-site/index.html @@ -0,0 +1,10 @@ + + + + + Drop folder fixture + + + + + diff --git a/web/src/api/client/sdk.gen.ts b/web/src/api/client/sdk.gen.ts index 613d4912a..2bd5a23e0 100644 --- a/web/src/api/client/sdk.gen.ts +++ b/web/src/api/client/sdk.gen.ts @@ -6481,9 +6481,14 @@ export const getUniqueCounts = (options: O * deployed later using the deploy/static endpoint. */ export const uploadStaticBundle = (options: Options): RequestResult => (options.client ?? client).post({ + ...formDataBodySerializer, security: [{ scheme: 'bearer', type: 'http' }], url: '/projects/{project_id}/upload/static', - ...options + ...options, + headers: { + 'Content-Type': null, + ...options.headers + } }); export const listProjectScans = (options: Options): RequestResult => (options.client ?? client).get({ diff --git a/web/src/api/client/types.gen.ts b/web/src/api/client/types.gen.ts index 3c47b5446..fb1566cca 100644 --- a/web/src/api/client/types.gen.ts +++ b/web/src/api/client/types.gen.ts @@ -43892,7 +43892,7 @@ export type GetUniqueCountsResponses = { export type GetUniqueCountsResponse = GetUniqueCountsResponses[keyof GetUniqueCountsResponses]; export type UploadStaticBundleData = { - body?: never; + body: SourceArchiveUpload; path: { project_id: number; }; @@ -47685,6 +47685,10 @@ export type SetupMfaErrors = { * Unauthorized */ 401: unknown; + /** + * MFA is already enabled; verify and disable it before re-enrollment + */ + 409: unknown; /** * Internal server error */ diff --git a/web/src/components/dashboard/FirstProjectOnboarding.tsx b/web/src/components/dashboard/FirstProjectOnboarding.tsx index 95bac78fe..064deffdf 100644 --- a/web/src/components/dashboard/FirstProjectOnboarding.tsx +++ b/web/src/components/dashboard/FirstProjectOnboarding.tsx @@ -1,4 +1,4 @@ -import { Link } from 'react-router' +import { Link, useNavigate } from 'react-router' import { Activity, ArrowRight, @@ -6,6 +6,8 @@ import { BookOpen, Bug, Database, + FileArchive, + FolderOpen, GitBranch, Mail, Network, @@ -14,11 +16,14 @@ import { Terminal, UploadCloud, } from 'lucide-react' +import { useEffect, useRef, useState } from 'react' import { Button } from '@/components/ui/button' import { CopyButton } from '@/components/ui/copy-button' import { ConnectionList } from '@/components/dashboard/ConnectionList' import { InlineGitConnect } from '@/components/dashboard/InlineGitConnect' import { cn } from '@/lib/utils' +import { filesFromDrop, filesFromInput } from '@/lib/drop-files' +import { handOffDropFiles } from '@/lib/drop-handoff' interface FirstProjectOnboardingProps { /** @@ -227,32 +232,129 @@ export function FirstProjectOnboarding({ -
-
-
- -
-
-

Drop project files

-

- Upload a folder or ZIP; Temps detects and builds it -

-
-
-

- Create and deploy a project directly from your browser without a - repository or local CLI setup. -

- -
+ ) } +function EmptyStateDropCard() { + const navigate = useNavigate() + const folderInputRef = useRef(null) + const zipInputRef = useRef(null) + const [isDragging, setIsDragging] = useState(false) + const [error, setError] = useState(null) + + useEffect(() => { + folderInputRef.current?.setAttribute('webkitdirectory', '') + }, []) + + const continueToDrop = (files: ReturnType) => { + if (files.length === 0) return + handOffDropFiles(files) + navigate('/drop') + } + + return ( +
{ + event.preventDefault() + setIsDragging(true) + }} + onDragOver={(event) => event.preventDefault()} + onDragLeave={(event) => { + if (!event.currentTarget.contains(event.relatedTarget as Node)) { + setIsDragging(false) + } + }} + onDrop={async (event) => { + event.preventDefault() + setIsDragging(false) + setError(null) + try { + const files = await filesFromDrop(event) + if (files.length === 0) + throw new Error('Choose a project folder or ZIP') + handOffDropFiles(files) + navigate('/drop') + } catch (caught) { + setError( + caught instanceof Error + ? caught.message + : 'Those project files could not be read' + ) + } + }} + > +
+
+ +
+
+

Drop project files

+

+ Package locally, then detect on this Temps instance +

+
+
+ +
+

+ {isDragging + ? 'Release to inspect your project' + : 'Drop a folder or ZIP here'} +

+

+ Common secret files are excluded before the archive is uploaded for + preset detection. +

+
+ + +
+
+ + {error &&

{error}

} + + + continueToDrop(filesFromInput(event.target.files))} + /> + continueToDrop(filesFromInput(event.target.files))} + /> +
+ ) +} + /** * One capability, as a compact chip. Replaces the previous card-with-blurb: * eight of those cost a full screen to communicate "you get all of this", diff --git a/web/src/components/users/RolePermissionDetails.tsx b/web/src/components/users/RolePermissionDetails.tsx index 99bb38138..0562ebcbb 100644 --- a/web/src/components/users/RolePermissionDetails.tsx +++ b/web/src/components/users/RolePermissionDetails.tsx @@ -5,7 +5,8 @@ import { ScrollArea } from '@/components/ui/scroll-area' import { Skeleton } from '@/components/ui/skeleton' import { categoryLabel, - groupRolePermissions, + effectivePlatformRole, + groupRolesPermissions, permissionAction, } from '@/lib/role-permissions' import { useQuery } from '@tanstack/react-query' @@ -24,24 +25,27 @@ const ROLE_SCOPE = { }, } as const -export function RolePermissionDetails({ roleName }: { roleName: string }) { +export function RolePermissionDetails({ roleNames }: { roleNames: string[] }) { const { data, isLoading, isError } = useQuery({ ...getApiKeyPermissionsOptions({}), }) - const role = data?.roles.find((item) => item.name === roleName) - const groups = groupRolePermissions(role, data?.permissions ?? []) + const uniqueRoleNames = Array.from(new Set(roleNames)) + const roles = + data?.roles.filter((role) => uniqueRoleNames.includes(role.name)) ?? [] + const groups = groupRolesPermissions(roles, data?.permissions ?? []) const permissionCount = groups.reduce( (total, group) => total + group.permissions.length, - 0, + 0 ) - const scope = ROLE_SCOPE[roleName as keyof typeof ROLE_SCOPE] + const effectiveRoleName = effectivePlatformRole(uniqueRoleNames) + const scope = effectiveRoleName ? ROLE_SCOPE[effectiveRoleName] : undefined return (
{scope && ( - - {roleName === 'admin' ? ( + + {effectiveRoleName === 'admin' ? ( ) : ( @@ -59,10 +63,12 @@ export function RolePermissionDetails({ roleName }: { roleName: string }) {

Exact permissions

- Granted directly by the {roleName} role. + {uniqueRoleNames.length > 0 + ? `Effective union of the ${uniqueRoleNames.join(', ')} role${uniqueRoleNames.length === 1 ? '' : 's'}.` + : 'No platform role is currently assigned.'}

- {role && ( + {roles.length > 0 && ( {permissionCount} permissions @@ -75,7 +81,7 @@ export function RolePermissionDetails({ roleName }: { roleName: string }) {
- ) : isError || !role ? ( + ) : isError || roles.length !== uniqueRoleNames.length ? ( Permissions unavailable diff --git a/web/src/components/users/UsersManagement.tsx b/web/src/components/users/UsersManagement.tsx index 372fdc03b..206efa012 100644 --- a/web/src/components/users/UsersManagement.tsx +++ b/web/src/components/users/UsersManagement.tsx @@ -317,13 +317,9 @@ export function UsersManagement({ {userToManageRoles && (
[role.name, role]) - ).values() - )[0]?.name || 'user' - } + roleNames={Array.from( + new Set(userToManageRoles.roles.map((role) => role.name)) + )} />
)} diff --git a/web/src/lib/drop-handoff.test.ts b/web/src/lib/drop-handoff.test.ts new file mode 100644 index 000000000..fe2b09940 --- /dev/null +++ b/web/src/lib/drop-handoff.test.ts @@ -0,0 +1,14 @@ +import { describe, expect, test } from 'bun:test' +import { consumeDropFilesHandoff, handOffDropFiles } from './drop-handoff' + +describe('drop file handoff', () => { + test('transfers files exactly once without putting them in browser history', () => { + const file = new File(['hello'], 'index.html', { type: 'text/html' }) + handOffDropFiles([{ file, path: 'site/index.html' }]) + + expect(consumeDropFilesHandoff()).toEqual([ + { file, path: 'site/index.html' }, + ]) + expect(consumeDropFilesHandoff()).toBeNull() + }) +}) diff --git a/web/src/lib/drop-handoff.ts b/web/src/lib/drop-handoff.ts new file mode 100644 index 000000000..f585ce0bb --- /dev/null +++ b/web/src/lib/drop-handoff.ts @@ -0,0 +1,16 @@ +import type { DropFile } from './drop-archive' + +// File objects cannot be encoded into a URL and large folders should not be +// copied into browser history state. Keep the selection in memory for the +// single navigation from the project-list empty state to `/drop`. +let pendingDropFiles: DropFile[] | null = null + +export function handOffDropFiles(files: DropFile[]): void { + pendingDropFiles = files +} + +export function consumeDropFilesHandoff(): DropFile[] | null { + const files = pendingDropFiles + pendingDropFiles = null + return files +} diff --git a/web/src/lib/role-permissions.test.ts b/web/src/lib/role-permissions.test.ts index ec5198d30..214542056 100644 --- a/web/src/lib/role-permissions.test.ts +++ b/web/src/lib/role-permissions.test.ts @@ -2,7 +2,9 @@ import { describe, expect, test } from 'bun:test' import type { PermissionInfo, RoleInfo } from '@/api/client' import { categoryLabel, + effectivePlatformRole, groupRolePermissions, + groupRolesPermissions, permissionAction, } from './role-permissions' @@ -28,6 +30,13 @@ const role: RoleInfo = { } describe('role permissions', () => { + test('does not infer all-project access without a recognized role', () => { + expect(effectivePlatformRole([])).toBeNull() + expect(effectivePlatformRole(['unknown'])).toBeNull() + expect(effectivePlatformRole(['user'])).toBe('user') + expect(effectivePlatformRole(['user', 'admin'])).toBe('admin') + }) + test('groups every granted permission without dropping identifiers', () => { const groups = groupRolePermissions(role, permissions) expect(groups.map((group) => group.category)).toEqual(['projects', 'users']) @@ -40,4 +49,17 @@ describe('role permissions', () => { expect(categoryLabel('api_keys')).toBe('Api Keys') expect(permissionAction('notification_providers:create')).toBe('create') }) + + test('shows the de-duplicated effective union for multiple roles', () => { + const userRole: RoleInfo = { + name: 'user', + description: 'User', + permissions: ['projects:read'], + } + const groups = groupRolesPermissions([userRole, role], permissions) + + expect( + groups.flatMap((group) => group.permissions.map((item) => item.name)) + ).toEqual(['projects:read', 'projects:create', 'users:manage']) + }) }) diff --git a/web/src/lib/role-permissions.ts b/web/src/lib/role-permissions.ts index bf7f5d492..b2e108bbc 100644 --- a/web/src/lib/role-permissions.ts +++ b/web/src/lib/role-permissions.ts @@ -1,5 +1,13 @@ import type { PermissionInfo, RoleInfo } from '@/api/client' +export function effectivePlatformRole( + roleNames: string[] +): 'admin' | 'user' | null { + if (roleNames.includes('admin')) return 'admin' + if (roleNames.includes('user')) return 'user' + return null +} + export type PermissionGroup = { category: string permissions: PermissionInfo[] @@ -9,7 +17,14 @@ export function groupRolePermissions( role: RoleInfo | undefined, availablePermissions: PermissionInfo[] ): PermissionGroup[] { - if (!role) return [] + return groupRolesPermissions(role ? [role] : [], availablePermissions) +} + +export function groupRolesPermissions( + roles: RoleInfo[], + availablePermissions: PermissionInfo[] +): PermissionGroup[] { + if (roles.length === 0) return [] const permissionByName = new Map( availablePermissions.map((permission) => [permission.name, permission]) @@ -17,18 +32,20 @@ export function groupRolePermissions( const groups = new Map() const seen = new Set() - for (const name of role.permissions) { - if (seen.has(name)) continue - seen.add(name) - const permission = permissionByName.get(name) ?? { - name, - category: name.split(':')[0] || 'OTHER', - description: 'Permission for this resource', + for (const role of roles) { + for (const name of role.permissions) { + if (seen.has(name)) continue + seen.add(name) + const permission = permissionByName.get(name) ?? { + name, + category: name.split(':')[0] || 'OTHER', + description: 'Permission for this resource', + } + const category = permission.category.toLowerCase() + const existing = groups.get(category) ?? [] + existing.push(permission) + groups.set(category, existing) } - const category = permission.category.toLowerCase() - const existing = groups.get(category) ?? [] - existing.push(permission) - groups.set(category, existing) } return Array.from(groups, ([category, permissions]) => ({ diff --git a/web/src/pages/CreateUser.tsx b/web/src/pages/CreateUser.tsx index 56bb3b787..5b00e1f5c 100644 --- a/web/src/pages/CreateUser.tsx +++ b/web/src/pages/CreateUser.tsx @@ -6,6 +6,7 @@ import { } from '@/api/client/@tanstack/react-query.gen' import type { TeamRole } from '@/api/client' import { RolePermissionDetails } from '@/components/users/RolePermissionDetails' +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' import { Button } from '@/components/ui/button' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Checkbox } from '@/components/ui/checkbox' @@ -114,6 +115,11 @@ export function CreateUser() { const queryClient = useQueryClient() const { setBreadcrumbs } = useBreadcrumbs() const [showPassword, setShowPassword] = useState(false) + const [teamAssignmentFailure, setTeamAssignmentFailure] = useState<{ + userId: number + teamId: number + role: TeamRole + } | null>(null) const pendingTeamAssignment = useRef<{ teamId: number role: TeamRole @@ -172,9 +178,16 @@ export function CreateUser() { }) toast.success('User created and added to the team') } catch { + setTeamAssignmentFailure({ + userId: createdUser.user.id, + teamId: teamAssignment.teamId, + role: teamAssignment.role, + }) toast.error( - 'User created, but team assignment failed. You can add them from the team page.' + 'User created, but team assignment failed. Retry it before leaving this page.' ) + await queryClient.invalidateQueries({ queryKey: ['listUsers'] }) + return } } else { toast.success('User created successfully') @@ -185,6 +198,7 @@ export function CreateUser() { }) const handleSubmit = async (data: CreateUserFormData) => { + if (teamAssignmentFailure) return pendingTeamAssignment.current = data.teamId ? { teamId: Number(data.teamId), role: data.teamRole } : null @@ -199,6 +213,26 @@ export function CreateUser() { }) } + const retryTeamAssignment = async () => { + if (!teamAssignmentFailure) return + try { + await addTeamMember.mutateAsync({ + path: { team_id: teamAssignmentFailure.teamId }, + body: { + user_id: teamAssignmentFailure.userId, + role: teamAssignmentFailure.role, + }, + }) + setTeamAssignmentFailure(null) + toast.success('User added to the team') + navigate('/settings/users') + } catch { + toast.error( + 'Team assignment still failed. The account was not created again; you can retry safely.' + ) + } + } + const selectedRoleAvailable = permissionsQuery.data?.roles.some( (role) => role.name === selectedRole ) @@ -530,24 +564,56 @@ export function CreateUser() {
- - + {teamAssignmentFailure ? ( + + + Account created; team assignment pending + + +

+ The account is ready, but it has not been added to the + selected team. Retry safely without creating a duplicate + account. +

+
+ + +
+
+
+ ) : ( + <> + + + + )}
@@ -558,7 +624,7 @@ export function CreateUser() { - + diff --git a/web/src/pages/Drop.tsx b/web/src/pages/Drop.tsx index 668677e7e..cb6770f5b 100644 --- a/web/src/pages/Drop.tsx +++ b/web/src/pages/Drop.tsx @@ -5,6 +5,7 @@ import { deployFromStatic, getEnvironments, inspectDropArchive, + uploadStaticBundle, type DropInspectionResponse, type EnvironmentResponse, type ProjectResponse, @@ -32,6 +33,7 @@ import { type DropFile, } from '@/lib/drop-archive' import { dropErrorMessage, inferredProjectName } from '@/lib/drop-files' +import { consumeDropFilesHandoff } from '@/lib/drop-handoff' import { serializeDropEnvironmentVariables, validateDropEnvironmentVariables, @@ -107,6 +109,7 @@ export function Drop() { const [environmentVariables, setEnvironmentVariables] = useState< DropEnvironmentVariable[] >([]) + const [handedOffFiles] = useState(() => consumeDropFilesHandoff()) const detectionRunRef = useRef(0) const detectionAbortRef = useRef(null) @@ -216,6 +219,17 @@ export function Drop() { } } + useEffect(() => { + if (!handedOffFiles?.length) return + const startHandoff = window.setTimeout( + () => setSelection(handedOffFiles), + 0 + ) + return () => window.clearTimeout(startHandoff) + // The handoff is deliberately consumed only on the first `/drop` mount. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [handedOffFiles]) + const reset = () => { detectionRunRef.current += 1 detectionAbortRef.current?.abort() @@ -296,8 +310,6 @@ export function Drop() { throw new Error('The project has no deployment environment') setStage('uploading') - const body = new FormData() - body.append('file', archive) if (!candidate.isStatic) { const sourceResponse = await deployFromUploadedSource({ throwOnError: true, @@ -316,19 +328,13 @@ export function Drop() { ) return } - const uploadResponse = await fetch( - `/api/projects/${createdProject.id}/upload/static`, - { method: 'POST', credentials: 'include', body } - ) - if (!uploadResponse.ok) { - const problem = (await uploadResponse.json().catch(() => null)) as { - detail?: string - } | null - throw new Error( - problem?.detail || `Upload failed (${uploadResponse.status})` - ) - } - const bundle = (await uploadResponse.json()) as { id: number } + const uploadResponse = await uploadStaticBundle({ + throwOnError: true, + path: { project_id: createdProject.id }, + body: { file: archive }, + }) + const bundle = uploadResponse.data + if (!bundle) throw new Error('Static upload returned no bundle') setStage('deploying') await deployFromStatic({ diff --git a/web/src/pages/ProjectDrop.tsx b/web/src/pages/ProjectDrop.tsx index 734b499f1..18a5cc8a5 100644 --- a/web/src/pages/ProjectDrop.tsx +++ b/web/src/pages/ProjectDrop.tsx @@ -3,6 +3,7 @@ import { deployFromUploadedSource, getEnvironments, inspectDropArchive, + uploadStaticBundle, updateProjectSettings, type DropInspectionResponse, type EnvironmentResponse, @@ -239,21 +240,13 @@ export function ProjectDrop({ project }: { project: ProjectResponse }) { if (candidate.isStatic) { setStage('uploading') - const body = new FormData() - body.append('file', preparedArchive) - const uploadResponse = await fetch( - `/api/projects/${project.id}/upload/static`, - { method: 'POST', credentials: 'include', body } - ) - if (!uploadResponse.ok) { - const problem = (await uploadResponse.json().catch(() => null)) as { - detail?: string - } | null - throw new Error( - problem?.detail || `Upload failed (${uploadResponse.status})` - ) - } - const bundle = (await uploadResponse.json()) as { id: number } + const uploadResponse = await uploadStaticBundle({ + throwOnError: true, + path: { project_id: project.id }, + body: { file: preparedArchive }, + }) + const bundle = uploadResponse.data + if (!bundle) throw new Error('Static upload returned no bundle') setStage('deploying') await deployFromStatic({ From 5e7a042e83d200cd9c5417911d2f7ebea5bdf4bf Mon Sep 17 00:00:00 2001 From: David Viejo Date: Wed, 5 Aug 2026 10:05:32 +0200 Subject: [PATCH 4/5] fix(auth): await password reset transaction rollbacks --- crates/temps-auth/src/auth_service.rs | 203 ++++++++++++++------------ 1 file changed, 112 insertions(+), 91 deletions(-) diff --git a/crates/temps-auth/src/auth_service.rs b/crates/temps-auth/src/auth_service.rs index c6eb65d47..2397c858a 100644 --- a/crates/temps-auth/src/auth_service.rs +++ b/crates/temps-auth/src/auth_service.rs @@ -689,58 +689,64 @@ impl AuthService { // Validate password complexity validate_password_complexity(&request.new_password)?; - // Find user by reset token - let transaction = self.db.begin().await?; - let user = temps_entities::users::Entity::find() - .filter(temps_entities::users::Column::PasswordResetToken.eq(&request.token)) - .lock_exclusive() - .one(&transaction) - .await? - .ok_or(UserAuthError::InvalidToken)?; - - // Check if token is expired - if let Some(expires_at) = user.password_reset_expires { - if expires_at < Utc::now() { - return Err(UserAuthError::InvalidToken); - } - } else { - return Err(UserAuthError::InvalidToken); - } - - if user.must_change_password { - if let Some(current_hash) = user.password_hash.as_deref() { - let parsed_hash = argon2::password_hash::PasswordHash::new(current_hash) - .map_err(|_| UserAuthError::PasswordHashError)?; - if argon2::Argon2::default() - .verify_password(request.new_password.as_bytes(), &parsed_hash) - .is_ok() - { - return Err(UserAuthError::SamePassword); - } - } - } - - // Hash new password - use argon2::password_hash::{rand_core::OsRng, SaltString}; - let argon2 = argon2::Argon2::default(); - let salt = SaltString::generate(&mut OsRng); - - let password_hash = argon2 - .hash_password(request.new_password.as_bytes(), &salt) - .map_err(|_| UserAuthError::PasswordHashError)? - .to_string(); + self.db + .transaction::<_, temps_entities::users::Model, UserAuthError>(|transaction| { + Box::pin(async move { + // Find user by reset token. The transaction callback guarantees that + // every rejection path is rolled back before this method returns. + let user = temps_entities::users::Entity::find() + .filter( + temps_entities::users::Column::PasswordResetToken.eq(&request.token), + ) + .lock_exclusive() + .one(transaction) + .await? + .ok_or(UserAuthError::InvalidToken)?; + + // Check if token is expired + if user + .password_reset_expires + .is_none_or(|expires_at| expires_at < Utc::now()) + { + return Err(UserAuthError::InvalidToken); + } - // Update user password and clear reset token - let mut user_update: temps_entities::users::ActiveModel = user.into(); - user_update.password_hash = Set(Some(password_hash)); - user_update.password_reset_token = Set(None); - user_update.password_reset_expires = Set(None); - user_update.must_change_password = Set(false); - user_update.updated_at = Set(Utc::now()); - let updated_user = user_update.update(&transaction).await?; - transaction.commit().await?; + if user.must_change_password { + if let Some(current_hash) = user.password_hash.as_deref() { + let parsed_hash = + argon2::password_hash::PasswordHash::new(current_hash) + .map_err(|_| UserAuthError::PasswordHashError)?; + if argon2::Argon2::default() + .verify_password(request.new_password.as_bytes(), &parsed_hash) + .is_ok() + { + return Err(UserAuthError::SamePassword); + } + } + } - Ok(updated_user) + // Hash new password + use argon2::password_hash::{rand_core::OsRng, SaltString}; + let argon2 = argon2::Argon2::default(); + let salt = SaltString::generate(&mut OsRng); + + let password_hash = argon2 + .hash_password(request.new_password.as_bytes(), &salt) + .map_err(|_| UserAuthError::PasswordHashError)? + .to_string(); + + // Update user password and clear reset token + let mut user_update: temps_entities::users::ActiveModel = user.into(); + user_update.password_hash = Set(Some(password_hash)); + user_update.password_reset_token = Set(None); + user_update.password_reset_expires = Set(None); + user_update.must_change_password = Set(false); + user_update.updated_at = Set(Utc::now()); + user_update.update(transaction).await.map_err(Into::into) + }) + }) + .await + .map_err(Into::into) } /// Complete the first-login password change. Unlike an email reset, this @@ -752,49 +758,55 @@ impl AuthService { ) -> Result { validate_password_complexity(&request.new_password)?; - let transaction = self.db.begin().await?; - let user = temps_entities::users::Entity::find() - .filter(temps_entities::users::Column::PasswordResetToken.eq(&request.token)) - .lock_exclusive() - .one(&transaction) - .await? - .ok_or(UserAuthError::InvalidToken)?; - - if !user.must_change_password - || user - .password_reset_expires - .is_none_or(|expires_at| expires_at < Utc::now()) - { - return Err(UserAuthError::InvalidToken); - } - - if let Some(current_hash) = user.password_hash.as_deref() { - let parsed_hash = argon2::password_hash::PasswordHash::new(current_hash) - .map_err(|_| UserAuthError::PasswordHashError)?; - if argon2::Argon2::default() - .verify_password(request.new_password.as_bytes(), &parsed_hash) - .is_ok() - { - return Err(UserAuthError::SamePassword); - } - } + self.db + .transaction::<_, temps_entities::users::Model, UserAuthError>(|transaction| { + Box::pin(async move { + let user = temps_entities::users::Entity::find() + .filter( + temps_entities::users::Column::PasswordResetToken.eq(&request.token), + ) + .lock_exclusive() + .one(transaction) + .await? + .ok_or(UserAuthError::InvalidToken)?; + + if !user.must_change_password + || user + .password_reset_expires + .is_none_or(|expires_at| expires_at < Utc::now()) + { + return Err(UserAuthError::InvalidToken); + } - use argon2::password_hash::{rand_core::OsRng, SaltString}; - let salt = SaltString::generate(&mut OsRng); - let password_hash = argon2::Argon2::default() - .hash_password(request.new_password.as_bytes(), &salt) - .map_err(|_| UserAuthError::PasswordHashError)? - .to_string(); + if let Some(current_hash) = user.password_hash.as_deref() { + let parsed_hash = argon2::password_hash::PasswordHash::new(current_hash) + .map_err(|_| UserAuthError::PasswordHashError)?; + if argon2::Argon2::default() + .verify_password(request.new_password.as_bytes(), &parsed_hash) + .is_ok() + { + return Err(UserAuthError::SamePassword); + } + } - let mut user_update: temps_entities::users::ActiveModel = user.into(); - user_update.password_hash = Set(Some(password_hash)); - user_update.password_reset_token = Set(None); - user_update.password_reset_expires = Set(None); - user_update.must_change_password = Set(false); - user_update.updated_at = Set(Utc::now()); - let updated_user = user_update.update(&transaction).await?; - transaction.commit().await?; - Ok(updated_user) + use argon2::password_hash::{rand_core::OsRng, SaltString}; + let salt = SaltString::generate(&mut OsRng); + let password_hash = argon2::Argon2::default() + .hash_password(request.new_password.as_bytes(), &salt) + .map_err(|_| UserAuthError::PasswordHashError)? + .to_string(); + + let mut user_update: temps_entities::users::ActiveModel = user.into(); + user_update.password_hash = Set(Some(password_hash)); + user_update.password_reset_token = Set(None); + user_update.password_reset_expires = Set(None); + user_update.must_change_password = Set(false); + user_update.updated_at = Set(Utc::now()); + user_update.update(transaction).await.map_err(Into::into) + }) + }) + .await + .map_err(Into::into) } pub async fn requires_mfa_enrollment(&self, user_id: i32) -> Result { @@ -1122,6 +1134,15 @@ impl From for UserAuthError { } } +impl From> for UserAuthError { + fn from(error: sea_orm::TransactionError) -> Self { + match error { + sea_orm::TransactionError::Transaction(error) => error, + sea_orm::TransactionError::Connection(error) => error.into(), + } + } +} + // Request DTOs #[derive(Debug, serde::Serialize, serde::Deserialize)] pub struct RegisterRequest { From 2c417a6f4019de78bfeb15d5f7e8501d08c6aad9 Mon Sep 17 00:00:00 2001 From: David Viejo Date: Wed, 5 Aug 2026 13:06:14 +0200 Subject: [PATCH 5/5] fix(auth): await MFA challenge transaction rollbacks --- crates/temps-auth/src/auth_service.rs | 158 +++++++++++++------------- 1 file changed, 78 insertions(+), 80 deletions(-) diff --git a/crates/temps-auth/src/auth_service.rs b/crates/temps-auth/src/auth_service.rs index 2397c858a..84f67cd34 100644 --- a/crates/temps-auth/src/auth_service.rs +++ b/crates/temps-auth/src/auth_service.rs @@ -300,93 +300,91 @@ impl AuthService { session_token: &str, code: &str, ) -> Result { - let transaction = self - .db - .begin() - .await - .map_err(|source| MfaChallengeError::Database { - operation: "start the MFA challenge transaction", - user_id: None, - source, - })?; - - // Get the user from the temporary session. Require mfa_pending so a - // real (fully authenticated) session token can never be spent as an - // MFA challenge -- the discriminator cuts both ways. - let session = temps_entities::sessions::Entity::find() - .filter(temps_entities::sessions::Column::SessionToken.eq(session_token)) - .filter(temps_entities::sessions::Column::ExpiresAt.gt(Utc::now())) - .filter(temps_entities::sessions::Column::MfaPending.eq(true)) - .one(&transaction) - .await - .map_err(|source| MfaChallengeError::Database { - operation: "load the pending session", - user_id: None, - source, - })? - .ok_or(MfaChallengeError::InvalidOrExpiredSession)?; - - let user = temps_entities::users::Entity::find_by_id(session.user_id) - .lock_exclusive() - .one(&transaction) - .await - .map_err(|source| MfaChallengeError::Database { - operation: "load the challenge user", - user_id: Some(session.user_id), - source, - })? - .ok_or(MfaChallengeError::UserNotFound { - user_id: session.user_id, - })?; - - // Verify the MFA code - if !self.verify_totp_code(&user, code)? { - return Err(MfaChallengeError::InvalidCode { user_id: user.id }); - } + let session_token = session_token.to_owned(); + let code = code.to_owned(); + self.db + .transaction::<_, temps_entities::users::Model, MfaChallengeError>(|transaction| { + Box::pin(async move { + // Get the user from the temporary session. Require mfa_pending so a + // real (fully authenticated) session token can never be spent as an + // MFA challenge -- the discriminator cuts both ways. + let session = temps_entities::sessions::Entity::find() + .filter(temps_entities::sessions::Column::SessionToken.eq(&session_token)) + .filter(temps_entities::sessions::Column::ExpiresAt.gt(Utc::now())) + .filter(temps_entities::sessions::Column::MfaPending.eq(true)) + .one(transaction) + .await + .map_err(|source| MfaChallengeError::Database { + operation: "load the pending session", + user_id: None, + source, + })? + .ok_or(MfaChallengeError::InvalidOrExpiredSession)?; + + let user = temps_entities::users::Entity::find_by_id(session.user_id) + .lock_exclusive() + .one(transaction) + .await + .map_err(|source| MfaChallengeError::Database { + operation: "load the challenge user", + user_id: Some(session.user_id), + source, + })? + .ok_or(MfaChallengeError::UserNotFound { + user_id: session.user_id, + })?; + + // Verify the MFA code + if !Self::verify_totp_code(&user, &code)? { + return Err(MfaChallengeError::InvalidCode { user_id: user.id }); + } - let mut verified_user = user; - if !verified_user.mfa_enabled { - let mut user_update: temps_entities::users::ActiveModel = verified_user.into(); - user_update.mfa_enabled = Set(true); - verified_user = user_update.update(&transaction).await.map_err(|source| { - MfaChallengeError::Database { - operation: "enable MFA for the challenge user", - user_id: Some(session.user_id), - source, - } - })?; - } + let mut verified_user = user; + if !verified_user.mfa_enabled { + let mut user_update: temps_entities::users::ActiveModel = + verified_user.into(); + user_update.mfa_enabled = Set(true); + verified_user = + user_update.update(transaction).await.map_err(|source| { + MfaChallengeError::Database { + operation: "enable MFA for the challenge user", + user_id: Some(session.user_id), + source, + } + })?; + } - // Consume the challenge in the same transaction as enrollment so a - // failed update never strands the user without a retryable challenge. - let deletion = temps_entities::sessions::Entity::delete_many() - .filter(temps_entities::sessions::Column::SessionToken.eq(session_token)) - .filter(temps_entities::sessions::Column::MfaPending.eq(true)) - .exec(&transaction) - .await - .map_err(|source| MfaChallengeError::Database { - operation: "consume the verified pending session", - user_id: Some(verified_user.id), - source, - })?; - if deletion.rows_affected != 1 { - return Err(MfaChallengeError::InvalidOrExpiredSession); - } + // Consume the challenge in the same transaction as enrollment so a + // failed update never strands the user without a retryable challenge. + let deletion = temps_entities::sessions::Entity::delete_many() + .filter(temps_entities::sessions::Column::SessionToken.eq(&session_token)) + .filter(temps_entities::sessions::Column::MfaPending.eq(true)) + .exec(transaction) + .await + .map_err(|source| MfaChallengeError::Database { + operation: "consume the verified pending session", + user_id: Some(verified_user.id), + source, + })?; + if deletion.rows_affected != 1 { + return Err(MfaChallengeError::InvalidOrExpiredSession); + } - transaction - .commit() + Ok(verified_user) + }) + }) .await - .map_err(|source| MfaChallengeError::Database { - operation: "commit the verified MFA challenge", - user_id: Some(verified_user.id), - source, - })?; - - Ok(verified_user) + .map_err(|error| match error { + sea_orm::TransactionError::Transaction(error) => error, + sea_orm::TransactionError::Connection(source) => MfaChallengeError::Database { + operation: "run the MFA challenge transaction", + user_id: None, + source, + }, + }) } fn verify_totp_code( - &self, user: &temps_entities::users::Model, code: &str, ) -> Result {