systemprompt-cli 0.2.2

Unified CLI for systemprompt.io AI governance: agent orchestration, MCP governance, analytics, profiles, cloud deploy, and self-hosted operations.
Documentation
use chrono::{DateTime, Utc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};

pub use systemprompt_models::profile::ProfileInfo;

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct CredentialsInfo {
    pub authenticated: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub user_email: Option<String>,
    pub token_expired: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct TenantStatusInfo {
    // JSON: external vendor identifier
    pub id: String,
    pub name: String,
    pub status: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub message: Option<String>,
    pub configured_in_profile: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct CloudStatusOutput {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub profile: Option<ProfileInfo>,
    pub credentials: CredentialsInfo,
    pub tenants: Vec<TenantStatusInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct TenantPlanInfo {
    pub name: String,
    pub memory_mb: i32,
    pub volume_gb: i32,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct LoginTenantInfo {
    // JSON: external vendor identifier
    pub id: String,
    pub name: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub subscription_status: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub plan: Option<TenantPlanInfo>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub region: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub hostname: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct LoginUserInfo {
    // JSON: external vendor identifier
    pub id: String,
    pub email: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct LoginCustomerInfo {
    // JSON: external vendor identifier
    pub id: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct LoginOutput {
    pub user: LoginUserInfo,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub customer: Option<LoginCustomerInfo>,
    pub tenants: Vec<LoginTenantInfo>,
    pub credentials_path: String,
    pub tenants_path: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct WhoamiOutput {
    pub user_email: String,
    pub api_url: String,
    pub token_status: String,
    pub authenticated_at: DateTime<Utc>,
    pub local_profiles: usize,
    pub cloud_tenants: usize,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct LogoutOutput {
    pub message: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub credentials_path: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct TenantSummary {
    // JSON: external vendor identifier
    pub id: String,
    pub name: String,
    pub tenant_type: String,
    pub has_database: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct TenantListOutput {
    pub tenants: Vec<TenantSummary>,
    pub total: usize,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct TenantDetailOutput {
    // JSON: external vendor identifier
    pub id: String,
    pub name: String,
    pub tenant_type: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub app_id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub hostname: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub region: Option<String>,
    pub has_database: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct TenantCreateOutput {
    // JSON: external vendor identifier
    pub id: String,
    pub name: String,
    pub tenant_type: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub database_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub profile_name: Option<String>,
    pub message: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct RotateCredentialsOutput {
    #[serde(rename = "tenant_id")]
    pub tenant: String,
    pub status: String,
    pub internal_database_url: String,
    pub external_database_url: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct RotateSyncTokenOutput {
    #[serde(rename = "tenant_id")]
    pub tenant: String,
    pub status: String,
    pub message: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct ProfileSummary {
    pub name: String,
    pub has_secrets: bool,
    pub is_active: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct ProfileListOutput {
    pub profiles: Vec<ProfileSummary>,
    pub total: usize,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub active_profile: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct DeployOutput {
    pub tenant_name: String,
    pub image: String,
    pub status: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,
    pub secrets_synced: usize,
    pub cloud_credentials_synced: usize,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct SyncOutput {
    pub direction: String,
    pub dry_run: bool,
    pub operations: Vec<SyncOperationOutput>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct SyncOperationOutput {
    pub operation: String,
    pub success: bool,
    pub items_synced: usize,
    pub errors: Vec<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct AdminUserSyncResultOutput {
    pub profile: String,
    pub success: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub message: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub error: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct AdminUserSyncOutput {
    pub cloud_user_email: String,
    pub results: Vec<AdminUserSyncResultOutput>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct SkillsSyncOutput {
    pub direction: String,
    pub dry_run: bool,
    pub synced: usize,
    pub created: usize,
    pub updated: usize,
    pub deleted: usize,
    pub errors: Vec<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct SecretsOutput {
    pub operation: String,
    pub keys: Vec<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub rejected_keys: Option<Vec<String>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct RestartOutput {
    pub tenant_name: String,
    pub status: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct DomainOutput {
    pub tenant_name: String,
    pub domain: String,
    pub status: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub certificate_status: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct DockerfileOutput {
    pub content: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct InitOutput {
    pub message: String,
    pub created_paths: Vec<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct CancelSubscriptionOutput {
    #[serde(rename = "tenant_id")]
    pub tenant: String,
    pub tenant_name: String,
    pub message: String,
}