From 72da10816f90f3c2bbd0b206b284c7d86eea2839 Mon Sep 17 00:00:00 2001 From: Scott Werner Date: Thu, 3 Sep 2026 11:47:45 -0400 Subject: [PATCH] Simplify implicit run environment selection Make the CLI resolve an omitted environment the same way the server does: list the catalog once and apply the shared selection helper, instead of fetching `default`, sniffing the 404, and then listing. Replace the iterator-count dance in the helper with a slice match, lean on `?` for error conversion at both call sites, and move the selection error type into the crate's error module. Document `environment_selection_required` in the endpoint's error codes and de-duplicate the docs prose. Co-Authored-By: Claude Fable 5.1 --- docs/public/api-reference/fabro-api.yaml | 4 +- docs/public/execution/environments.mdx | 8 ++-- docs/public/execution/run-configuration.mdx | 2 +- lib/apps/fabro-cli/src/commands/run/create.rs | 29 ++++++------ lib/apps/fabro-cli/tests/it/cmd/create.rs | 44 +++++-------------- lib/apps/fabro-cli/tests/it/cmd/run.rs | 18 ++++---- lib/apps/fabro-cli/tests/it/cmd/support.rs | 26 +++++++++++ .../fabro-server/src/server/handler/runs.rs | 4 +- lib/components/fabro-environment/src/error.rs | 10 +++++ lib/components/fabro-environment/src/lib.rs | 8 ++-- lib/components/fabro-environment/src/store.rs | 35 +++++---------- .../fabro-api-client/src/api/runs-api.ts | 8 ++-- 12 files changed, 96 insertions(+), 100 deletions(-) diff --git a/docs/public/api-reference/fabro-api.yaml b/docs/public/api-reference/fabro-api.yaml index 224fa85ec..96b1199b0 100644 --- a/docs/public/api-reference/fabro-api.yaml +++ b/docs/public/api-reference/fabro-api.yaml @@ -1181,8 +1181,8 @@ paths: Failures return the standard error body. The intent lane responds `404` (`workflow_version_not_found`, `environment_not_found`), `422` (`run_intent_invalid`, `target_invalid`, - `target_environment_unsupported`, `workflow_version_unusable`, - `run_compile_invalid`), `503` (`integration_unavailable`), or `500` + `target_environment_unsupported`, `environment_selection_required`, + `workflow_version_unusable`, `run_compile_invalid`), `503` (`integration_unavailable`), or `500` (`workflow_version_store_error`, `credential_store_error`, `variable_store_error`, `run_persistence_failed`). requestBody: diff --git a/docs/public/execution/environments.mdx b/docs/public/execution/environments.mdx index a6f24f3d2..3ab874557 100644 --- a/docs/public/execution/environments.mdx +++ b/docs/public/execution/environments.mdx @@ -178,10 +178,10 @@ fabro server start --environment default ## Seeded Environments Install seeds a `default` environment into SQLite. It is a normal persisted -environment, so you can edit or delete it. When it is absent, run creation that -does not name an environment uses the sole Docker or Daytona environment in the -catalog; zero or multiple compatible environments require an explicit -selection. The standard Docker default is: +environment, so you can edit or delete it. Runs that do not name an environment +select it implicitly; see +[Run Configuration](/execution/run-configuration#runenvironment-and-server-managed-environments) +for the fallback rule when it is absent. The standard Docker default is: ```json title="GET /api/v1/environments/default" { diff --git a/docs/public/execution/run-configuration.mdx b/docs/public/execution/run-configuration.mdx index 5f3b18809..4e00bf303 100644 --- a/docs/public/execution/run-configuration.mdx +++ b/docs/public/execution/run-configuration.mdx @@ -318,7 +318,7 @@ memory = "8GB" | Field | Description | |---|---| -| `run.environment.id` | Environment slug to select. Defaults to `default`. | +| `run.environment.id` | Environment slug to select. When omitted, the implicit selection described above applies. | | `environments..provider` | Required provider: `local`, `docker`, or `daytona`. | | `image.docker` | Docker image. Docker runs it directly; Daytona uses it to create or reuse an internally named snapshot. | | `image.dockerfile` | Inline Dockerfile or `{ path = "Dockerfile" }`; Daytona uses it to create or reuse an internally named snapshot. Do not set it with `image.docker`. | diff --git a/lib/apps/fabro-cli/src/commands/run/create.rs b/lib/apps/fabro-cli/src/commands/run/create.rs index 371284f63..602e26775 100644 --- a/lib/apps/fabro-cli/src/commands/run/create.rs +++ b/lib/apps/fabro-cli/src/commands/run/create.rs @@ -2,7 +2,7 @@ use std::path::Path; use anyhow::{Context as _, anyhow, bail}; use fabro_config::project; -use fabro_environment::{DEFAULT_ENVIRONMENT_ID, Environment, select_implicit_run_environment}; +use fabro_environment::{Environment, select_implicit_run_environment}; use fabro_types::settings::run::EnvironmentProvider; use fabro_types::{DirtyStatus, RunId, RunIntent, RunTarget}; use fabro_util::terminal::Styles; @@ -109,24 +109,23 @@ pub(crate) async fn create_run( }) } +/// Resolves the run environment the same way the server does for an omitted +/// `environment_id`, so the CLI can derive the run target from its provider. async fn resolve_run_environment( client: &fabro_client::Client, explicit_id: Option<&str>, ) -> anyhow::Result { - let id = explicit_id.unwrap_or(DEFAULT_ENVIRONMENT_ID); - match client.retrieve_environment(id).await { - Ok(environment) => Ok(environment), - Err(error) if explicit_id.is_none() && fabro_client::is_not_found_error(&error) => { - let environments = client - .list_environments() - .await - .context("could not list environments")?; - select_implicit_run_environment(&environments) - .cloned() - .map_err(anyhow::Error::new) - } - Err(error) => Err(error).with_context(|| format!("could not retrieve environment `{id}`")), - } + let Some(id) = explicit_id else { + let environments = client + .list_environments() + .await + .context("could not list environments")?; + return Ok(select_implicit_run_environment(&environments)?.clone()); + }; + client + .retrieve_environment(id) + .await + .with_context(|| format!("could not retrieve environment `{id}`")) } fn warn_untransmitted_settings( diff --git a/lib/apps/fabro-cli/tests/it/cmd/create.rs b/lib/apps/fabro-cli/tests/it/cmd/create.rs index 084b97e06..37b41b5aa 100644 --- a/lib/apps/fabro-cli/tests/it/cmd/create.rs +++ b/lib/apps/fabro-cli/tests/it/cmd/create.rs @@ -12,7 +12,7 @@ use insta::assert_snapshot; use serde_json::json; use super::support::{ - created_run_id, environment_json, fixture, mock_environment, + created_run_id, environment_catalog_json, fixture, mock_environment, mock_environment_catalog, mock_workflow_version_registrations, mock_workflow_version_registrations_recording, output_stderr, output_stdout, remote_run_summary_json, resolve_run, run_count_for_test_case, run_git, run_state, @@ -123,7 +123,7 @@ fn create_uses_explicit_server_target_and_prints_remote_run_id() { let context = test_context!(); let server = MockServer::start(); let run_id = unique_run_id(); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let mock = server.mock(|when, then| { when.method("POST").path("/api/v1/runs"); @@ -160,28 +160,7 @@ fn create_uses_the_sole_clone_based_environment_when_default_is_missing() { let context = test_context!(); let server = MockServer::start(); let run_id = unique_run_id(); - let default_mock = server.mock(|when, then| { - when.method("GET").path("/api/v1/environments/default"); - then.status(404) - .header("content-type", "application/json") - .json_body(json!({ - "errors": [{ - "status": "404", - "title": "Not Found", - "detail": "environment `default` not found", - "code": "environment_not_found" - }] - })); - }); - let list_mock = server.mock(|when, then| { - when.method("GET").path("/api/v1/environments"); - then.status(200) - .header("content-type", "application/json") - .json_body(json!({ - "data": [environment_json("production", "docker")], - "meta": { "total": 1 } - })); - }); + let list_mock = mock_environment_catalog(&server, &[("production", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let requests = Arc::new(Mutex::new(Vec::new())); let create_mock = mock_intent_create(&server, &run_id, Arc::clone(&requests)); @@ -203,7 +182,6 @@ fn create_uses_the_sole_clone_based_environment_when_default_is_missing() { String::from_utf8_lossy(&output.stdout), String::from_utf8_lossy(&output.stderr) ); - default_mock.assert(); list_mock.assert(); version_mock.assert(); create_mock.assert(); @@ -215,7 +193,7 @@ fn create_defers_provider_validation_to_the_server() { let context = test_context!(); let server = MockServer::start(); let run_id = unique_run_id(); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let registered_versions = Arc::new(Mutex::new(Vec::new())); let version_mock = mock_workflow_version_registrations_recording(&server, Arc::clone(®istered_versions)); @@ -258,7 +236,7 @@ fn create_uses_configured_server_target_without_server_flag() { let context = test_context!(); let server = MockServer::start(); let run_id = unique_run_id(); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let mock = server.mock(|when, then| { when.method("POST").path("/api/v1/runs"); @@ -293,7 +271,7 @@ fn create_parent_resolves_parent_and_sends_parent_id_in_intent() { let run_id = unique_run_id(); let parent_id = unique_run_id(); let resolve_mock = super::support::mock_resolved_run(&server, "nightly-parent", &parent_id); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let create_mock = server.mock(|when, then| { when.method("POST") @@ -363,7 +341,7 @@ fn create_cli_server_target_overrides_configured_server_target() { }); let cli_server = MockServer::start(); let run_id = unique_run_id(); - let environment_mock = mock_environment(&cli_server, "default", "docker"); + let environment_mock = mock_environment_catalog(&cli_server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&cli_server); let cli_mock = cli_server.mock(|when, then| { when.method("POST").path("/api/v1/runs"); @@ -693,7 +671,7 @@ fn create_clone_targets_require_exact_git_observations() { let environment_calls = Arc::new(AtomicUsize::new(0)); let environment_calls_for_mock = Arc::clone(&environment_calls); let environment_mock = server.mock(|when, then| { - when.method("GET").path("/api/v1/environments/default"); + when.method("GET").path("/api/v1/environments"); then.respond_with(move |_| { let provider = match environment_calls_for_mock.fetch_add(1, Ordering::SeqCst) { 0 | 2 => "docker", @@ -703,7 +681,7 @@ fn create_clone_targets_require_exact_git_observations() { HttpMockResponse::builder() .status(200) .header("content-type", "application/json") - .body(environment_json("default", provider).to_string()) + .body(environment_catalog_json(&[("default", provider)]).to_string()) .build() }); }); @@ -866,7 +844,7 @@ fn create_clone_targets_require_exact_git_observations() { fn create_rejects_unusable_git_checkouts_instead_of_sending_an_empty_target() { let context = test_context!(); let server = MockServer::start(); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let run_id = unique_run_id(); let requests = Arc::new(Mutex::new(Vec::new())); @@ -935,7 +913,7 @@ fn create_rejects_unusable_git_checkouts_instead_of_sending_an_empty_target() { fn create_rejects_an_unsupported_attached_origin_before_upload() { let context = test_context!(); let server = MockServer::start(); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let run_id = unique_run_id(); let requests = Arc::new(Mutex::new(Vec::new())); diff --git a/lib/apps/fabro-cli/tests/it/cmd/run.rs b/lib/apps/fabro-cli/tests/it/cmd/run.rs index 5f1752b38..17e10d5cf 100644 --- a/lib/apps/fabro-cli/tests/it/cmd/run.rs +++ b/lib/apps/fabro-cli/tests/it/cmd/run.rs @@ -10,7 +10,7 @@ use httpmock::MockServer; use serde_json::Value; use super::support::{ - created_run_id, mock_environment, mock_workflow_version_registrations, output_stderr, + created_run_id, mock_environment_catalog, mock_workflow_version_registrations, output_stderr, remote_run_summary_json, run_state, wait_for_event_names, }; use crate::support::{LightweightCli, run_output_filters, run_projection_json, unique_run_id}; @@ -155,7 +155,7 @@ fn detach_uses_explicit_server_target_and_prints_remote_run_id() { let context = test_context!(); let server = MockServer::start(); let run_id = unique_run_id(); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let create_mock = server.mock(|when, then| { when.method("POST").path("/api/v1/runs"); @@ -209,7 +209,7 @@ fn run_parent_resolves_parent_and_sends_parent_id_in_intent() { let run_id = unique_run_id(); let parent_id = unique_run_id(); let resolve_mock = super::support::mock_resolved_run(&server, "nightly-parent", &parent_id); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let create_mock = server.mock(|when, then| { when.method("POST") @@ -265,7 +265,7 @@ fn detach_uses_configured_server_target_without_server_flag() { let context = test_context!(); let server = MockServer::start(); let run_id = unique_run_id(); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let create_mock = server.mock(|when, then| { when.method("POST").path("/api/v1/runs"); @@ -314,7 +314,7 @@ fn detach_uses_configured_server_target_without_server_flag() { fn run_create_failure_shows_action_context_and_response_body() { let context = test_context!(); let server = MockServer::start(); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let create_mock = server.mock(|when, then| { when.method("POST").path("/api/v1/runs"); @@ -496,7 +496,7 @@ fn detach_cli_server_target_overrides_configured_server_target() { }); let cli_server = MockServer::start(); let run_id = unique_run_id(); - let environment_mock = mock_environment(&cli_server, "default", "docker"); + let environment_mock = mock_environment_catalog(&cli_server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&cli_server); let cli_create = cli_server.mock(|when, then| { when.method("POST").path("/api/v1/runs"); @@ -550,7 +550,7 @@ fn remote_foreground_run_consumes_paginated_events_and_prints_server_backed_summ let context = test_context!(); let server = MockServer::start(); let run_id = unique_run_id(); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let preflight = server.mock(|when, then| { when.method("POST").path("/api/v1/preflight"); @@ -672,7 +672,7 @@ fn remote_foreground_run_consumes_paginated_events_and_prints_server_backed_summ fn run_surfaces_server_rejection_for_unbound_template_inputs() { let context = test_context!(); let server = MockServer::start(); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let create = server.mock(|when, then| { when.method("POST").path("/api/v1/runs"); @@ -714,7 +714,7 @@ fn run_surfaces_server_rejection_for_unbound_template_inputs() { fn foreground_run_surfaces_server_rejection_for_invalid_workflow() { let context = test_context!(); let server = MockServer::start(); - let environment_mock = mock_environment(&server, "default", "docker"); + let environment_mock = mock_environment_catalog(&server, &[("default", "docker")]); let version_mock = mock_workflow_version_registrations(&server); let create = server.mock(|when, then| { when.method("POST").path("/api/v1/runs"); diff --git a/lib/apps/fabro-cli/tests/it/cmd/support.rs b/lib/apps/fabro-cli/tests/it/cmd/support.rs index 51e179298..ab406f784 100644 --- a/lib/apps/fabro-cli/tests/it/cmd/support.rs +++ b/lib/apps/fabro-cli/tests/it/cmd/support.rs @@ -172,6 +172,32 @@ pub(crate) fn mock_environment<'a>(server: &'a MockServer, id: &str, provider: & }) } +/// Canonical environment catalog body for mock servers, matching the +/// `GET /api/v1/environments` shape the run-intent create path reads when no +/// `--environment` is given. +pub(crate) fn environment_catalog_json(environments: &[(&str, &str)]) -> Value { + serde_json::json!({ + "data": environments + .iter() + .map(|(id, provider)| environment_json(id, provider)) + .collect::>(), + "meta": { "total": environments.len() } + }) +} + +pub(crate) fn mock_environment_catalog<'a>( + server: &'a MockServer, + environments: &[(&str, &str)], +) -> Mock<'a> { + let body = environment_catalog_json(environments); + server.mock(|when, then| { + when.method("GET").path("/api/v1/environments"); + then.status(200) + .header("content-type", "application/json") + .json_body(body); + }) +} + pub(crate) fn mock_workflow_version_registrations(server: &MockServer) -> Mock<'_> { mock_workflow_version_registrations_recording(server, Arc::new(Mutex::new(Vec::new()))) } diff --git a/lib/apps/fabro-server/src/server/handler/runs.rs b/lib/apps/fabro-server/src/server/handler/runs.rs index fe06e92ec..888583843 100644 --- a/lib/apps/fabro-server/src/server/handler/runs.rs +++ b/lib/apps/fabro-server/src/server/handler/runs.rs @@ -1078,9 +1078,7 @@ fn select_intent_environment_id( ) -> Result { let Some(value) = value else { let environments = state.environment_store().list(); - return select_implicit_run_environment(&environments) - .map(|environment| environment.id.clone()) - .map_err(EnvironmentSelectionError::from); + return Ok(select_implicit_run_environment(&environments)?.id.clone()); }; let id = value diff --git a/lib/components/fabro-environment/src/error.rs b/lib/components/fabro-environment/src/error.rs index 838898a59..6b2a4b19b 100644 --- a/lib/components/fabro-environment/src/error.rs +++ b/lib/components/fabro-environment/src/error.rs @@ -134,3 +134,13 @@ impl EnvironmentStoreError { } } } + +/// Error returned when an omitted run environment cannot be resolved without +/// making an arbitrary choice. +#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)] +#[error( + "no environment was specified and no environment named `default` exists; expected exactly one Docker or Daytona environment, found {compatible_count}" +)] +pub struct ImplicitRunEnvironmentError { + pub compatible_count: usize, +} diff --git a/lib/components/fabro-environment/src/lib.rs b/lib/components/fabro-environment/src/lib.rs index 71ab03973..39e232fc1 100644 --- a/lib/components/fabro-environment/src/lib.rs +++ b/lib/components/fabro-environment/src/lib.rs @@ -3,11 +3,11 @@ mod id; mod model; mod store; -pub use error::{EnvironmentStoreError, EnvironmentValidationError}; +pub use error::{EnvironmentStoreError, EnvironmentValidationError, ImplicitRunEnvironmentError}; pub use id::{EnvironmentId, EnvironmentRevision, EnvironmentRevisionParseError}; pub use model::{Environment, EnvironmentDraft}; pub use store::{ - DEFAULT_ENVIRONMENT_ID, EnvironmentStore, ImplicitRunEnvironmentError, ImportReport, - import_legacy_directory_once, seed_default_environment, seed_environments, - seeded_catalog_layer, select_implicit_run_environment, + DEFAULT_ENVIRONMENT_ID, EnvironmentStore, ImportReport, import_legacy_directory_once, + seed_default_environment, seed_environments, seeded_catalog_layer, + select_implicit_run_environment, }; diff --git a/lib/components/fabro-environment/src/store.rs b/lib/components/fabro-environment/src/store.rs index 783771e79..00124be1e 100644 --- a/lib/components/fabro-environment/src/store.rs +++ b/lib/components/fabro-environment/src/store.rs @@ -20,7 +20,7 @@ use tracing::info; use crate::{ Environment, EnvironmentDraft, EnvironmentId, EnvironmentRevision, EnvironmentStoreError, - EnvironmentValidationError, + EnvironmentValidationError, ImplicitRunEnvironmentError, }; /// Built-in default environment seeded by install/test setup. The server itself @@ -30,16 +30,6 @@ use crate::{ /// reserved, in-memory environment. pub const DEFAULT_ENVIRONMENT_ID: &str = "default"; -/// Error returned when an omitted run environment cannot be resolved without -/// making an arbitrary choice. -#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)] -#[error( - "no environment was specified and no environment named `default` exists; expected exactly one Docker or Daytona environment, found {compatible_count}" -)] -pub struct ImplicitRunEnvironmentError { - pub compatible_count: usize, -} - /// Selects the environment used when run creation omits an environment ID. /// /// A catalog entry named `default` preserves the established behavior. If it @@ -55,21 +45,16 @@ pub fn select_implicit_run_environment( return Ok(environment); } - let mut compatible = environments + let compatible: Vec<&Environment> = environments .iter() - .filter(|environment| environment.settings.provider.is_clone_based()); - let Some(environment) = compatible.next() else { - return Err(ImplicitRunEnvironmentError { - compatible_count: 0, - }); - }; - let Some(_second) = compatible.next() else { - return Ok(environment); - }; - - Err(ImplicitRunEnvironmentError { - compatible_count: 2 + compatible.count(), - }) + .filter(|environment| environment.settings.provider.is_clone_based()) + .collect(); + match compatible.as_slice() { + [environment] => Ok(environment), + _ => Err(ImplicitRunEnvironmentError { + compatible_count: compatible.len(), + }), + } } /// `local` is a reserved environment: it is synthesized in memory only when the diff --git a/lib/packages/fabro-api-client/src/api/runs-api.ts b/lib/packages/fabro-api-client/src/api/runs-api.ts index d1afa2112..98d358668 100644 --- a/lib/packages/fabro-api-client/src/api/runs-api.ts +++ b/lib/packages/fabro-api-client/src/api/runs-api.ts @@ -372,7 +372,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration) }; }, /** - * Creates a new workflow run in `submitted` status from either a self-contained legacy manifest or an immutable workflow-version intent. Creation does not start or schedule the run. Failures return the standard error body. The intent lane responds `404` (`workflow_version_not_found`, `environment_not_found`), `422` (`run_intent_invalid`, `target_invalid`, `target_environment_unsupported`, `workflow_version_unusable`, `run_compile_invalid`), `503` (`integration_unavailable`), or `500` (`workflow_version_store_error`, `credential_store_error`, `variable_store_error`, `run_persistence_failed`). + * Creates a new workflow run in `submitted` status from either a self-contained legacy manifest or an immutable workflow-version intent. Creation does not start or schedule the run. Failures return the standard error body. The intent lane responds `404` (`workflow_version_not_found`, `environment_not_found`), `422` (`run_intent_invalid`, `target_invalid`, `target_environment_unsupported`, `environment_selection_required`, `workflow_version_unusable`, `run_compile_invalid`), `503` (`integration_unavailable`), or `500` (`workflow_version_store_error`, `credential_store_error`, `variable_store_error`, `run_persistence_failed`). * @summary Create Run * @param {CreateRunRequest} createRunRequest * @param {*} [options] Override http request option. @@ -1677,7 +1677,7 @@ export const RunsApiFp = function(configuration?: Configuration) { return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, /** - * Creates a new workflow run in `submitted` status from either a self-contained legacy manifest or an immutable workflow-version intent. Creation does not start or schedule the run. Failures return the standard error body. The intent lane responds `404` (`workflow_version_not_found`, `environment_not_found`), `422` (`run_intent_invalid`, `target_invalid`, `target_environment_unsupported`, `workflow_version_unusable`, `run_compile_invalid`), `503` (`integration_unavailable`), or `500` (`workflow_version_store_error`, `credential_store_error`, `variable_store_error`, `run_persistence_failed`). + * Creates a new workflow run in `submitted` status from either a self-contained legacy manifest or an immutable workflow-version intent. Creation does not start or schedule the run. Failures return the standard error body. The intent lane responds `404` (`workflow_version_not_found`, `environment_not_found`), `422` (`run_intent_invalid`, `target_invalid`, `target_environment_unsupported`, `environment_selection_required`, `workflow_version_unusable`, `run_compile_invalid`), `503` (`integration_unavailable`), or `500` (`workflow_version_store_error`, `credential_store_error`, `variable_store_error`, `run_persistence_failed`). * @summary Create Run * @param {CreateRunRequest} createRunRequest * @param {*} [options] Override http request option. @@ -2137,7 +2137,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath? return localVarFp.closeRunPullRequest(id, options).then((request) => request(axios, basePath)); }, /** - * Creates a new workflow run in `submitted` status from either a self-contained legacy manifest or an immutable workflow-version intent. Creation does not start or schedule the run. Failures return the standard error body. The intent lane responds `404` (`workflow_version_not_found`, `environment_not_found`), `422` (`run_intent_invalid`, `target_invalid`, `target_environment_unsupported`, `workflow_version_unusable`, `run_compile_invalid`), `503` (`integration_unavailable`), or `500` (`workflow_version_store_error`, `credential_store_error`, `variable_store_error`, `run_persistence_failed`). + * Creates a new workflow run in `submitted` status from either a self-contained legacy manifest or an immutable workflow-version intent. Creation does not start or schedule the run. Failures return the standard error body. The intent lane responds `404` (`workflow_version_not_found`, `environment_not_found`), `422` (`run_intent_invalid`, `target_invalid`, `target_environment_unsupported`, `environment_selection_required`, `workflow_version_unusable`, `run_compile_invalid`), `503` (`integration_unavailable`), or `500` (`workflow_version_store_error`, `credential_store_error`, `variable_store_error`, `run_persistence_failed`). * @summary Create Run * @param {CreateRunRequest} createRunRequest * @param {*} [options] Override http request option. @@ -2518,7 +2518,7 @@ export class RunsApi extends BaseAPI { } /** - * Creates a new workflow run in `submitted` status from either a self-contained legacy manifest or an immutable workflow-version intent. Creation does not start or schedule the run. Failures return the standard error body. The intent lane responds `404` (`workflow_version_not_found`, `environment_not_found`), `422` (`run_intent_invalid`, `target_invalid`, `target_environment_unsupported`, `workflow_version_unusable`, `run_compile_invalid`), `503` (`integration_unavailable`), or `500` (`workflow_version_store_error`, `credential_store_error`, `variable_store_error`, `run_persistence_failed`). + * Creates a new workflow run in `submitted` status from either a self-contained legacy manifest or an immutable workflow-version intent. Creation does not start or schedule the run. Failures return the standard error body. The intent lane responds `404` (`workflow_version_not_found`, `environment_not_found`), `422` (`run_intent_invalid`, `target_invalid`, `target_environment_unsupported`, `environment_selection_required`, `workflow_version_unusable`, `run_compile_invalid`), `503` (`integration_unavailable`), or `500` (`workflow_version_store_error`, `credential_store_error`, `variable_store_error`, `run_persistence_failed`). * @summary Create Run * @param {CreateRunRequest} createRunRequest * @param {*} [options] Override http request option.