diff --git a/src/commands/environment.rs b/src/commands/environment.rs index 71e88fd1e..ee4353210 100644 --- a/src/commands/environment.rs +++ b/src/commands/environment.rs @@ -1,21 +1,25 @@ -use std::{collections::BTreeMap, fmt::Display, time::Duration}; +use std::{collections::BTreeMap, fmt::Display, str::FromStr, time::Duration}; use crate::{ consts::TICK_STRING, - controllers::project::{get_project, get_service_ids_in_env}, - controllers::variables::Variable, + controllers::{ + project::{get_project, get_service_ids_in_env}, + variables::Variable, + }, errors::RailwayError, interact_or, util::{ prompt::{ - PromptService, fake_select, prompt_confirm_with_default, prompt_options, - prompt_options_skippable, prompt_text, prompt_variables, + PromptService, PromptServiceInstance, fake_select, prompt_confirm_with_default, + prompt_options, prompt_options_skippable, prompt_text, + prompt_text_with_placeholder_disappear, prompt_variables, }, retry::{RetryConfig, retry_with_backoff}, }, }; use anyhow::bail; use is_terminal::IsTerminal; +use strum::{Display, EnumIter, EnumString, IntoEnumIterator}; use tokio::task::JoinHandle; use super::{queries::project::ProjectProjectEnvironmentsEdgesNode, *}; @@ -58,6 +62,20 @@ pub struct NewArgs { /// railway environment new foo --duplicate bar --service-variable BACKEND_PORT=3000 #[clap(long = "service-variable", short = 'v', number_of_values = 2, value_names = &["SERVICE", "VARIABLE"])] pub service_variables: Vec, + + /// Assign services new sources in the new environment + /// + /// GitHub repo format: // + /// + /// Docker image format: [optional registry url]/[/repo][:tag] + /// + /// Examples: + /// + /// railway environment new foo --duplicate bar --service-source docker ubuntu:latest + /// + /// railway environment new foo --duplicate bar --service-source github nodejs/node/branch + #[clap(long = "service-source", short = 's', number_of_values = 3, value_names = &["SERVICE", "PLATFORM", "SOURCE"])] + pub service_sources: Vec, } #[derive(Parser)] @@ -79,6 +97,12 @@ pub async fn command(args: Args) -> Result<()> { } async fn new_environment(args: NewArgs) -> Result<()> { + /* + * TODO: introduce a prompt: Do you want to configure a service? + * TODO: after, prompt for what you wish to configure (gh pr create style, currently Variables and Sources) + * TODO: after multi select, select services to configure in a multi-select + * TODO: iterate through all services, prompting for the configurable stuff. enter to skip anything (u wont want to configure everything on every service) + */ let mut configs = Configs::new()?; let client = GQLClient::new_authorized(&configs)?; let linked_project = configs.get_linked_project().await?; @@ -89,7 +113,9 @@ async fn new_environment(args: NewArgs) -> Result<()> { let name = select_name_new(&args, is_terminal)?; let duplicate_id = select_duplicate_id_new(&args, &project, is_terminal)?; let service_variables = - select_service_variables_new(args, &project, is_terminal, &duplicate_id)?; + select_service_variables_new(&args, &project, is_terminal, &duplicate_id)?; + let service_sources = select_service_sources_new(&args, &project, is_terminal, &duplicate_id)?; + // Use background processing when duplicating to avoid timeouts let apply_changes_in_background = duplicate_id.is_some(); @@ -127,11 +153,26 @@ async fn new_environment(args: NewArgs) -> Result<()> { env_name.magenta().bold(), "created! 🎉".green() )); - if !service_variables.is_empty() { - upsert_variables(&configs, client, project, service_variables, env_id.clone()).await?; - } else { - println!(); - } + + let (variables, sources) = tokio::join!( + upsert_variables( + &configs, + client.clone(), + project.clone(), + service_variables, + env_id.clone() + ), + upsert_sources( + &configs, + client, + project.id.clone(), + service_sources, + env_id.clone() + ) + ); + + variables?; + sources?; configs.link_project( project_id, @@ -313,6 +354,9 @@ async fn upsert_variables( service_variables: Vec<(String, Variable)>, env_id: String, ) -> Result<(), anyhow::Error> { + if service_variables.is_empty() { + return Ok(()); + } let good_vars: Vec<(String, BTreeMap)> = service_variables .chunk_by(|a, b| a.0 == b.0) // group by service id .map(|vars| { @@ -360,8 +404,142 @@ async fn upsert_variables( Ok(()) } +async fn upsert_sources( + configs: &Configs, + client: reqwest::Client, + project: String, + service_sources: Vec<(String, Source)>, + env_id: String, +) -> Result<(), anyhow::Error> { + if service_sources.is_empty() { + return Ok(()); + } + let project = get_project(&client, configs, project).await?; + let mut tasks: Vec>> = Vec::new(); + for (service_id, source) in service_sources { + let client = client.clone(); + let project = project.clone(); + let env_id = env_id.clone(); + let backboard = configs.get_backboard(); + tasks.push(tokio::spawn(async move { + /* + first check if there is a deployment trigger for the service in the environment + if there is, and the change is a github repository (match by enum type), then update the deployment trigger along with the + source (via service source and serviceinstanceupdate) + if the change is docker and the trigger, delete it + */ + let Some(environment) = project + .environments + .edges + .iter() + .find(|a| a.node.id == env_id) + else { + bail!("Environment couldn't be found, matched {env_id}"); + }; + let trigger = environment + .node + .deployment_triggers + .edges + .iter() + .find(|t| t.node.service_id == Some(service_id.clone())) + .map(|t| t.node.id.clone()); + + match source { + Source::GitHub { + owner, + repo, + branch, + } => { + let repository = format!("{owner}/{repo}"); + if let Some(id) = trigger { + // trigger already exists, update + post_graphql::( + &client, + backboard.clone(), + mutations::deployment_trigger_update::Variables { + id, + repository: repository.clone(), + branch, + }, + ) + .await?; + } else { + // trigger does not exist, so we need to make one + post_graphql::( + &client, + backboard.clone(), + mutations::deployment_trigger_create::Variables { + service_id: service_id.clone(), + environment_id: env_id.clone(), + project_id: project.id.clone(), + repository: repository.clone(), + branch, + provider: String::from("github"), + }, + ) + .await?; + } + post_graphql::( + &client, + backboard.clone(), + mutations::service_instance_update::Variables { + service_id, + environment_id: env_id, + source: mutations::service_instance_update::ServiceSourceInput { + image: None, + repo: Some(repository), + }, + }, + ) + .await?; + } + Source::Docker(image) => { + if let Some(id) = trigger { + // delete old trigger + post_graphql::( + &client, + backboard.clone(), + mutations::deployment_trigger_delete::Variables { id }, + ) + .await?; + } + // update service information to use new source + post_graphql::( + &client, + backboard.clone(), + mutations::service_instance_update::Variables { + service_id, + environment_id: env_id, + source: mutations::service_instance_update::ServiceSourceInput { + image: Some(image), + repo: None, + }, + }, + ) + .await?; + } + } + Ok(()) + })); + } + let spinner = indicatif::ProgressBar::new_spinner() + .with_style( + indicatif::ProgressStyle::default_spinner() + .tick_chars(TICK_STRING) + .template("{spinner:.green} {msg}")?, + ) + .with_message("Updating sources..."); + spinner.enable_steady_tick(Duration::from_millis(100)); + let r = futures::future::join_all(tasks).await; + for r in r { + r??; + } + spinner.finish_and_clear(); + Ok(()) +} + fn select_service_variables_new( - args: NewArgs, + args: &NewArgs, project: &queries::project::ProjectProject, is_terminal: bool, duplicate_id: &Option, @@ -397,11 +575,11 @@ fn select_service_variables_new( }; if service_meta.is_none() { println!( - "{}: Service {} not found", + "{}: Service {} not found (skipping setting variables)", "Error".red().bold(), service.blue() ); - std::process::exit(1); // returning errors in closures... oh my god... + return None; } service_meta.map(|service_meta| { fake_select( @@ -464,6 +642,193 @@ fn select_service_variables_new( Ok(service_variables) } +#[derive(Clone, EnumIter, Display, EnumString)] +pub enum SourceTypes { + #[strum(to_string = "Docker image", serialize = "docker", serialize = "image")] + Docker, + #[strum( + to_string = "GitHub repo", + serialize = "github", + serialize = "git", + serialize = "gh" + )] + GitHub, +} + +#[derive(Clone, Debug)] +enum Source { + Docker(String), + GitHub { + owner: String, + repo: String, + branch: String, + }, +} + +fn select_service_sources_new( + args: &NewArgs, + project: &queries::project::ProjectProject, + is_terminal: bool, + duplicate_id: &Option, +) -> Result> { + let Some(duplicate_id) = duplicate_id else { + // no duplicate id, nothing to change + return Ok(vec![]); + }; + + let services = project + .environments + .edges + .iter() + .find(|f| f.node.id == *duplicate_id) + .map(|f| f.node.service_instances.edges.clone()) + .unwrap_or_default(); + if !args.service_sources.is_empty() { + Ok(args + .service_sources + .chunks(3) + .filter_map(|chunk| { + // clap ensures that there will always be 3 values whenever the flag is provided + let service = chunk.first().unwrap(); + let service_meta = services + .iter() + .find(|s| { + (s.node.id.to_lowercase() == service.to_lowercase()) + || (s.node.service_name.to_lowercase() == service.to_lowercase()) + }) + .map(|s| (s.node.id.clone(), s.node.service_name.clone())); + if service_meta.is_none() { + println!( + "{}: Service {} not found (skipping updating source)", + "Error".red().bold(), + service.blue() + ); + return None; + } + let source_type = + match SourceTypes::from_str(chunk.get(1).unwrap().to_lowercase().as_str()) { + Ok(f) => { + fake_select( + "What do you want to change the source to?", + &f.to_string(), + ); + f + } + Err(_) => { + eprintln!( + "Invalid platform. Valid platforms are: {}", + SourceTypes::iter() + .map(|f| f.to_string()) + .collect::>() + .join(", ") + ); + return None; + } + }; + let source = match source_type { + SourceTypes::Docker => { + fake_select("Enter a docker image", chunk.last().unwrap()); + Some(Source::Docker(chunk.last().unwrap().to_string())) + } + SourceTypes::GitHub => match parse_repo(chunk.last().unwrap().to_string()) { + Ok(source) => Some(source), + Err(e) => { + eprintln!("{:?}", e); + return None; + } + }, + }; + source.as_ref()?; + service_meta.map(|service_meta| { + fake_select( + "Select a service to change the source for", + service_meta.1.as_str(), + ); + ( + service_meta.0, // id + source.unwrap(), + ) + }) + }) + .collect::>()) + } else if is_terminal { + let mut sources: Vec<(String, Source)> = Vec::new(); + let p_services = services + .iter() + .map(|s| PromptServiceInstance(&s.node)) + .collect::>(); + let mut used_services: Vec<&PromptServiceInstance> = Vec::new(); + loop { + let prompt_services: Vec<&PromptServiceInstance<'_>> = p_services + .iter() + .filter(|p| !used_services.contains(p)) + .clone() + .collect(); + if prompt_services.is_empty() { + break; + } + let service = prompt_options_skippable( + "Select a service to change the source for ", + prompt_services, + )?; + if let Some(service) = service { + let Some(kind) = prompt_options_skippable( + "What do you want to change the source to?", + SourceTypes::iter().collect(), + )? + else { + continue; + }; + sources.push(( + service.0.id.clone(), + match kind { + SourceTypes::GitHub => { + match parse_repo(prompt_text_with_placeholder_disappear( + "Enter a repo", + "//", + )?) { + Ok(r) => r, + Err(e) => { + eprintln!("{:?}", e); + continue; + } + } + } + SourceTypes::Docker => { + Source::Docker(prompt_text_with_placeholder_disappear( + "Enter a docker image", + "[optional registry]//[repo][:tag]", + )?) + } + }, + )); + used_services.push(service) + } else { + break; + } + } + Ok(sources) + } else { + Ok(Vec::new()) + } +} + +fn parse_repo(repo: String) -> Result { + let s = repo + .splitn(3, '/') + .filter(|&s| !s.is_empty()) + .map(|s| s.to_string()) + .collect::>(); + match s.len() { + 3 => Ok(Source::GitHub { + owner: s.first().unwrap().to_string(), + repo: s.get(1).unwrap().to_string(), + branch: s.get(2).unwrap().to_string(), + }), + _ => anyhow::bail!("malformed repo: //"), + } +} + fn select_duplicate_id_new( args: &NewArgs, project: &queries::project::ProjectProject, diff --git a/src/gql/mutations/mod.rs b/src/gql/mutations/mod.rs index ddc411a95..e6574214c 100644 --- a/src/gql/mutations/mod.rs +++ b/src/gql/mutations/mod.rs @@ -206,6 +206,42 @@ pub struct EnvironmentDelete; )] pub struct FunctionUpdate; +#[derive(GraphQLQuery)] +#[graphql( + schema_path = "src/gql/schema.json", + query_path = "src/gql/mutations/strings/ServiceInstanceUpdate.graphql", + response_derives = "Debug, Serialize, Clone", + skip_serializing_none +)] +pub struct ServiceInstanceUpdate; + +#[derive(GraphQLQuery)] +#[graphql( + schema_path = "src/gql/schema.json", + query_path = "src/gql/mutations/strings/DeploymentTriggerUpdate.graphql", + response_derives = "Debug, Serialize, Clone", + skip_serializing_none +)] +pub struct DeploymentTriggerUpdate; + +#[derive(GraphQLQuery)] +#[graphql( + schema_path = "src/gql/schema.json", + query_path = "src/gql/mutations/strings/DeploymentTriggerDelete.graphql", + response_derives = "Debug, Serialize, Clone", + skip_serializing_none +)] +pub struct DeploymentTriggerDelete; + +#[derive(GraphQLQuery)] +#[graphql( + schema_path = "src/gql/schema.json", + query_path = "src/gql/mutations/strings/DeploymentTriggerCreate.graphql", + response_derives = "Debug, Serialize, Clone", + skip_serializing_none +)] +pub struct DeploymentTriggerCreate; + impl std::fmt::Display for custom_domain_create::DNSRecordType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { diff --git a/src/gql/mutations/strings/DeploymentTriggerCreate.graphql b/src/gql/mutations/strings/DeploymentTriggerCreate.graphql new file mode 100644 index 000000000..3d90bac10 --- /dev/null +++ b/src/gql/mutations/strings/DeploymentTriggerCreate.graphql @@ -0,0 +1,7 @@ +mutation DeploymentTriggerCreate($serviceId: String!, $environmentId: String!, $projectId: String!, $repository: String!, $branch: String!, $provider: String!) { + deploymentTriggerCreate( + input: {serviceId: $serviceId, projectId: $projectId, environmentId: $environmentId, repository: $repository, branch: $branch, provider: $provider} + ) { + id + } +} \ No newline at end of file diff --git a/src/gql/mutations/strings/DeploymentTriggerDelete.graphql b/src/gql/mutations/strings/DeploymentTriggerDelete.graphql new file mode 100644 index 000000000..aa0faabbf --- /dev/null +++ b/src/gql/mutations/strings/DeploymentTriggerDelete.graphql @@ -0,0 +1,3 @@ +mutation DeploymentTriggerDelete($id: String!) { + deploymentTriggerDelete(id: $id) +} \ No newline at end of file diff --git a/src/gql/mutations/strings/DeploymentTriggerUpdate.graphql b/src/gql/mutations/strings/DeploymentTriggerUpdate.graphql new file mode 100644 index 000000000..3a8fa987a --- /dev/null +++ b/src/gql/mutations/strings/DeploymentTriggerUpdate.graphql @@ -0,0 +1,8 @@ +mutation DeploymentTriggerUpdate($id: String!, $repository: String!, $branch: String!) { + deploymentTriggerUpdate( + id: $id + input: {repository: $repository, branch: $branch} + ) { + id + } +} \ No newline at end of file diff --git a/src/gql/mutations/strings/ServiceInstanceUpdate.graphql b/src/gql/mutations/strings/ServiceInstanceUpdate.graphql new file mode 100644 index 000000000..ff469a40f --- /dev/null +++ b/src/gql/mutations/strings/ServiceInstanceUpdate.graphql @@ -0,0 +1,7 @@ +mutation ServiceInstanceUpdate($serviceId: String!, $environmentId: String!, $source: ServiceSourceInput!) { + serviceInstanceUpdate( + environmentId: $environmentId + serviceId: $serviceId + input: {source: $source} + ) +} \ No newline at end of file diff --git a/src/gql/queries/strings/Project.graphql b/src/gql/queries/strings/Project.graphql index 5cb338d98..f1f3d9cbb 100644 --- a/src/gql/queries/strings/Project.graphql +++ b/src/gql/queries/strings/Project.graphql @@ -13,6 +13,16 @@ query Project($id: String!) { name canAccess deletedAt + deploymentTriggers { + edges { + node { + branch + id + repository + serviceId + } + } + } serviceInstances { edges { node { @@ -77,4 +87,4 @@ query Project($id: String!) { } } } -} +} \ No newline at end of file diff --git a/src/gql/schema.json b/src/gql/schema.json index 792d8106d..713b4f3c6 100644 --- a/src/gql/schema.json +++ b/src/gql/schema.json @@ -146,7 +146,7 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "BUCKETS" + "name": "AUDIT_LOGS" }, { "deprecationReason": null, @@ -158,19 +158,7 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "ENVIRONMENT_RESTRICTIONS" - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "GLOBAL_BUCKET_REGION" - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "HTTP_SERVICE_METRICS" + "name": "CONVERSATIONAL_UI" }, { "deprecationReason": null, @@ -182,7 +170,7 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "MONOREPO_SUPPORT" + "name": "POSTGRES_HA" }, { "deprecationReason": null, @@ -195,12 +183,6 @@ "description": null, "isDeprecated": false, "name": "RAW_SQL_QUERIES" - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "UNIFIED_TEMPLATE_EDITOR" } ], "fields": null, @@ -223,13 +205,13 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "BUCKETS" + "name": "BUILDER_V3_ROLLOUT_EXISTING_SERVICES" }, { "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "BUILDER_V3_ROLLOUT_EXISTING_SERVICES" + "name": "BUILDER_V3_ROLLOUT_EXISTING_SERVICES_PRO" }, { "deprecationReason": null, @@ -237,6 +219,12 @@ "isDeprecated": false, "name": "BUILDER_V3_ROLLOUT_NEW_SERVICES" }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "BUILDER_V3_ROLLOUT_NEW_SERVICES_PRO" + }, { "deprecationReason": null, "description": null, @@ -259,7 +247,19 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "MONOREPO_SUPPORT" + "name": "SCYLLADB_ROUTING_ENABLED" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "SERVICEINSTANCE_DATALOADER_FOR_STATIC_URL" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "SPLIT_USAGE_QUERIES" }, { "deprecationReason": null, @@ -296,6 +296,18 @@ "isDeprecated": false, "name": "COPY_VOLUME_TO_ENVIRONMENT" }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "ENABLE_DOCKER_EXTENSION" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "ENABLE_ONLINE_VOLUME_RESIZING" + }, { "deprecationReason": null, "description": null, @@ -912,6 +924,41 @@ "name": "ApiToken", "possibleTypes": null }, + { + "description": "Information about the current API token and its accessible workspaces.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "Workspaces this subject can operate on via this token or session.", + "isDeprecated": false, + "name": "workspaces", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ApiTokenWorkspace", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "ApiTokenContext", + "possibleTypes": null + }, { "description": null, "enumValues": null, @@ -990,6 +1037,49 @@ "name": "ApiTokenRateLimit", "possibleTypes": null }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "ApiTokenWorkspace", + "possibleTypes": null + }, { "description": null, "enumValues": null, @@ -1078,10 +1168,38 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "actor", + "name": "context", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "createdAt", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "environment", "type": { "kind": "OBJECT", - "name": "User", + "name": "Environment", "ofType": null } }, @@ -1090,7 +1208,7 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "banReason", + "name": "environmentId", "type": { "kind": "SCALAR", "name": "String", @@ -1102,13 +1220,13 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "createdAt", + "name": "eventType", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "DateTime", + "name": "String", "ofType": null } } @@ -1128,6 +1246,54 @@ "ofType": null } } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "payload", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "project", + "type": { + "kind": "OBJECT", + "name": "Project", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "projectId", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "workspaceId", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } } ], "inputFields": null, @@ -1139,7 +1305,119 @@ } ], "kind": "OBJECT", - "name": "BanReasonHistory", + "name": "AuditLog", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "eventType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "AuditLogEventTypeInfo", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "Filter events created on or before this date", + "name": "endDate", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Filter events for a single environment", + "name": "environmentId", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "List of event types to filter by", + "name": "eventTypes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + { + "defaultValue": null, + "description": "Filter events for a single project", + "name": "projectId", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Filter events created on or after this date", + "name": "startDate", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "AuditLogFilterInput", "possibleTypes": null }, { @@ -1438,6 +1716,95 @@ "name": "CertificateStatus", "possibleTypes": null }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "CERTIFICATE_STATUS_TYPE_DETAILED_CLEANING_UP" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "CERTIFICATE_STATUS_TYPE_DETAILED_COMPLETE" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "CERTIFICATE_STATUS_TYPE_DETAILED_CREATING_ORDER" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "CERTIFICATE_STATUS_TYPE_DETAILED_DOWNLOADING_CERTIFICATE" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "CERTIFICATE_STATUS_TYPE_DETAILED_FAILED" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "CERTIFICATE_STATUS_TYPE_DETAILED_FETCHING_AUTHORIZATIONS" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "CERTIFICATE_STATUS_TYPE_DETAILED_FINALIZING_ORDER" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "CERTIFICATE_STATUS_TYPE_DETAILED_GENERATING_KEYS" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "CERTIFICATE_STATUS_TYPE_DETAILED_INITIATING_CHALLENGES" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "CERTIFICATE_STATUS_TYPE_DETAILED_POLLING_AUTHORIZATIONS" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "CERTIFICATE_STATUS_TYPE_DETAILED_PRESENTING_CHALLENGES" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "CERTIFICATE_STATUS_TYPE_DETAILED_UNSPECIFIED" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "UNRECOGNIZED" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "CertificateStatusDetailed", + "possibleTypes": null + }, { "description": null, "enumValues": null, @@ -2180,6 +2547,18 @@ } } }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "certificateStatusDetailed", + "type": { + "kind": "ENUM", + "name": "CertificateStatusDetailed", + "ofType": null + } + }, { "args": [], "deprecationReason": null, @@ -5556,6 +5935,18 @@ } } }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "certificateStatusDetailed", + "type": { + "kind": "ENUM", + "name": "CertificateStatusDetailed", + "ofType": null + } + }, { "args": [], "deprecationReason": null, @@ -5770,6 +6161,33 @@ } } }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "decryptVariables", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "config", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "EnvironmentConfig", + "ofType": null + } + } + }, { "args": [], "deprecationReason": null, @@ -6213,7 +6631,7 @@ "possibleTypes": null }, { - "description": null, + "description": "\nEnvironmentConfig is a custom scalar type that represents the serializedConfig for an environment.\nJSON Schema: https://backboard.railway.com/schema/environment.schema.json\n", "enumValues": null, "fields": null, "inputFields": null, @@ -6527,6 +6945,18 @@ "ofType": null } }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "latestSuccessfulGitHubDeploymentId", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, { "args": [], "deprecationReason": null, @@ -6698,6 +7128,33 @@ "ofType": null } }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "decryptVariables", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "patch", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "EnvironmentConfig", + "ofType": null + } + } + }, { "args": [], "deprecationReason": null, @@ -9912,6 +10369,22 @@ } } }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "start", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, { "args": [], "deprecationReason": null, @@ -11498,6 +11971,57 @@ } } }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "commitMessage", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "environmentId", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Skip deploys for services affected by this patch.", + "name": "skipDeploys", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Commits the staged changes for a single environment.", + "isDeprecated": false, + "name": "environmentPatchCommitStaged", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, { "args": [ { @@ -11543,6 +12067,51 @@ } } }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "environmentId", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "input", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "EnvironmentConfig", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Sets the staged patch for a single environment.", + "isDeprecated": false, + "name": "environmentStageChanges", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "EnvironmentPatch", + "ofType": null + } + } + }, { "args": [ { @@ -15261,6 +15830,16 @@ }, { "args": [ + { + "defaultValue": null, + "description": "Optional name/label for the backup. Defaults to 'Manual' if not provided.", + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, { "defaultValue": null, "description": "The id of the volume instance to create a backup of", @@ -15958,7 +16537,7 @@ }, { "kind": "OBJECT", - "name": "BanReasonHistory", + "name": "AuditLog", "ofType": null }, { @@ -16111,16 +16690,6 @@ "name": "ReferralInfo", "ofType": null }, - { - "kind": "OBJECT", - "name": "RefundRequest", - "ofType": null - }, - { - "kind": "OBJECT", - "name": "ReissuedInvoice", - "ofType": null - }, { "kind": "OBJECT", "name": "Service", @@ -16156,11 +16725,6 @@ "name": "TemplateService", "ofType": null }, - { - "kind": "OBJECT", - "name": "UsageAnomaly", - "ofType": null - }, { "kind": "OBJECT", "name": "UsageLimit", @@ -16171,11 +16735,6 @@ "name": "User", "ofType": null }, - { - "kind": "OBJECT", - "name": "UserGithubRepo", - "ofType": null - }, { "kind": "OBJECT", "name": "Variable", @@ -16196,16 +16755,6 @@ "name": "VolumeInstanceBackupSchedule", "ofType": null }, - { - "kind": "OBJECT", - "name": "Withdrawal", - "ofType": null - }, - { - "kind": "OBJECT", - "name": "WithdrawalAccount", - "ofType": null - }, { "kind": "OBJECT", "name": "Workspace", @@ -18349,13 +18898,13 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "BUCKETS" + "name": "BUILDER_V3_ROLLOUT_EXISTING_SERVICES" }, { "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "BUILDER_V3_ROLLOUT_EXISTING_SERVICES" + "name": "BUILDER_V3_ROLLOUT_EXISTING_SERVICES_PRO" }, { "deprecationReason": null, @@ -18363,6 +18912,12 @@ "isDeprecated": false, "name": "BUILDER_V3_ROLLOUT_NEW_SERVICES" }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "BUILDER_V3_ROLLOUT_NEW_SERVICES_PRO" + }, { "deprecationReason": null, "description": null, @@ -18385,7 +18940,19 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "MONOREPO_SUPPORT" + "name": "SCYLLADB_ROUTING_ENABLED" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "SERVICEINSTANCE_DATALOADER_FOR_STATIC_URL" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "SPLIT_USAGE_QUERIES" }, { "deprecationReason": null, @@ -19992,34 +20559,6 @@ } } }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "createdAt", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "DateTime", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "deletedAt", - "type": { - "kind": "SCALAR", - "name": "DateTime", - "ofType": null - } - }, { "args": [ { @@ -20063,73 +20602,32 @@ } } ], - "deprecationReason": "Use environment.deploymentTriggers for properly scoped access control", + "deprecationReason": null, "description": null, - "isDeprecated": true, - "name": "deploymentTriggers", + "isDeprecated": false, + "name": "buckets", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "OBJECT", - "name": "ProjectDeploymentTriggersConnection", + "name": "ProjectBucketsConnection", "ofType": null } } }, { - "args": [ - { - "defaultValue": null, - "description": null, - "name": "after", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - { - "defaultValue": null, - "description": null, - "name": "before", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - { - "defaultValue": null, - "description": null, - "name": "first", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - } - }, - { - "defaultValue": null, - "description": null, - "name": "last", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - } - } - ], - "deprecationReason": "Use environment.deployments for properly scoped access control", + "args": [], + "deprecationReason": null, "description": null, - "isDeprecated": true, - "name": "deployments", + "isDeprecated": false, + "name": "createdAt", "type": { "kind": "NON_NULL", "name": null, "ofType": { - "kind": "OBJECT", - "name": "ProjectDeploymentsConnection", + "kind": "SCALAR", + "name": "DateTime", "ofType": null } } @@ -20139,10 +20637,10 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "description", + "name": "deletedAt", "type": { "kind": "SCALAR", - "name": "String", + "name": "DateTime", "ofType": null } }, @@ -20189,32 +20687,20 @@ } } ], - "deprecationReason": null, + "deprecationReason": "Use environment.deploymentTriggers for properly scoped access control", "description": null, - "isDeprecated": false, - "name": "environments", + "isDeprecated": true, + "name": "deploymentTriggers", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "OBJECT", - "name": "ProjectEnvironmentsConnection", + "name": "ProjectDeploymentTriggersConnection", "ofType": null } } }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "expiredAt", - "type": { - "kind": "SCALAR", - "name": "DateTime", - "ofType": null - } - }, { "args": [ { @@ -20258,64 +20744,16 @@ } } ], - "deprecationReason": null, + "deprecationReason": "Use environment.deployments for properly scoped access control", "description": null, - "isDeprecated": false, - "name": "groups", + "isDeprecated": true, + "name": "deployments", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "OBJECT", - "name": "ProjectGroupsConnection", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "id", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isPublic", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isTempProject", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", + "name": "ProjectDeploymentsConnection", "ofType": null } } @@ -20325,39 +20763,11 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "members", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "ProjectMember", - "ofType": null - } - } - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", + "name": "description", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } + "kind": "SCALAR", + "name": "String", + "ofType": null } }, { @@ -20403,16 +20813,16 @@ } } ], - "deprecationReason": "Plugins have been removed", + "deprecationReason": null, "description": null, - "isDeprecated": true, - "name": "plugins", + "isDeprecated": false, + "name": "environments", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "OBJECT", - "name": "ProjectPluginsConnection", + "name": "ProjectEnvironmentsConnection", "ofType": null } } @@ -20422,15 +20832,229 @@ "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "prDeploys", + "name": "expiredAt", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "after", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "before", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "first", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "last", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "groups", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ProjectGroupsConnection", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isPublic", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isTempProject", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "members", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ProjectMember", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "after", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "before", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "first", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "last", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + ], + "deprecationReason": "Plugins have been removed", + "description": null, + "isDeprecated": true, + "name": "plugins", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ProjectPluginsConnection", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "prDeploys", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } } }, { @@ -20713,6 +21337,84 @@ "name": "Project", "possibleTypes": null }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "edges", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ProjectBucketsConnectionEdge", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "pageInfo", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "ProjectBucketsConnection", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "cursor", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "ProjectBucketsConnectionEdge", + "possibleTypes": null + }, { "description": null, "enumValues": null, @@ -23452,6 +24154,22 @@ } } }, + { + "args": [], + "deprecationReason": null, + "description": "Introspect the current API token and its accessible workspaces.", + "isDeprecated": false, + "name": "apiToken", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ApiTokenContext", + "ofType": null + } + } + }, { "args": [ { @@ -23509,6 +24227,166 @@ } } }, + { + "args": [ + { + "defaultValue": null, + "description": "The ID of the audit log entry", + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "The ID of the workspace", + "name": "workspaceId", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get an audit log by ID", + "isDeprecated": false, + "name": "auditLog", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "AuditLog", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get a list of all audit log event types and their description", + "isDeprecated": false, + "name": "auditLogEventTypeInfo", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "AuditLogEventTypeInfo", + "ofType": null + } + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "after", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "before", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "filter", + "type": { + "kind": "INPUT_OBJECT", + "name": "AuditLogFilterInput", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "first", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "last", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "sort", + "type": { + "kind": "ENUM", + "name": "SortOrder", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "workspaceId", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Gets audit logs for a workspace.", + "isDeprecated": false, + "name": "auditLogs", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "QueryAuditLogsConnection", + "ofType": null + } + } + }, { "args": [ { @@ -25695,68 +26573,65 @@ { "defaultValue": null, "description": null, - "name": "id", + "name": "after", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } + "kind": "SCALAR", + "name": "String", + "ofType": null } - } - ], - "deprecationReason": null, - "description": "", - "isDeprecated": false, - "name": "node", - "type": { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - } - }, - { - "args": [ + }, { "defaultValue": null, "description": null, - "name": "ids", + "name": "before", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - } - } + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "filter", + "type": { + "kind": "INPUT_OBJECT", + "name": "NotificationDeliveryFilterInput", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "first", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "last", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null } } ], "deprecationReason": null, - "description": "", + "description": "Gets notification deliveries for the authenticated user", "isDeprecated": false, - "name": "nodes", + "name": "notificationDeliveries", "type": { "kind": "NON_NULL", "name": null, "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - } + "kind": "OBJECT", + "name": "QueryNotificationDeliveriesConnection", + "ofType": null } } }, @@ -25785,11 +26660,15 @@ { "defaultValue": null, "description": null, - "name": "filter", + "name": "environmentId", "type": { - "kind": "INPUT_OBJECT", - "name": "NotificationDeliveryFilterInput", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } } }, { @@ -25814,86 +26693,15 @@ } ], "deprecationReason": null, - "description": "Gets notification deliveries for the authenticated user", + "description": "Get all observability dashboards for an environment", "isDeprecated": false, - "name": "notificationDeliveries", + "name": "observabilityDashboards", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryNotificationDeliveriesConnection", - "ofType": null - } - } - }, - { - "args": [ - { - "defaultValue": null, - "description": null, - "name": "after", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - { - "defaultValue": null, - "description": null, - "name": "before", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - { - "defaultValue": null, - "description": null, - "name": "environmentId", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - }, - { - "defaultValue": null, - "description": null, - "name": "first", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - } - }, - { - "defaultValue": null, - "description": null, - "name": "last", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - } - } - ], - "deprecationReason": null, - "description": "Get all observability dashboards for an environment", - "isDeprecated": false, - "name": "observabilityDashboards", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "QueryObservabilityDashboardsConnection", + "name": "QueryObservabilityDashboardsConnection", "ofType": null } } @@ -27347,6 +28155,37 @@ } } }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get the metrics for a template.", + "isDeprecated": false, + "name": "templateMetrics", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "TemplateMetrics", + "ofType": null + } + } + }, { "args": [ { @@ -28394,7 +29233,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryDeploymentEventsConnectionEdge", + "name": "QueryAuditLogsConnectionEdge", "ofType": null } } @@ -28421,7 +29260,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryDeploymentEventsConnection", + "name": "QueryAuditLogsConnection", "possibleTypes": null }, { @@ -28455,7 +29294,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "DeploymentEvent", + "name": "AuditLog", "ofType": null } } @@ -28464,7 +29303,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryDeploymentEventsConnectionEdge", + "name": "QueryAuditLogsConnectionEdge", "possibleTypes": null }, { @@ -28488,7 +29327,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryDeploymentInstanceExecutionsConnectionEdge", + "name": "QueryDeploymentEventsConnectionEdge", "ofType": null } } @@ -28515,7 +29354,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryDeploymentInstanceExecutionsConnection", + "name": "QueryDeploymentEventsConnection", "possibleTypes": null }, { @@ -28549,7 +29388,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "DeploymentInstanceExecution", + "name": "DeploymentEvent", "ofType": null } } @@ -28558,7 +29397,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryDeploymentInstanceExecutionsConnectionEdge", + "name": "QueryDeploymentEventsConnectionEdge", "possibleTypes": null }, { @@ -28582,7 +29421,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryDeploymentTriggersConnectionEdge", + "name": "QueryDeploymentInstanceExecutionsConnectionEdge", "ofType": null } } @@ -28609,7 +29448,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryDeploymentTriggersConnection", + "name": "QueryDeploymentInstanceExecutionsConnection", "possibleTypes": null }, { @@ -28643,7 +29482,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "DeploymentTrigger", + "name": "DeploymentInstanceExecution", "ofType": null } } @@ -28652,7 +29491,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryDeploymentTriggersConnectionEdge", + "name": "QueryDeploymentInstanceExecutionsConnectionEdge", "possibleTypes": null }, { @@ -28676,7 +29515,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryDeploymentsConnectionEdge", + "name": "QueryDeploymentTriggersConnectionEdge", "ofType": null } } @@ -28703,7 +29542,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryDeploymentsConnection", + "name": "QueryDeploymentTriggersConnection", "possibleTypes": null }, { @@ -28737,7 +29576,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Deployment", + "name": "DeploymentTrigger", "ofType": null } } @@ -28746,7 +29585,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryDeploymentsConnectionEdge", + "name": "QueryDeploymentTriggersConnectionEdge", "possibleTypes": null }, { @@ -28770,7 +29609,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryEnvironmentPatchesConnectionEdge", + "name": "QueryDeploymentsConnectionEdge", "ofType": null } } @@ -28797,7 +29636,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryEnvironmentPatchesConnection", + "name": "QueryDeploymentsConnection", "possibleTypes": null }, { @@ -28831,7 +29670,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "EnvironmentPatch", + "name": "Deployment", "ofType": null } } @@ -28840,7 +29679,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryEnvironmentPatchesConnectionEdge", + "name": "QueryDeploymentsConnectionEdge", "possibleTypes": null }, { @@ -28864,7 +29703,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryEnvironmentsConnectionEdge", + "name": "QueryEnvironmentPatchesConnectionEdge", "ofType": null } } @@ -28891,7 +29730,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryEnvironmentsConnection", + "name": "QueryEnvironmentPatchesConnection", "possibleTypes": null }, { @@ -28925,7 +29764,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Environment", + "name": "EnvironmentPatch", "ofType": null } } @@ -28934,7 +29773,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryEnvironmentsConnectionEdge", + "name": "QueryEnvironmentPatchesConnectionEdge", "possibleTypes": null }, { @@ -28958,7 +29797,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryEventsConnectionEdge", + "name": "QueryEnvironmentsConnectionEdge", "ofType": null } } @@ -28985,7 +29824,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryEventsConnection", + "name": "QueryEnvironmentsConnection", "possibleTypes": null }, { @@ -29019,7 +29858,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Event", + "name": "Environment", "ofType": null } } @@ -29028,7 +29867,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryEventsConnectionEdge", + "name": "QueryEnvironmentsConnectionEdge", "possibleTypes": null }, { @@ -29052,7 +29891,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryIntegrationAuthsConnectionEdge", + "name": "QueryEventsConnectionEdge", "ofType": null } } @@ -29079,7 +29918,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryIntegrationAuthsConnection", + "name": "QueryEventsConnection", "possibleTypes": null }, { @@ -29113,7 +29952,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "IntegrationAuth", + "name": "Event", "ofType": null } } @@ -29122,7 +29961,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryIntegrationAuthsConnectionEdge", + "name": "QueryEventsConnectionEdge", "possibleTypes": null }, { @@ -29146,7 +29985,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryIntegrationsConnectionEdge", + "name": "QueryIntegrationAuthsConnectionEdge", "ofType": null } } @@ -29173,7 +30012,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryIntegrationsConnection", + "name": "QueryIntegrationAuthsConnection", "possibleTypes": null }, { @@ -29207,7 +30046,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Integration", + "name": "IntegrationAuth", "ofType": null } } @@ -29216,7 +30055,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryIntegrationsConnectionEdge", + "name": "QueryIntegrationAuthsConnectionEdge", "possibleTypes": null }, { @@ -29240,7 +30079,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryNotificationDeliveriesConnectionEdge", + "name": "QueryIntegrationsConnectionEdge", "ofType": null } } @@ -29267,7 +30106,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryNotificationDeliveriesConnection", + "name": "QueryIntegrationsConnection", "possibleTypes": null }, { @@ -29301,7 +30140,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "NotificationDelivery", + "name": "Integration", "ofType": null } } @@ -29310,7 +30149,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryNotificationDeliveriesConnectionEdge", + "name": "QueryIntegrationsConnectionEdge", "possibleTypes": null }, { @@ -29334,7 +30173,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryObservabilityDashboardsConnectionEdge", + "name": "QueryNotificationDeliveriesConnectionEdge", "ofType": null } } @@ -29361,7 +30200,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryObservabilityDashboardsConnection", + "name": "QueryNotificationDeliveriesConnection", "possibleTypes": null }, { @@ -29395,7 +30234,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "ObservabilityDashboard", + "name": "NotificationDelivery", "ofType": null } } @@ -29404,7 +30243,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryObservabilityDashboardsConnectionEdge", + "name": "QueryNotificationDeliveriesConnectionEdge", "possibleTypes": null }, { @@ -29428,7 +30267,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryPasskeysConnectionEdge", + "name": "QueryObservabilityDashboardsConnectionEdge", "ofType": null } } @@ -29455,7 +30294,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryPasskeysConnection", + "name": "QueryObservabilityDashboardsConnection", "possibleTypes": null }, { @@ -29489,7 +30328,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Passkey", + "name": "ObservabilityDashboard", "ofType": null } } @@ -29498,7 +30337,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryPasskeysConnectionEdge", + "name": "QueryObservabilityDashboardsConnectionEdge", "possibleTypes": null }, { @@ -29522,7 +30361,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryProjectTokensConnectionEdge", + "name": "QueryPasskeysConnectionEdge", "ofType": null } } @@ -29549,7 +30388,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryProjectTokensConnection", + "name": "QueryPasskeysConnection", "possibleTypes": null }, { @@ -29583,7 +30422,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "ProjectToken", + "name": "Passkey", "ofType": null } } @@ -29592,7 +30431,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryProjectTokensConnectionEdge", + "name": "QueryPasskeysConnectionEdge", "possibleTypes": null }, { @@ -29616,7 +30455,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryProjectsConnectionEdge", + "name": "QueryProjectTokensConnectionEdge", "ofType": null } } @@ -29643,7 +30482,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryProjectsConnection", + "name": "QueryProjectTokensConnection", "possibleTypes": null }, { @@ -29677,7 +30516,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Project", + "name": "ProjectToken", "ofType": null } } @@ -29686,7 +30525,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryProjectsConnectionEdge", + "name": "QueryProjectTokensConnectionEdge", "possibleTypes": null }, { @@ -29710,7 +30549,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QuerySessionsConnectionEdge", + "name": "QueryProjectsConnectionEdge", "ofType": null } } @@ -29737,7 +30576,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QuerySessionsConnection", + "name": "QueryProjectsConnection", "possibleTypes": null }, { @@ -29771,7 +30610,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Session", + "name": "Project", "ofType": null } } @@ -29780,7 +30619,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QuerySessionsConnectionEdge", + "name": "QueryProjectsConnectionEdge", "possibleTypes": null }, { @@ -29804,7 +30643,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryTeamTemplatesConnectionEdge", + "name": "QuerySessionsConnectionEdge", "ofType": null } } @@ -29831,7 +30670,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryTeamTemplatesConnection", + "name": "QuerySessionsConnection", "possibleTypes": null }, { @@ -29865,7 +30704,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Template", + "name": "Session", "ofType": null } } @@ -29874,7 +30713,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryTeamTemplatesConnectionEdge", + "name": "QuerySessionsConnectionEdge", "possibleTypes": null }, { @@ -29898,7 +30737,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryTemplatesConnectionEdge", + "name": "QueryTeamTemplatesConnectionEdge", "ofType": null } } @@ -29925,7 +30764,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryTemplatesConnection", + "name": "QueryTeamTemplatesConnection", "possibleTypes": null }, { @@ -29968,7 +30807,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryTemplatesConnectionEdge", + "name": "QueryTeamTemplatesConnectionEdge", "possibleTypes": null }, { @@ -29992,7 +30831,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryTrustedDomainsConnectionEdge", + "name": "QueryTemplatesConnectionEdge", "ofType": null } } @@ -30019,7 +30858,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryTrustedDomainsConnection", + "name": "QueryTemplatesConnection", "possibleTypes": null }, { @@ -30053,7 +30892,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "TrustedDomain", + "name": "Template", "ofType": null } } @@ -30062,7 +30901,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryTrustedDomainsConnectionEdge", + "name": "QueryTemplatesConnectionEdge", "possibleTypes": null }, { @@ -30086,7 +30925,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryUserTemplatesConnectionEdge", + "name": "QueryTrustedDomainsConnectionEdge", "ofType": null } } @@ -30113,7 +30952,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryUserTemplatesConnection", + "name": "QueryTrustedDomainsConnection", "possibleTypes": null }, { @@ -30147,7 +30986,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Template", + "name": "TrustedDomain", "ofType": null } } @@ -30156,7 +30995,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryUserTemplatesConnectionEdge", + "name": "QueryTrustedDomainsConnectionEdge", "possibleTypes": null }, { @@ -30180,7 +31019,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryWorkspaceIdentityProvidersConnectionEdge", + "name": "QueryUserTemplatesConnectionEdge", "ofType": null } } @@ -30207,7 +31046,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryWorkspaceIdentityProvidersConnection", + "name": "QueryUserTemplatesConnection", "possibleTypes": null }, { @@ -30241,7 +31080,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "WorkspaceIdentityProvider", + "name": "Template", "ofType": null } } @@ -30250,7 +31089,7 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryWorkspaceIdentityProvidersConnectionEdge", + "name": "QueryUserTemplatesConnectionEdge", "possibleTypes": null }, { @@ -30274,7 +31113,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "QueryWorkspaceTemplatesConnectionEdge", + "name": "QueryWorkspaceIdentityProvidersConnectionEdge", "ofType": null } } @@ -30301,7 +31140,101 @@ "inputFields": null, "interfaces": [], "kind": "OBJECT", - "name": "QueryWorkspaceTemplatesConnection", + "name": "QueryWorkspaceIdentityProvidersConnection", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "cursor", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "node", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkspaceIdentityProvider", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "QueryWorkspaceIdentityProvidersConnectionEdge", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "edges", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "QueryWorkspaceTemplatesConnectionEdge", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "pageInfo", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "QueryWorkspaceTemplatesConnection", "possibleTypes": null }, { @@ -30678,168 +31611,6 @@ "name": "ReferralUser", "possibleTypes": null }, - { - "description": null, - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "amount", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "decision", - "type": { - "kind": "ENUM", - "name": "RefundRequestDecisionEnum", - "ofType": null - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "id", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "invoiceId", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "plainThreadId", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "reason", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "userId", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "workspace", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Workspace", - "ofType": null - } - } - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - } - ], - "kind": "OBJECT", - "name": "RefundRequest", - "possibleTypes": null - }, - { - "description": "Possible decisions for a RefundRequest", - "enumValues": [ - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "AUTO_REFUNDED" - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "AUTO_REJECTED" - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "MANUALLY_REFUNDED" - } - ], - "fields": null, - "inputFields": null, - "interfaces": null, - "kind": "ENUM", - "name": "RefundRequestDecisionEnum", - "possibleTypes": null - }, { "description": null, "enumValues": null, @@ -31125,99 +31896,6 @@ "name": "RegistryCredentialsInput", "possibleTypes": null }, - { - "description": null, - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "id", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "originalInvoiceId", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "reissuedInvoiceId", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "workspace", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Workspace", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "workspaceId", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - } - ], - "kind": "OBJECT", - "name": "ReissuedInvoice", - "possibleTypes": null - }, { "description": null, "enumValues": [ @@ -31440,7 +32118,7 @@ "possibleTypes": null }, { - "description": null, + "description": "\nSerializedTemplateConfig is a custom scalar type that represents the serializedConfig for a template.\nJSON Schema: https://backboard.railway.com/schema/template.schema.json\n", "enumValues": null, "fields": null, "inputFields": null, @@ -33926,6 +34604,29 @@ "name": "SimilarTemplate", "possibleTypes": null }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "asc" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "desc" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "SortOrder", + "possibleTypes": null + }, { "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.", "enumValues": null, @@ -34526,6 +35227,22 @@ "ofType": null } } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "couponName", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } } ], "inputFields": null, @@ -34554,6 +35271,18 @@ } } }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "priceDollars", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, { "args": [], "deprecationReason": null, @@ -34721,7 +35450,7 @@ "possibleTypes": null }, { - "description": null, + "description": "\nSupport Health Metrics for Template Support Bonus Calculation..\nContains metrics calculated from community support thread performance:\n- solved: Percentage (0-100) of solved threads\n- csat: Percentage (0-100) of threads with positive customer satisfaction\n- aggregateHealth: Average of solved and csat when both available, otherwise just solved percentage\nTemplates with aggregateHealth >= 80 qualify for support bonus (additional 10% kickback).\n", "enumValues": null, "fields": null, "inputFields": null, @@ -36725,6 +37454,161 @@ "name": "TemplateMetadata", "possibleTypes": null }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "activeDeployments", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "deploymentsLast90Days", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "earningsLast30Days", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "earningsLast90Days", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "eligibleForSupportBonus", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "supportHealth", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "templateHealth", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "totalDeployments", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "totalEarnings", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "TemplateMetrics", + "possibleTypes": null + }, { "description": null, "enumValues": null, @@ -37445,199 +38329,40 @@ "inputFields": null, "interfaces": null, "kind": "ENUM", - "name": "TwoFactorMethodCompliance", - "possibleTypes": null - }, - { - "description": null, - "enumValues": [ - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "AUTHENTICATOR" - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "PASSKEY" - } - ], - "fields": null, - "inputFields": null, - "interfaces": null, - "kind": "ENUM", - "name": "TwoFactorMethodProjectWorkspace", - "possibleTypes": null - }, - { - "description": "The `Upload` scalar type represents a file upload.", - "enumValues": null, - "fields": null, - "inputFields": null, - "interfaces": null, - "kind": "SCALAR", - "name": "Upload", + "name": "TwoFactorMethodCompliance", "possibleTypes": null }, { "description": null, - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "actedOn", - "type": { - "kind": "SCALAR", - "name": "DateTime", - "ofType": null - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "action", - "type": { - "kind": "ENUM", - "name": "UsageAnomalyAction", - "ofType": null - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "actorId", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "flaggedAt", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "DateTime", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "flaggedFor", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "UsageAnomalyFlagReason", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "id", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - } - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - } - ], - "kind": "OBJECT", - "name": "UsageAnomaly", - "possibleTypes": null - }, - { - "description": "Possible actions for a UsageAnomaly.", "enumValues": [ { "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "ALLOWED" - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "AUTOBANNED" + "name": "AUTHENTICATOR" }, { "deprecationReason": null, "description": null, "isDeprecated": false, - "name": "BANNED" + "name": "PASSKEY" } ], "fields": null, "inputFields": null, "interfaces": null, "kind": "ENUM", - "name": "UsageAnomalyAction", + "name": "TwoFactorMethodProjectWorkspace", "possibleTypes": null }, { - "description": "Possible flag reasons for a UsageAnomaly.", - "enumValues": [ - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "HIGH_CPU_USAGE" - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "HIGH_DISK_USAGE" - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "HIGH_NETWORK_USAGE" - } - ], + "description": "The `Upload` scalar type represents a file upload.", + "enumValues": null, "fields": null, "inputFields": null, "interfaces": null, - "kind": "ENUM", - "name": "UsageAnomalyFlagReason", + "kind": "SCALAR", + "name": "Upload", "possibleTypes": null }, { @@ -38429,191 +39154,6 @@ "name": "UserFlagsSetInput", "possibleTypes": null }, - { - "description": null, - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "createdAt", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "DateTime", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "defaultBranch", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "description", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "fullName", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "id", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "installationId", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isPrivate", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "lastPushedAt", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "DateTime", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "ownerAvatarUrl", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "updatedAt", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "DateTime", - "ofType": null - } - } - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - } - ], - "kind": "OBJECT", - "name": "UserGithubRepo", - "possibleTypes": null - }, { "description": null, "enumValues": null, @@ -41387,311 +41927,6 @@ "name": "VolumeVolumeInstancesConnectionEdge", "possibleTypes": null }, - { - "description": null, - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "amount", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Float", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "createdAt", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "DateTime", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "customerId", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "id", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "status", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "WithdrawalStatusType", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "updatedAt", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "DateTime", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "withdrawalAccount", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "WithdrawalAccount", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "withdrawalAccountId", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - } - ], - "kind": "OBJECT", - "name": "Withdrawal", - "possibleTypes": null - }, - { - "description": null, - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "customerId", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "id", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "platform", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "WithdrawalPlatformTypes", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "platformDetails", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "stripeConnectInfo", - "type": { - "kind": "OBJECT", - "name": "WithdrawalAccountStripeConnectInfo", - "ofType": null - } - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - } - ], - "kind": "OBJECT", - "name": "WithdrawalAccount", - "possibleTypes": null - }, - { - "description": null, - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "bankLast4", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "cardLast4", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "hasOnboarded", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } - } - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "needsAttention", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } - } - } - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "WithdrawalAccountStripeConnectInfo", - "possibleTypes": null - }, { "description": null, "enumValues": [ @@ -41727,41 +41962,6 @@ "name": "WithdrawalPlatformTypes", "possibleTypes": null }, - { - "description": null, - "enumValues": [ - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "CANCELLED" - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "COMPLETED" - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "FAILED" - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "PENDING" - } - ], - "fields": null, - "inputFields": null, - "interfaces": null, - "kind": "ENUM", - "name": "WithdrawalStatusType", - "possibleTypes": null - }, { "description": null, "enumValues": null, diff --git a/src/util/prompt.rs b/src/util/prompt.rs index 9dfc81339..b282e1aa7 100644 --- a/src/util/prompt.rs +++ b/src/util/prompt.rs @@ -12,6 +12,7 @@ use std::{ use crate::{ commands::{Configs, queries::project::ProjectProjectServicesEdgesNode}, controllers::variables::Variable, + queries::project::ProjectProjectEnvironmentsEdgesNodeServiceInstancesEdgesNode, }; use anyhow::{Context, Result}; @@ -177,6 +178,17 @@ impl Display for PromptService<'_> { } } +#[derive(Debug, Clone, PartialEq)] +pub struct PromptServiceInstance<'a>( + pub &'a ProjectProjectEnvironmentsEdgesNodeServiceInstancesEdgesNode, +); + +impl Display for PromptServiceInstance<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0.service_name) + } +} + /// Bash style completion of paths #[derive(Clone)] pub struct PathAutocompleter;