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
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..84f67cd34 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,55 +300,91 @@ impl AuthService {
session_token: &str,
code: &str,
) -> Result {
- // 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(self.db.as_ref())
- .await
- .map_err(|source| MfaChallengeError::Database {
- operation: "load the pending session",
- user_id: None,
- source,
- })?
- .ok_or(MfaChallengeError::InvalidOrExpiredSession)?;
+ 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 user = temps_entities::users::Entity::find_by_id(session.user_id)
- .one(self.db.as_ref())
- .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,
- })?;
+ 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,
+ }
+ })?;
+ }
- // Verify the MFA code
- if !self.verify_totp_code(&user, code)? {
- return Err(MfaChallengeError::InvalidCode { user_id: user.id });
- }
+ // 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);
+ }
- // Delete the temporary session
- temps_entities::sessions::Entity::delete_many()
- .filter(temps_entities::sessions::Column::SessionToken.eq(session_token))
- .exec(self.db.as_ref())
+ Ok(verified_user)
+ })
+ })
.await
- .map_err(|source| MfaChallengeError::Database {
- operation: "consume the verified pending session",
- user_id: Some(user.id),
- source,
- })?;
-
- Ok(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 {
@@ -410,6 +457,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 +547,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 +597,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
@@ -582,41 +687,147 @@ impl AuthService {
// Validate password complexity
validate_password_complexity(&request.new_password)?;
- // Find user by reset token
- let user = temps_entities::users::Entity::find()
- .filter(temps_entities::users::Column::PasswordResetToken.eq(&request.token))
- .one(self.db.as_ref())
- .await?
- .ok_or(UserAuthError::InvalidToken)?;
+ 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);
+ }
- // 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);
+ // 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)
+ }
- let password_hash = argon2
- .hash_password(request.new_password.as_bytes(), &salt)
- .map_err(|_| UserAuthError::PasswordHashError)?
- .to_string();
+ /// 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)?;
- // 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.updated_at = Set(Utc::now());
- let updated_user = user_update.update(self.db.as_ref()).await?;
+ 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);
+ }
- Ok(updated_user)
+ 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());
+ 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 {
+ 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.
@@ -883,6 +1094,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
@@ -915,6 +1132,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 {
@@ -1607,6 +1833,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 +1853,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 +1863,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 +2256,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 +2787,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..d27a845b8 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(
@@ -131,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")
@@ -629,6 +648,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 +683,8 @@ pub async fn verify_step_up(
LoginRequest,
EmailRequest,
ResetPasswordRequest,
+ RequiredPasswordChangeRequest,
+ RequiredPasswordChangeResponse,
AuthResponse,
EmailStatusResponse,
crate::oidc_types::OidcProviderSummary,
@@ -723,6 +745,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 +826,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 +866,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 +948,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 +1004,87 @@ 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);
+
+ record_pending_login(
+ state.as_ref(),
+ &metadata,
+ user.id,
+ "password-change-required",
+ )
+ .await;
+
+ 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 +1152,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 +1261,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 +1309,70 @@ 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(
+ 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);
+
+ record_pending_login(
state.as_ref(),
&metadata,
- Some(user_id),
- &login_email,
- "password",
- "mfa_required_for_role",
+ user_id,
+ "password-mfa-enrollment-pending",
)
.await;
- Err(problem_new(StatusCode::UNAUTHORIZED)
- .with_title("Invalid Credentials")
- .with_detail("Invalid email or password."))
+
+ 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 +1455,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,12 +1507,175 @@ 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(
@@ -1387,6 +1724,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 +1762,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 +2092,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 +2103,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 +2119,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 +2499,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 +2739,17 @@ 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,
+ 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;
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 +2763,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 +2788,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 +2992,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());
@@ -2706,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());
@@ -3063,6 +3471,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..6cfbb46fe 100644
--- a/crates/temps-auth/src/user_service.rs
+++ b/crates/temps-auth/src/user_service.rs
@@ -8,14 +8,61 @@ 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();
+ 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 +87,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),
@@ -89,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,
@@ -97,6 +219,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 +248,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,
@@ -145,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> {
@@ -391,9 +568,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 +635,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 +680,23 @@ 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()))
- })?;
+ // 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 {
user_id: Set(user.id),
role_id: Set(role.id),
@@ -460,13 +705,16 @@ impl UserService {
..Default::default()
};
- new_user_role.insert(self.db.as_ref()).await?;
+ new_user_role.insert(&transaction).await?;
}
- info!("Created new user with id: {}", user.id);
+ transaction.commit().await?;
- // Fetch the user with roles to return
- self.get_user_with_roles(user.id).await
+ info!("Created new user with id: {}", user.id);
+ Ok(UserWithRoles {
+ user: ServiceUser::from(user),
+ roles: response_roles,
+ })
}
pub async fn delete_user(
@@ -594,90 +842,60 @@ impl UserService {
}
pub async fn setup_mfa(&self, user_id: i32) -> Result {
- let user = temps_entities::users::Entity::find_by_id(user_id)
+ // 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)))?;
- // Generate random secret with explicit type
- 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)
- .map(|_| rand::rng().random_range(0..10).to_string())
- .collect();
- code
- })
- .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();
+ if initial_user.mfa_enabled {
+ return Err(UserServiceError::MfaAlreadyEnabled(user_id));
+ }
- // 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);
+ // 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));
+ }
- // 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_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(self.db.as_ref()).await?;
+ 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,
})
}
@@ -827,7 +1045,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 +1077,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 +1094,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 +1108,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 +1120,229 @@ 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 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(
@@ -914,6 +1356,190 @@ 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()));
+ pending.mfa_secret = Some("JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP".to_string());
+ let updated = pending.clone();
+ let db = Arc::new(
+ MockDatabase::new(DatabaseBackend::Postgres)
+ .append_query_results([vec![pending.clone()], 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_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![pending], 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/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/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/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/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..2bd5a23e0 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,
@@ -6472,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 2e5a9e062..fb1566cca 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;
@@ -43831,7 +43892,7 @@ export type GetUniqueCountsResponses = {
export type GetUniqueCountsResponse = GetUniqueCountsResponses[keyof GetUniqueCountsResponses];
export type UploadStaticBundleData = {
- body?: never;
+ body: SourceArchiveUpload;
path: {
project_id: number;
};
@@ -47624,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.
-
-
- Open Drop
-
-
+
)
}
+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.
+
+
+ folderInputRef.current?.click()}
+ >
+ Open folder
+
+ zipInputRef.current?.click()}
+ >
+ Upload ZIP
+
+
+
+
+ {error &&
{error}
}
+
+ Open Drop without files
+
+
+
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/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 (
+
onSelect(index)}
+ className={cn(
+ 'relative min-h-36 rounded-xl border bg-card p-4 text-left transition-all duration-200',
+ 'hover:-translate-y-0.5 hover:border-muted-foreground/50 hover:shadow-sm',
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
+ selected && 'border-primary ring-2 ring-primary/35',
+ disabled && 'cursor-not-allowed opacity-60 hover:translate-y-0'
+ )}
+ >
+ {selected && (
+
+
+
+ )}
+
+
+
+
+
+
+ {candidate.label}
+
+
+ {candidate.confidence}
+
+
+
+ {candidate.reason}
+
+
+
+
+
+
+
+ {directory}
+
+
+
+ )
+ })}
+
+ )
+}
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.
+
+
+
+
+ Add variable
+
+
+
+ {variables.length > 0 && (
+
+ {variables.map((variable, index) => {
+ const valueVisible = visibleValues.has(variable.id)
+ return (
+
+
+
+ {index === 0 ? 'Key' : Key }
+
+
+ update(variable.id, 'key', event.target.value)
+ }
+ />
+
+
+
+ {index === 0 ? (
+ 'Value'
+ ) : (
+ Value
+ )}
+
+
+
+ update(variable.id, 'value', event.target.value)
+ }
+ />
+ toggleVisible(variable.id)}
+ disabled={disabled}
+ aria-label={valueVisible ? 'Hide value' : 'Show value'}
+ >
+ {valueVisible ? (
+
+ ) : (
+
+ )}
+
+
+
+
remove(variable.id)}
+ disabled={disabled}
+ aria-label={`Remove ${variable.key || `variable ${index + 1}`}`}
+ >
+
+
+
+ )
+ })}
+
+ )}
+
+ )
+}
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 ? (
+
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..0562ebcbb
--- /dev/null
+++ b/web/src/components/users/RolePermissionDetails.tsx
@@ -0,0 +1,132 @@
+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,
+ effectivePlatformRole,
+ groupRolesPermissions,
+ 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({ roleNames }: { roleNames: string[] }) {
+ const { data, isLoading, isError } = useQuery({
+ ...getApiKeyPermissionsOptions({}),
+ })
+
+ 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
+ )
+ const effectiveRoleName = effectivePlatformRole(uniqueRoleNames)
+ const scope = effectiveRoleName ? ROLE_SCOPE[effectiveRoleName] : undefined
+
+ return (
+
+ {scope && (
+
+ {effectiveRoleName === 'admin' ? (
+
+ ) : (
+
+ )}
+ {scope.title}
+
+
+ {scope.description}
+
+
+
+ )}
+
+
+
+
Exact permissions
+
+ {uniqueRoleNames.length > 0
+ ? `Effective union of the ${uniqueRoleNames.join(', ')} role${uniqueRoleNames.length === 1 ? '' : 's'}.`
+ : 'No platform role is currently assigned.'}
+
+
+ {roles.length > 0 && (
+
+ {permissionCount} permissions
+
+ )}
+
+
+ {isLoading ? (
+
+
+
+
+
+ ) : isError || roles.length !== uniqueRoleNames.length ? (
+
+ 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}
+
+
+
+
+ ))}
+
+
+ )}
+
+ )
+}
diff --git a/web/src/components/users/UsersManagement.tsx b/web/src/components/users/UsersManagement.tsx
index cae75f63f..206efa012 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
-
-
-
-
-
!open && setUserToManageRoles(null)}
>
-
+
Manage User Role
@@ -500,6 +314,15 @@ export function UsersManagement({
})}
)}
+ {userToManageRoles && (
+
+ role.name))
+ )}
+ />
+
+ )}
onCreateDialogOpenChange(true)}>
+ navigate('/settings/users/new')}>
Add 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-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/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..214542056
--- /dev/null
+++ b/web/src/lib/role-permissions.test.ts
@@ -0,0 +1,65 @@
+import { describe, expect, test } from 'bun:test'
+import type { PermissionInfo, RoleInfo } from '@/api/client'
+import {
+ categoryLabel,
+ effectivePlatformRole,
+ groupRolePermissions,
+ groupRolesPermissions,
+ 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('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'])
+ 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')
+ })
+
+ 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
new file mode 100644
index 000000000..b2e108bbc
--- /dev/null
+++ b/web/src/lib/role-permissions.ts
@@ -0,0 +1,68 @@
+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[]
+}
+
+export function groupRolePermissions(
+ role: RoleInfo | undefined,
+ availablePermissions: PermissionInfo[]
+): PermissionGroup[] {
+ 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])
+ )
+ const groups = new Map()
+ const seen = new Set()
+
+ 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)
+ }
+ }
+
+ 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.
+
+ )}
-
+
{isVerifyingMfa && (
)}
diff --git a/web/src/pages/CreateUser.tsx b/web/src/pages/CreateUser.tsx
new file mode 100644
index 000000000..5b00e1f5c
--- /dev/null
+++ b/web/src/pages/CreateUser.tsx
@@ -0,0 +1,634 @@
+import {
+ addTeamMemberMutation,
+ createUserMutation,
+ getApiKeyPermissionsOptions,
+ listTeamsOptions,
+} 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'
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from '@/components/ui/form'
+import { Input } from '@/components/ui/input'
+import { Label } from '@/components/ui/label'
+import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from '@/components/ui/select'
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from '@/components/ui/tooltip'
+import { useBreadcrumbs } from '@/contexts/BreadcrumbContext'
+import { usePageTitle } from '@/hooks/usePageTitle'
+import {
+ PASSWORD_REQUIREMENTS,
+ generateCompliantPassword,
+ passwordRequirementResults,
+ passwordSchema,
+} from '@/lib/password-policy'
+import { zodResolver } from '@hookform/resolvers/zod'
+import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
+import {
+ ArrowLeft,
+ Check,
+ Circle,
+ Eye,
+ EyeOff,
+ Loader2,
+ WandSparkles,
+} from 'lucide-react'
+import { useEffect, useRef, useState } from 'react'
+import { useForm } from 'react-hook-form'
+import { Link, 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('Enter a valid email address'),
+ password: passwordSchema,
+ role: z.enum(['user', 'admin']),
+ mustChangePassword: z.boolean(),
+ teamId: z.string(),
+ teamRole: z.enum(['owner', 'admin', 'deployer', 'viewer']),
+})
+
+type CreateUserFormData = z.infer
+
+const ROLE_OPTIONS = [
+ {
+ value: 'user' as const,
+ label: 'User',
+ description:
+ 'Can deploy and operate every existing and future project, but cannot manage users or system settings.',
+ },
+ {
+ value: 'admin' as const,
+ label: 'Administrator',
+ description:
+ 'Full control of projects, users, roles, settings, and system resources.',
+ },
+]
+
+const TEAM_ROLE_OPTIONS: Array<{
+ value: TeamRole
+ label: string
+ description: string
+}> = [
+ { value: 'viewer', label: 'Viewer', description: 'Can view team projects.' },
+ {
+ value: 'deployer',
+ label: 'Deployer',
+ description: 'Can view and deploy team projects.',
+ },
+ {
+ value: 'admin',
+ label: 'Team admin',
+ description: 'Can operate projects and manage team members.',
+ },
+ {
+ value: 'owner',
+ label: 'Team owner',
+ description: 'Full control of the team and its project access.',
+ },
+]
+
+export function CreateUser() {
+ usePageTitle('Create user')
+ const navigate = useNavigate()
+ 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
+ } | null>(null)
+
+ useEffect(() => {
+ setBreadcrumbs([
+ { label: 'Users', href: '/settings/users' },
+ { label: 'Create user' },
+ ])
+ }, [setBreadcrumbs])
+
+ const permissionsQuery = useQuery({
+ ...getApiKeyPermissionsOptions({}),
+ })
+ const teamsQuery = useQuery(
+ listTeamsOptions({ query: { page: 1, page_size: 100 } })
+ )
+
+ const form = useForm({
+ resolver: zodResolver(createUserSchema),
+ defaultValues: {
+ name: '',
+ email: '',
+ password: '',
+ role: 'user',
+ mustChangePassword: true,
+ teamId: '',
+ teamRole: 'viewer',
+ },
+ })
+
+ const password = form.watch('password')
+ const selectedRole = form.watch('role')
+ const selectedTeamId = form.watch('teamId')
+ const selectedTeamRole = form.watch('teamRole')
+ const requirementResults = passwordRequirementResults(password)
+
+ const addTeamMember = useMutation({
+ ...addTeamMemberMutation(),
+ })
+
+ const createUser = useMutation({
+ ...createUserMutation(),
+ meta: { errorTitle: 'Failed to create user' },
+ onSuccess: async (createdUser) => {
+ const teamAssignment = pendingTeamAssignment.current
+ if (teamAssignment) {
+ try {
+ await addTeamMember.mutateAsync({
+ path: { team_id: teamAssignment.teamId },
+ body: {
+ user_id: createdUser.user.id,
+ role: teamAssignment.role,
+ },
+ })
+ 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. Retry it before leaving this page.'
+ )
+ await queryClient.invalidateQueries({ queryKey: ['listUsers'] })
+ return
+ }
+ } else {
+ toast.success('User created successfully')
+ }
+ await queryClient.invalidateQueries({ queryKey: ['listUsers'] })
+ navigate('/settings/users')
+ },
+ })
+
+ const handleSubmit = async (data: CreateUserFormData) => {
+ if (teamAssignmentFailure) return
+ pendingTeamAssignment.current = data.teamId
+ ? { teamId: Number(data.teamId), role: data.teamRole }
+ : null
+ await createUser.mutateAsync({
+ body: {
+ username: data.name,
+ email: data.email,
+ password: data.password,
+ roles: [data.role],
+ must_change_password: data.mustChangePassword,
+ },
+ })
+ }
+
+ 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
+ )
+
+ return (
+
+
+
+
+
+
+ Back to users
+
+
+
+
+ Create user
+
+
+ Create login credentials, choose the platform role, and review
+ every permission before granting access.
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/web/src/pages/Drop.tsx b/web/src/pages/Drop.tsx
index dacc86442..cb6770f5b 100644
--- a/web/src/pages/Drop.tsx
+++ b/web/src/pages/Drop.tsx
@@ -5,11 +5,15 @@ import {
deployFromStatic,
getEnvironments,
inspectDropArchive,
+ uploadStaticBundle,
type DropInspectionResponse,
type EnvironmentResponse,
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 +28,30 @@ 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 { consumeDropFilesHandoff } from '@/lib/drop-handoff'
+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 +63,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 +82,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 +106,12 @@ export function Drop() {
null
)
const [selectedCandidateIndex, setSelectedCandidateIndex] = useState('0')
+ const [environmentVariables, setEnvironmentVariables] = useState<
+ DropEnvironmentVariable[]
+ >([])
+ const [handedOffFiles] = useState(() => consumeDropFilesHandoff())
+ const detectionRunRef = useRef(0)
+ const detectionAbortRef = useRef(null)
usePageTitle('Drop')
useEffect(() => {
@@ -91,6 +120,12 @@ export function Drop() {
{ label: 'Drop' },
])
}, [setBreadcrumbs])
+ useEffect(
+ () => () => {
+ detectionAbortRef.current?.abort()
+ },
+ []
+ )
const normalizedCandidates = useMemo(() => htmlRootCandidates(files), [files])
const hasRootIndex = normalizedCandidates.some(
@@ -98,8 +133,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 +209,31 @@ 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)
+ }
}
+ 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()
+ detectionAbortRef.current = null
setFiles([])
setProjectName('')
setNameWasEdited(false)
@@ -130,6 +245,7 @@ export function Drop() {
setPreparedArchive(null)
setInspection(null)
setSelectedCandidateIndex('0')
+ setEnvironmentVariables([])
}
const deploy = async () => {
@@ -141,27 +257,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 +290,8 @@ export function Drop() {
project_type: candidate.isStatic ? 'static' : 'server',
automatic_deploy: false,
storage_service_ids: [],
+ environment_variables:
+ serializeDropEnvironmentVariables(environmentVariables),
},
})
createdProject = projectResult.data
@@ -201,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,
@@ -221,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({
@@ -332,161 +433,200 @@ export function Drop() {
-
-
-
-
-
-
-
- Deployment card
-
-
Configure drop
-
-
-
-
-
-
-
Project name
-
+
+ {files.length === 0 ? (
+
+ {
- setProjectName(event.target.value)
- setNameWasEdited(true)
- }}
- onBlur={() =>
- setProjectName(ensureDropProjectName(projectName))
- }
/>
-
-
- {!isArchive && !hasRootIndex && normalizedCandidates.length > 0 && (
-
-
Root page
-
-
-
-
-
- {normalizedCandidates.map((candidate) => (
-
- {candidate}
-
- ))}
-
-
-
- Temps adds a small index redirect; your selected file stays in
- place.
-
+
+ ) : (
+
+
+
+
+
+
+
+ Deployment card
+
+
Configure drop
+
+
- )}
- {inspection && (
-
-
Detected project
-
+
+ Project name
+ {
+ setProjectName(event.target.value)
+ setNameWasEdited(true)
+ }}
+ onBlur={() =>
+ setProjectName(ensureDropProjectName(projectName))
+ }
+ />
+
+
+
-
-
-
-
- {inspection.candidates.map((candidate, index) => (
-
+
+ {!isArchive &&
+ !hasRootIndex &&
+ normalizedCandidates.length > 0 && (
+
+
Root page
+
{
+ const runId = ++detectionRunRef.current
+ setRootPage(value)
+ setPreparedArchive(null)
+ setInspection(null)
+ setError(null)
+ void detectSelection(files, value, runId)
+ }}
+ disabled={isBusy}
>
- {formatDetectedProjectLabel(
- candidate.label,
- candidate.directory
- )}
-
- ))}
-
-
-
- {
- inspection.candidates[Number(selectedCandidateIndex)]
- ?.reason
- }
-
-
- )}
+
+
+
+
+ {normalizedCandidates.map((candidate) => (
+
+ {candidate}
+
+ ))}
+
+
+
+ Temps adds a small index redirect; your selected file
+ stays in place.
+
+
+ )}
-
-
- Source
-
- {inspection
- ? inspection.candidates[Number(selectedCandidateIndex)]
- ?.label
- : 'Pending detection'}
-
-
-
- Git connection
- None
-
-
- Upload limit
- 500 MB ZIP / 100 MB folder
-
-
+ {inspection && inspection.candidates.length > 1 && (
+
+ Detected projects
+
+ setSelectedCandidateIndex(String(index))
+ }
+ disabled={isBusy}
+ />
+
+ )}
- {error && (
-
- {error}
+ {(!inspection || inspection.candidates.length === 1) && (
+
+ )}
+
+
+
+ Source
+
+ {inspection
+ ? selectedCandidate?.label
+ : 'Pending detection'}
+
+
+
+
+ Git connection
+
+ None
+
+
+
+ Environment variables
+
+
+ {environmentVariables.length}
+
+
+
+ Upload limit
+
+ 500 MB ZIP / 100 MB folder
+
+
+
+
+ {error && (
+
+ {error}
+
+ )}
- )}
-
-
- {isBusy ? (
-
- ) : (
-
- )}
- {inspection
- ? stageLabel(stage)
- : isBusy
- ? stageLabel(stage)
- : 'Detect preset'}
-
-
- Failed setup is rolled back automatically.
-
-
+
+ {isBusy ? (
+
+ ) : (
+
+ )}
+ {stageLabel(stage, selectedCandidate?.label, files.length > 0)}
+
+
+ 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..18a5cc8a5 100644
--- a/web/src/pages/ProjectDrop.tsx
+++ b/web/src/pages/ProjectDrop.tsx
@@ -3,11 +3,14 @@ import {
deployFromUploadedSource,
getEnvironments,
inspectDropArchive,
+ uploadStaticBundle,
updateProjectSettings,
type DropInspectionResponse,
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 +23,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 +55,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 +79,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 +91,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 +101,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 +128,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 +201,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,
@@ -177,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({
@@ -236,144 +291,179 @@ export function ProjectDrop({ project }: { project: ProjectResponse }) {
-
-
-
-
-
-
-
- Deployment card
-
-
Configure upload
-
-
-
-
-
-
-
Environment
-
+
+ {files.length === 0 ? (
+
+
+
+ ) : (
+
+ select([])}
+ disabled={['saving', 'uploading', 'deploying'].includes(stage)}
+ aria-label="Clear selected files"
>
-
-
-
-
- {environments.map((env) => (
-
- {env.name}
-
- ))}
-
-
-
-
- {!isArchive && !hasRootIndex && htmlPages.length > 0 && (
-
-
Root page
-
-
-
-
-
- {htmlPages.map((page) => (
-
- {page}
-
- ))}
-
-
+
+
+
+
+
+ Deployment card
+
+
+ Configure upload
+
+
+
- )}
- {inspection && (
-
-
Detected project
-
-
-
-
-
- {inspection.candidates.map((item, index) => (
-
- {formatDetectedProjectLabel(item.label, item.directory)}
-
- ))}
-
-
-
- {candidate?.reason}
-
-
- )}
+
+
+ Environment
+
+
+
+
+
+ {environments.map((env) => (
+
+ {env.name}
+
+ ))}
+
+
+
-
-
- Build directory
-
- {candidate ? candidate.directory || '.' : project.directory || '.'}
-
-
-
- Preset
-
- {candidate ? candidate.label : 'Pending detection'}
-
-
-
- Upload limit
- 500 MB ZIP / 100 MB folder
-
-
+ {!isArchive && !hasRootIndex && htmlPages.length > 0 && (
+
+ Root page
+ {
+ const runId = ++detectionRunRef.current
+ setRootPage(value)
+ setPreparedArchive(null)
+ setInspection(null)
+ setError(null)
+ void detectSelection(files, value, runId)
+ }}
+ disabled={isBusy}
+ >
+
+
+
+
+ {htmlPages.map((page) => (
+
+ {page}
+
+ ))}
+
+
+
+ )}
- {error && (
-
- {error}
+ {inspection && inspection.candidates.length > 1 && (
+
+ Detected projects
+ setCandidateIndex(String(index))}
+ disabled={isBusy}
+ />
+
+ )}
+
+ {(!inspection || inspection.candidates.length === 1) && (
+
+ )}
+
+
+
+
+ Build directory
+
+
+ {candidate
+ ? candidate.directory || '.'
+ : project.directory || '.'}
+
+
+
+ Preset
+
+ {candidate ? candidate.label : 'Pending detection'}
+
+
+
+ Upload limit
+
+ 500 MB ZIP / 100 MB folder
+
+
+
+
+ {error && (
+
+ {error}
+
+ )}
- )}
-
-
- {isBusy ? (
-
- ) : (
-
- )}
- {stageLabel(stage, Boolean(inspection))}
-
-
+
+ {isBusy ? (
+
+ ) : (
+
+ )}
+ {stageLabel(stage, candidate?.label, files.length > 0)}
+
+
+ )}
+
)
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.nextStep.cta}
+
+
+
+ )}
+
+
+
+
+
+ {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.
+
+
+
+
+
+
+
+
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.
+
+ )}
+
+
+
+
+
+ )
+ }
+
+ return (
+
+
+
+
+
Temps
+
+
+
+
+
+ Choose a new password
+
+
+ Your administrator requires you to replace the temporary password
+ before accessing Temps.
+
+
+
+
+
+
+
+
+
+ )
+}
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 && (