diff --git a/Cargo.lock b/Cargo.lock index 63d8ddcd5..c47bfea78 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2070,6 +2070,7 @@ version = "0.176.2" dependencies = [ "chrono", "clap", + "dirs", "fabro-macros", "serde", "serde_json", diff --git a/docs-internal/run-directory-keys.md b/docs-internal/run-directory-keys.md index 5c340776e..202139e09 100644 --- a/docs-internal/run-directory-keys.md +++ b/docs-internal/run-directory-keys.md @@ -25,7 +25,7 @@ No single event carries this data. The `run.started` event has a subset (`name`, |-------|-------------|--------------| | `run_id` | ULID string | `run.started` → `envelope.run_id` | | `created_at` | RFC 3339 timestamp | — | -| `settings` | full FabroSettings object | — | +| `settings` | full Settings object | — | | `graph` | parsed workflow graph | — | | `workflow_slug` | workflow slug (optional) | — | | `working_directory` | path string | — | diff --git a/docs/api-reference/fabro-api.yaml b/docs/api-reference/fabro-api.yaml index 33eb06edd..e93afb856 100644 --- a/docs/api-reference/fabro-api.yaml +++ b/docs/api-reference/fabro-api.yaml @@ -3984,7 +3984,7 @@ components: # ── Settings Schemas ───────────────────────────────────────────────── RunSettings: - description: Structured run settings mirroring FabroSettings. + description: Structured run settings mirroring fabro_types::Settings. type: object required: - version @@ -4227,7 +4227,7 @@ components: description: Whether hook runs in sandbox. ServerSettings: - description: Structured server settings mirroring FabroSettings. + description: Structured server settings mirroring fabro_types::Settings. type: object properties: storage_dir: diff --git a/lib/crates/fabro-checkpoint/src/metadata.rs b/lib/crates/fabro-checkpoint/src/metadata.rs index e73800870..a17913f69 100644 --- a/lib/crates/fabro-checkpoint/src/metadata.rs +++ b/lib/crates/fabro-checkpoint/src/metadata.rs @@ -178,7 +178,7 @@ mod tests { use super::*; use chrono::{TimeZone, Utc}; - use fabro_types::{FabroSettings, Graph, fixtures}; + use fabro_types::{Graph, Settings, fixtures}; /// Create a temporary git repo with an initial commit. fn init_repo(dir: &Path) { @@ -207,7 +207,7 @@ mod tests { RunRecord { run_id, created_at: Utc.with_ymd_and_hms(2025, 1, 1, 0, 0, 0).single().unwrap(), - settings: FabroSettings::default(), + settings: Settings::default(), graph: Graph::new("test"), workflow_slug: None, working_directory: PathBuf::from("/tmp"), diff --git a/lib/crates/fabro-cli/src/commands/asset/cp.rs b/lib/crates/fabro-cli/src/commands/asset/cp.rs index a68b0e5e6..980aeffc4 100644 --- a/lib/crates/fabro-cli/src/commands/asset/cp.rs +++ b/lib/crates/fabro-cli/src/commands/asset/cp.rs @@ -1,7 +1,6 @@ use std::path::{Path, PathBuf}; use anyhow::{Context, Result, bail}; -use fabro_config::FabroSettingsExt; use fabro_store::RuntimeState; use fabro_workflow::assets::{AssetEntry, scan_assets}; use fabro_workflow::run_lookup::{resolve_run_combined, runs_base}; diff --git a/lib/crates/fabro-cli/src/commands/asset/list.rs b/lib/crates/fabro-cli/src/commands/asset/list.rs index 1d4a5b121..3d3b58217 100644 --- a/lib/crates/fabro-cli/src/commands/asset/list.rs +++ b/lib/crates/fabro-cli/src/commands/asset/list.rs @@ -1,5 +1,4 @@ use anyhow::Result; -use fabro_config::FabroSettingsExt; use fabro_store::RuntimeState; use fabro_workflow::assets::scan_assets; use fabro_workflow::run_lookup::{resolve_run_combined, runs_base}; diff --git a/lib/crates/fabro-cli/src/commands/config/mod.rs b/lib/crates/fabro-cli/src/commands/config/mod.rs index 16db80b36..e8a23ae20 100644 --- a/lib/crates/fabro-cli/src/commands/config/mod.rs +++ b/lib/crates/fabro-cli/src/commands/config/mod.rs @@ -4,9 +4,10 @@ use std::path::Path; use crate::args::{GlobalArgs, SettingsArgs}; use crate::shared::print_json_pretty; use crate::user_config; -use fabro_config::{ConfigLayer, FabroSettings}; +use fabro_config::ConfigLayer; +use fabro_types::Settings; -fn merged_config(workflow: Option<&Path>, globals: &GlobalArgs) -> anyhow::Result { +fn merged_config(workflow: Option<&Path>, globals: &GlobalArgs) -> anyhow::Result { let cwd = std::env::current_dir()?; let base = match workflow { Some(path) => ConfigLayer::for_workflow(path, &cwd)?, diff --git a/lib/crates/fabro-cli/src/commands/install.rs b/lib/crates/fabro-cli/src/commands/install.rs index d6425910d..8d264cbf1 100644 --- a/lib/crates/fabro-cli/src/commands/install.rs +++ b/lib/crates/fabro-cli/src/commands/install.rs @@ -925,7 +925,7 @@ mod tests { #[cfg(feature = "server")] fn config_toml_roundtrips() { let toml_str = format_config_toml("brynary"); - let settings: fabro_config::FabroSettings = + let settings: fabro_types::Settings = toml::from_str(&toml_str).expect("config should parse"); assert_eq!( settings.web.unwrap().auth.allowed_usernames, @@ -937,7 +937,7 @@ mod tests { #[cfg(feature = "server")] fn config_toml_has_auth_strategies() { let toml_str = format_config_toml("alice"); - let settings: fabro_config::FabroSettings = toml::from_str(&toml_str).unwrap(); + let settings: fabro_types::Settings = toml::from_str(&toml_str).unwrap(); assert_eq!( settings.api.unwrap().authentication_strategies, vec![ @@ -952,7 +952,7 @@ mod tests { fn config_toml_has_tls_paths() { use std::path::PathBuf; let toml_str = format_config_toml("bob"); - let settings: fabro_config::FabroSettings = toml::from_str(&toml_str).unwrap(); + let settings: fabro_types::Settings = toml::from_str(&toml_str).unwrap(); let tls = settings.api.unwrap().tls.expect("tls should be set"); assert_eq!(tls.cert, PathBuf::from("~/.fabro/certs/server.crt")); assert_eq!(tls.key, PathBuf::from("~/.fabro/certs/server.key")); diff --git a/lib/crates/fabro-cli/src/commands/llm/chat.rs b/lib/crates/fabro-cli/src/commands/llm/chat.rs index 4220730a8..af9cbfd83 100644 --- a/lib/crates/fabro-cli/src/commands/llm/chat.rs +++ b/lib/crates/fabro-cli/src/commands/llm/chat.rs @@ -1,14 +1,14 @@ use anyhow::Result; -use fabro_config::FabroSettings; use fabro_llm::cli::{ChatArgs, run_chat}; #[cfg(feature = "server")] use fabro_llm::cli::{ServerConnection, run_chat_via_server}; +use fabro_types::Settings; use crate::args::GlobalArgs; pub(super) async fn execute( mut args: ChatArgs, - cli_settings: &FabroSettings, + cli_settings: &Settings, globals: &GlobalArgs, ) -> Result<()> { globals.require_no_json()?; diff --git a/lib/crates/fabro-cli/src/commands/llm/prompt.rs b/lib/crates/fabro-cli/src/commands/llm/prompt.rs index 3cd66e468..68311759e 100644 --- a/lib/crates/fabro-cli/src/commands/llm/prompt.rs +++ b/lib/crates/fabro-cli/src/commands/llm/prompt.rs @@ -1,14 +1,14 @@ use anyhow::Result; -use fabro_config::FabroSettings; use fabro_llm::cli::{PromptArgs, run_prompt}; #[cfg(feature = "server")] use fabro_llm::cli::{ServerConnection, run_prompt_via_server}; +use fabro_types::Settings; use crate::args::GlobalArgs; pub(super) async fn execute( mut args: PromptArgs, - cli_settings: &FabroSettings, + cli_settings: &Settings, globals: &GlobalArgs, ) -> Result<()> { let llm_defaults = cli_settings.llm.as_ref(); diff --git a/lib/crates/fabro-cli/src/commands/pr/close.rs b/lib/crates/fabro-cli/src/commands/pr/close.rs index 9c2df808d..7e16b3b77 100644 --- a/lib/crates/fabro-cli/src/commands/pr/close.rs +++ b/lib/crates/fabro-cli/src/commands/pr/close.rs @@ -1,7 +1,6 @@ use std::path::Path; use anyhow::{Context, Result}; -use fabro_config::FabroSettingsExt; use fabro_workflow::run_lookup::runs_base; use tracing::info; diff --git a/lib/crates/fabro-cli/src/commands/pr/create.rs b/lib/crates/fabro-cli/src/commands/pr/create.rs index a8ddb58dd..3713eb98b 100644 --- a/lib/crates/fabro-cli/src/commands/pr/create.rs +++ b/lib/crates/fabro-cli/src/commands/pr/create.rs @@ -1,7 +1,6 @@ use std::path::Path; use anyhow::{Context, Result, bail}; -use fabro_config::FabroSettingsExt; use fabro_model::Catalog; use fabro_sandbox::daytona::detect_repo_info; use fabro_workflow::outcome::StageStatus; diff --git a/lib/crates/fabro-cli/src/commands/pr/list.rs b/lib/crates/fabro-cli/src/commands/pr/list.rs index 5d4fcb5ff..698076518 100644 --- a/lib/crates/fabro-cli/src/commands/pr/list.rs +++ b/lib/crates/fabro-cli/src/commands/pr/list.rs @@ -1,7 +1,6 @@ use std::path::Path; use anyhow::{Context, Result}; -use fabro_config::FabroSettingsExt; use fabro_types::PullRequestRecord; use fabro_workflow::run_lookup::{runs_base, scan_runs_combined}; use futures::future::join_all; diff --git a/lib/crates/fabro-cli/src/commands/pr/merge.rs b/lib/crates/fabro-cli/src/commands/pr/merge.rs index e9438b34a..4a6de903f 100644 --- a/lib/crates/fabro-cli/src/commands/pr/merge.rs +++ b/lib/crates/fabro-cli/src/commands/pr/merge.rs @@ -1,7 +1,6 @@ use std::path::Path; use anyhow::{Context, Result}; -use fabro_config::FabroSettingsExt; use tracing::info; use fabro_workflow::run_lookup::runs_base; diff --git a/lib/crates/fabro-cli/src/commands/pr/view.rs b/lib/crates/fabro-cli/src/commands/pr/view.rs index bb0d0bc23..419b0eebb 100644 --- a/lib/crates/fabro-cli/src/commands/pr/view.rs +++ b/lib/crates/fabro-cli/src/commands/pr/view.rs @@ -1,7 +1,6 @@ use std::path::Path; use anyhow::{Context, Result}; -use fabro_config::FabroSettingsExt; use tracing::info; use fabro_workflow::run_lookup::runs_base; diff --git a/lib/crates/fabro-cli/src/commands/preflight.rs b/lib/crates/fabro-cli/src/commands/preflight.rs index 8b141609e..1b4402e08 100644 --- a/lib/crates/fabro-cli/src/commands/preflight.rs +++ b/lib/crates/fabro-cli/src/commands/preflight.rs @@ -2,13 +2,14 @@ use std::path::Path; use std::sync::Arc; use anyhow::bail; +use fabro_config::ConfigLayer; use fabro_config::project::{resolve_workflow_path, resolve_working_directory}; -use fabro_config::{ConfigLayer, FabroSettings}; use fabro_graphviz::graph::{Graph, is_llm_handler_type}; use fabro_llm::client::Client as LlmClient; use fabro_model::{Catalog, Provider}; use fabro_sandbox::daytona::{DaytonaConfig, detect_repo_info}; use fabro_sandbox::{DockerSandboxOptions, Sandbox, SandboxProvider, SandboxSpec}; +use fabro_types::Settings; use fabro_util::check_report::CheckReport; use fabro_util::terminal::Styles; use fabro_workflow::git::{GitSyncStatus, sync_status}; @@ -22,7 +23,7 @@ use crate::user_config::{load_user_settings_with_globals, user_layer_with_global pub(crate) async fn execute(mut args: PreflightArgs, globals: &GlobalArgs) -> anyhow::Result<()> { let styles: &'static Styles = Box::leak(Box::new(Styles::detect_stderr())); let cli = user_layer_with_globals(globals)?; - let cli_settings: FabroSettings = load_user_settings_with_globals(globals)?; + let cli_settings: Settings = load_user_settings_with_globals(globals)?; args.verbose = args.verbose || cli_settings.verbose_enabled(); let github_app = build_github_app_credentials(cli_settings.app_id())?; @@ -105,7 +106,7 @@ pub(crate) async fn execute(mut args: PreflightArgs, globals: &GlobalArgs) -> an fn resolve_model_provider( cli_model: Option<&str>, cli_provider: Option<&str>, - settings: &FabroSettings, + settings: &Settings, graph: &Graph, ) -> (String, Option) { let configured_model = settings.llm.as_ref().and_then(|llm| llm.model.as_deref()); @@ -144,7 +145,7 @@ fn resolve_model_provider( } } -fn parse_sandbox_provider(settings: &FabroSettings) -> anyhow::Result> { +fn parse_sandbox_provider(settings: &Settings) -> anyhow::Result> { settings .sandbox_settings() .and_then(|s| s.provider.as_deref()) @@ -155,14 +156,14 @@ fn parse_sandbox_provider(settings: &FabroSettings) -> anyhow::Result, - settings: &FabroSettings, + settings: &Settings, ) -> anyhow::Result { Ok(cli .or(parse_sandbox_provider(settings)?) .unwrap_or_default()) } -fn resolve_daytona_config(settings: &FabroSettings) -> Option { +fn resolve_daytona_config(settings: &Settings) -> Option { settings .sandbox_settings() .and_then(|sandbox| sandbox.daytona.clone()) @@ -196,7 +197,7 @@ async fn mint_github_token( #[allow(clippy::too_many_arguments)] async fn run_preflight( graph: &Graph, - settings: &FabroSettings, + settings: &Settings, cli_model: Option<&str>, cli_provider: Option<&str>, git_status: GitSyncStatus, diff --git a/lib/crates/fabro-cli/src/commands/run/command.rs b/lib/crates/fabro-cli/src/commands/run/command.rs index b3c1f05b6..36e6bb05f 100644 --- a/lib/crates/fabro-cli/src/commands/run/command.rs +++ b/lib/crates/fabro-cli/src/commands/run/command.rs @@ -1,5 +1,4 @@ use anyhow::Result; -use fabro_config::FabroSettingsExt; use fabro_util::terminal::Styles; use crate::args::{GlobalArgs, RunArgs}; diff --git a/lib/crates/fabro-cli/src/commands/run/cp.rs b/lib/crates/fabro-cli/src/commands/run/cp.rs index a0dedabd2..ddc4eb3d0 100644 --- a/lib/crates/fabro-cli/src/commands/run/cp.rs +++ b/lib/crates/fabro-cli/src/commands/run/cp.rs @@ -2,7 +2,6 @@ use std::path::{Path, PathBuf}; use anyhow::{Context, Result, bail}; use fabro_agent::sandbox::Sandbox; -use fabro_config::FabroSettingsExt; use fabro_sandbox::reconnect::reconnect; use fabro_workflow::run_lookup::{resolve_run_combined, runs_base}; use tokio::fs; diff --git a/lib/crates/fabro-cli/src/commands/run/create.rs b/lib/crates/fabro-cli/src/commands/run/create.rs index a39997a05..942a11859 100644 --- a/lib/crates/fabro-cli/src/commands/run/create.rs +++ b/lib/crates/fabro-cli/src/commands/run/create.rs @@ -1,8 +1,8 @@ use std::path::PathBuf; use crate::args::RunArgs; -use fabro_config::{ConfigLayer, FabroSettings, FabroSettingsExt}; -use fabro_types::RunId; +use fabro_config::ConfigLayer; +use fabro_types::{RunId, Settings}; use fabro_util::terminal::Styles; use fabro_workflow::error::FabroError; use fabro_workflow::operations::{CreateRunInput, WorkflowInput, create}; @@ -25,7 +25,7 @@ pub(crate) async fn create_run( .ok_or_else(|| anyhow::anyhow!("--workflow is required"))?; let cli_args_config = ConfigLayer::try_from(args)?; let cwd = std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")); - let settings: FabroSettings = cli_args_config + let settings: Settings = cli_args_config .combine(ConfigLayer::for_workflow(workflow_path, &cwd)?) .combine(cli_defaults) .resolve()?; diff --git a/lib/crates/fabro-cli/src/commands/run/detached.rs b/lib/crates/fabro-cli/src/commands/run/detached.rs index 01e1feef0..b6ff68f4f 100644 --- a/lib/crates/fabro-cli/src/commands/run/detached.rs +++ b/lib/crates/fabro-cli/src/commands/run/detached.rs @@ -2,7 +2,6 @@ use std::path::PathBuf; use std::sync::Arc; use anyhow::{Result, anyhow}; -use fabro_config::FabroSettingsExt; use fabro_interview::FileInterviewer; use fabro_store::{RuntimeState, Store}; use fabro_types::RunId; diff --git a/lib/crates/fabro-cli/src/commands/run/diff.rs b/lib/crates/fabro-cli/src/commands/run/diff.rs index e0b7cbbc5..67e58f481 100644 --- a/lib/crates/fabro-cli/src/commands/run/diff.rs +++ b/lib/crates/fabro-cli/src/commands/run/diff.rs @@ -2,7 +2,6 @@ use std::io::{self, IsTerminal, Write}; use std::path::Path; use anyhow::{Context, Result, bail}; -use fabro_config::FabroSettingsExt; use fabro_sandbox::reconnect::reconnect; use fabro_workflow::run_lookup::{resolve_run_combined, runs_base}; use fabro_workflow::sandbox_git::GIT_REMOTE; diff --git a/lib/crates/fabro-cli/src/commands/run/fork.rs b/lib/crates/fabro-cli/src/commands/run/fork.rs index adccaac1a..d5b699c95 100644 --- a/lib/crates/fabro-cli/src/commands/run/fork.rs +++ b/lib/crates/fabro-cli/src/commands/run/fork.rs @@ -1,7 +1,6 @@ use anyhow::Context; use anyhow::Result; use fabro_checkpoint::git::Store; -use fabro_config::FabroSettingsExt; use fabro_util::terminal::Styles; use fabro_workflow::operations::{ ForkRunInput, RewindTarget, build_timeline_or_rebuild, find_run_id_by_prefix_or_store, fork, diff --git a/lib/crates/fabro-cli/src/commands/run/launcher.rs b/lib/crates/fabro-cli/src/commands/run/launcher.rs index 52e33e254..abdedc447 100644 --- a/lib/crates/fabro-cli/src/commands/run/launcher.rs +++ b/lib/crates/fabro-cli/src/commands/run/launcher.rs @@ -2,7 +2,6 @@ use std::path::{Path, PathBuf}; use anyhow::{Context, Result}; use chrono::{DateTime, Utc}; -use fabro_config::FabroSettingsExt; use fabro_types::RunId; use fabro_workflow::records::{RunRecord, RunRecordExt}; use serde::{Deserialize, Serialize}; @@ -132,9 +131,8 @@ fn launcher_process_matches(_record: &LauncherRecord) -> bool { mod tests { use super::*; use chrono::Utc; - use fabro_config::FabroSettings; use fabro_graphviz::graph::Graph; - use fabro_types::fixtures; + use fabro_types::{Settings, fixtures}; use fabro_workflow::records::RunRecord; #[test] @@ -147,7 +145,7 @@ mod tests { RunRecord { run_id: fixtures::RUN_1, created_at: Utc::now(), - settings: FabroSettings { + settings: Settings { storage_dir: Some(storage_dir.clone()), ..Default::default() }, diff --git a/lib/crates/fabro-cli/src/commands/run/logs.rs b/lib/crates/fabro-cli/src/commands/run/logs.rs index cb94410b4..ed39bde0c 100644 --- a/lib/crates/fabro-cli/src/commands/run/logs.rs +++ b/lib/crates/fabro-cli/src/commands/run/logs.rs @@ -5,7 +5,6 @@ use std::time::Duration; use anyhow::{Context, Result, bail}; use chrono::{DateTime, Utc}; -use fabro_config::FabroSettingsExt; use fabro_store::RunStore; use fabro_util::redact::redact_jsonl_line; use fabro_util::terminal::Styles; diff --git a/lib/crates/fabro-cli/src/commands/run/mod.rs b/lib/crates/fabro-cli/src/commands/run/mod.rs index 33151cee6..27df84f71 100644 --- a/lib/crates/fabro-cli/src/commands/run/mod.rs +++ b/lib/crates/fabro-cli/src/commands/run/mod.rs @@ -1,5 +1,4 @@ use anyhow::Result; -use fabro_config::FabroSettingsExt; use fabro_util::terminal::Styles; use fabro_workflow::run_lookup::{resolve_run_combined, runs_base}; diff --git a/lib/crates/fabro-cli/src/commands/run/preview.rs b/lib/crates/fabro-cli/src/commands/run/preview.rs index 4b99e2367..8118e454c 100644 --- a/lib/crates/fabro-cli/src/commands/run/preview.rs +++ b/lib/crates/fabro-cli/src/commands/run/preview.rs @@ -1,5 +1,4 @@ use anyhow::{Context, Result}; -use fabro_config::FabroSettingsExt; use fabro_sandbox::daytona::DaytonaSandbox; use fabro_workflow::run_lookup::{resolve_run_combined, runs_base}; use tracing::info; diff --git a/lib/crates/fabro-cli/src/commands/run/resume.rs b/lib/crates/fabro-cli/src/commands/run/resume.rs index f7697ff71..3990071ae 100644 --- a/lib/crates/fabro-cli/src/commands/run/resume.rs +++ b/lib/crates/fabro-cli/src/commands/run/resume.rs @@ -1,5 +1,4 @@ use anyhow::bail; -use fabro_config::FabroSettingsExt; use fabro_util::terminal::Styles; use fabro_workflow::run_lookup::{resolve_run_combined, runs_base}; diff --git a/lib/crates/fabro-cli/src/commands/run/rewind.rs b/lib/crates/fabro-cli/src/commands/run/rewind.rs index b6e0036c7..37228c757 100644 --- a/lib/crates/fabro-cli/src/commands/run/rewind.rs +++ b/lib/crates/fabro-cli/src/commands/run/rewind.rs @@ -3,7 +3,6 @@ use anyhow::Result; use cli_table::format::{Border, Separator}; use cli_table::{Cell, CellStruct, Color, Style, Table}; use fabro_checkpoint::git::Store; -use fabro_config::FabroSettingsExt; use fabro_util::terminal::Styles; use fabro_workflow::git::MetadataStore; use fabro_workflow::operations::{ diff --git a/lib/crates/fabro-cli/src/commands/run/ssh.rs b/lib/crates/fabro-cli/src/commands/run/ssh.rs index 4d0f98d4d..11a2c7011 100644 --- a/lib/crates/fabro-cli/src/commands/run/ssh.rs +++ b/lib/crates/fabro-cli/src/commands/run/ssh.rs @@ -1,5 +1,4 @@ use anyhow::{Context, Result, bail}; -use fabro_config::FabroSettingsExt; use fabro_sandbox::daytona::DaytonaSandbox; use fabro_workflow::run_lookup::{resolve_run_combined, runs_base}; use tracing::info; diff --git a/lib/crates/fabro-cli/src/commands/run/wait.rs b/lib/crates/fabro-cli/src/commands/run/wait.rs index a0b408e6c..f4d053a8a 100644 --- a/lib/crates/fabro-cli/src/commands/run/wait.rs +++ b/lib/crates/fabro-cli/src/commands/run/wait.rs @@ -1,7 +1,6 @@ use std::io::Write; use anyhow::{Result, bail}; -use fabro_config::FabroSettingsExt; use fabro_types::RunId; use fabro_util::terminal::Styles; use fabro_workflow::records::Conclusion; diff --git a/lib/crates/fabro-cli/src/commands/runs/inspect.rs b/lib/crates/fabro-cli/src/commands/runs/inspect.rs index 3f523fdd8..8fcfe9bf2 100644 --- a/lib/crates/fabro-cli/src/commands/runs/inspect.rs +++ b/lib/crates/fabro-cli/src/commands/runs/inspect.rs @@ -1,7 +1,6 @@ use std::path::{Path, PathBuf}; use anyhow::{Result, anyhow}; -use fabro_config::FabroSettingsExt; use fabro_types::RunId; use serde::Serialize; diff --git a/lib/crates/fabro-cli/src/commands/runs/list.rs b/lib/crates/fabro-cli/src/commands/runs/list.rs index 62ac9922c..2c5343186 100644 --- a/lib/crates/fabro-cli/src/commands/runs/list.rs +++ b/lib/crates/fabro-cli/src/commands/runs/list.rs @@ -4,7 +4,6 @@ use anyhow::Result; use chrono::Utc; use cli_table::format::{Border, Separator}; use cli_table::{Cell, CellStruct, Color, Style, Table}; -use fabro_config::FabroSettingsExt; use fabro_util::terminal::Styles; use fabro_util::text::strip_goal_decoration; diff --git a/lib/crates/fabro-cli/src/commands/runs/rm.rs b/lib/crates/fabro-cli/src/commands/runs/rm.rs index f8216c403..82bf91064 100644 --- a/lib/crates/fabro-cli/src/commands/runs/rm.rs +++ b/lib/crates/fabro-cli/src/commands/runs/rm.rs @@ -1,7 +1,6 @@ use std::path::Path; use anyhow::{Context, Result, bail}; -use fabro_config::FabroSettingsExt; use fabro_store::Store; use tracing::warn; diff --git a/lib/crates/fabro-cli/src/commands/store/dump.rs b/lib/crates/fabro-cli/src/commands/store/dump.rs index e1dd9b592..895b6c9b6 100644 --- a/lib/crates/fabro-cli/src/commands/store/dump.rs +++ b/lib/crates/fabro-cli/src/commands/store/dump.rs @@ -2,7 +2,6 @@ use std::io::{ErrorKind, Write}; use std::path::{Component, Path, PathBuf}; use anyhow::{Context, Result, bail}; -use fabro_config::FabroSettingsExt; use fabro_store::{NodeVisitRef, RunSnapshot, RunStore}; use fabro_workflow::run_lookup::{resolve_run_combined, runs_base}; use serde::Serialize; @@ -360,9 +359,9 @@ mod tests { use chrono::{DateTime, Utc}; use fabro_store::{EventEnvelope, EventPayload, InMemoryStore, Store as _}; use fabro_types::{ - AggregateStats, AttrValue, Checkpoint, Conclusion, FabroSettings, Graph, NodeStatusRecord, - Retro, RunId, RunRecord, RunStatus, RunStatusRecord, SandboxRecord, StageStatus, - StartRecord, StatusReason, fixtures, + AggregateStats, AttrValue, Checkpoint, Conclusion, Graph, NodeStatusRecord, Retro, RunId, + RunRecord, RunStatus, RunStatusRecord, SandboxRecord, Settings, StageStatus, StartRecord, + StatusReason, fixtures, }; fn dt(rfc3339: &str) -> DateTime { @@ -384,7 +383,7 @@ mod tests { RunRecord { run_id, created_at, - settings: FabroSettings::default(), + settings: Settings::default(), graph, workflow_slug: Some("night-sky".to_string()), working_directory: PathBuf::from("/tmp/night-sky"), diff --git a/lib/crates/fabro-cli/src/commands/system/df.rs b/lib/crates/fabro-cli/src/commands/system/df.rs index dfc6c3e80..ad11b0cd6 100644 --- a/lib/crates/fabro-cli/src/commands/system/df.rs +++ b/lib/crates/fabro-cli/src/commands/system/df.rs @@ -4,7 +4,6 @@ use anyhow::Result; use chrono::{DateTime, Utc}; use cli_table::format::{Border, Justify, Separator}; use cli_table::{Cell, CellStruct, Style, Table}; -use fabro_config::FabroSettingsExt; use serde::Serialize; use fabro_workflow::run_lookup::{logs_base, runs_base, scan_runs_combined}; diff --git a/lib/crates/fabro-cli/src/commands/system/prune.rs b/lib/crates/fabro-cli/src/commands/system/prune.rs index 20c4ec5ad..080333f98 100644 --- a/lib/crates/fabro-cli/src/commands/system/prune.rs +++ b/lib/crates/fabro-cli/src/commands/system/prune.rs @@ -2,7 +2,6 @@ use std::path::Path; use anyhow::{Context, Result, bail}; use chrono::Utc; -use fabro_config::FabroSettingsExt; use fabro_store::Store; use serde::Serialize; use tracing::{debug, info}; diff --git a/lib/crates/fabro-cli/src/user_config.rs b/lib/crates/fabro-cli/src/user_config.rs index 5a473637e..063cbd1f5 100644 --- a/lib/crates/fabro-cli/src/user_config.rs +++ b/lib/crates/fabro-cli/src/user_config.rs @@ -5,14 +5,14 @@ use std::path::Path; pub(crate) use fabro_config::user::*; use fabro_config::ConfigLayer; -use fabro_config::FabroSettings; +use fabro_types::Settings; use crate::args::GlobalArgs; #[cfg(feature = "server")] use tracing::debug; -pub(crate) fn load_user_settings() -> anyhow::Result { +pub(crate) fn load_user_settings() -> anyhow::Result { ConfigLayer::user()?.resolve() } @@ -21,9 +21,7 @@ pub(crate) fn user_layer_with_globals(globals: &GlobalArgs) -> anyhow::Result anyhow::Result { +pub(crate) fn load_user_settings_with_globals(globals: &GlobalArgs) -> anyhow::Result { user_layer_with_globals(globals)?.resolve() } @@ -57,7 +55,7 @@ const DEFAULT_SERVER_URL: &str = "http://localhost:3000/api/v1"; pub(crate) fn resolve_mode( cli_storage_dir: Option<&Path>, cli_server_url: Option<&str>, - settings: &FabroSettings, + settings: &Settings, ) -> ResolvedMode { let mode = if cli_server_url.is_some() { ExecutionMode::Server @@ -127,7 +125,7 @@ mod tests { #[test] fn resolve_mode_defaults_to_standalone() { - let settings = FabroSettings::default(); + let settings = Settings::default(); let resolved = resolve_mode(None, None, &settings); assert_eq!(resolved.mode, ExecutionMode::Standalone); assert_eq!(resolved.server_base_url, DEFAULT_SERVER_URL); @@ -136,9 +134,9 @@ mod tests { #[test] fn resolve_mode_storage_dir_forces_standalone() { - let settings = FabroSettings { + let settings = Settings { mode: Some(ExecutionMode::Server), - ..FabroSettings::default() + ..Settings::default() }; let resolved = resolve_mode(Some(Path::new("/tmp/fabro")), None, &settings); assert_eq!(resolved.mode, ExecutionMode::Standalone); @@ -146,13 +144,13 @@ mod tests { #[test] fn resolve_mode_server_url_forces_server() { - let settings = FabroSettings { + let settings = Settings { mode: Some(ExecutionMode::Standalone), server: Some(ServerSettings { base_url: Some("https://config.example.com".to_string()), tls: None, }), - ..FabroSettings::default() + ..Settings::default() }; let resolved = resolve_mode(None, Some("https://cli.example.com"), &settings); assert_eq!(resolved.mode, ExecutionMode::Server); @@ -161,13 +159,13 @@ mod tests { #[test] fn resolve_mode_config_overrides_default() { - let settings = FabroSettings { + let settings = Settings { mode: Some(ExecutionMode::Server), server: Some(ServerSettings { base_url: Some("https://config.example.com".to_string()), tls: None, }), - ..FabroSettings::default() + ..Settings::default() }; let resolved = resolve_mode(None, None, &settings); assert_eq!(resolved.mode, ExecutionMode::Server); @@ -176,12 +174,12 @@ mod tests { #[test] fn resolve_mode_cli_url_overrides_config_url() { - let settings = FabroSettings { + let settings = Settings { server: Some(ServerSettings { base_url: Some("https://config.example.com".to_string()), tls: None, }), - ..FabroSettings::default() + ..Settings::default() }; let resolved = resolve_mode(None, Some("https://cli.example.com"), &settings); assert_eq!(resolved.server_base_url, "https://cli.example.com"); @@ -194,12 +192,12 @@ mod tests { key: PathBuf::from("key.pem"), ca: PathBuf::from("ca.pem"), }; - let settings = FabroSettings { + let settings = Settings { server: Some(ServerSettings { base_url: None, tls: Some(tls.clone()), }), - ..FabroSettings::default() + ..Settings::default() }; let resolved = resolve_mode(None, None, &settings); assert_eq!(resolved.tls, Some(tls)); diff --git a/lib/crates/fabro-cli/tests/it/cmd/config.rs b/lib/crates/fabro-cli/tests/it/cmd/config.rs index 4be60cd79..111cbb02c 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/config.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/config.rs @@ -1,10 +1,10 @@ use std::path::PathBuf; -use fabro_config::FabroSettings; use fabro_config::mcp::McpTransport; #[cfg(feature = "server")] use fabro_config::user::ExecutionMode; use fabro_test::{fabro_snapshot, test_context}; +use fabro_types::Settings; use predicates::prelude::*; use super::support::run_snapshot; @@ -59,8 +59,8 @@ fn old_config_show_command_is_rejected() { // Helpers // --------------------------------------------------------------------------- -fn parse_settings(stdout: &[u8]) -> FabroSettings { - serde_yaml::from_slice(stdout).expect("stdout should be valid YAML FabroSettings") +fn parse_settings(stdout: &[u8]) -> Settings { + serde_yaml::from_slice(stdout).expect("stdout should be valid YAML Settings") } /// Set up home config and project config for settings command tests. diff --git a/lib/crates/fabro-config/src/config.rs b/lib/crates/fabro-config/src/config.rs index 56c6f46c2..a70b69f6a 100644 --- a/lib/crates/fabro-config/src/config.rs +++ b/lib/crates/fabro-config/src/config.rs @@ -12,8 +12,8 @@ use crate::run::{ }; use crate::sandbox::SandboxConfig; use crate::server::{self, ApiConfig, FeaturesConfig, GitConfig, LogConfig, WebConfig}; -use crate::settings::FabroSettings; use crate::user::{self, ExecConfig, ExecutionMode, ServerConfig}; +use fabro_types::Settings; fn is_default_checkpoint(c: &CheckpointConfig) -> bool { c.exclude_globs.is_empty() @@ -233,7 +233,7 @@ impl ConfigLayer { } /// Convert this combined config layer into final resolved settings. - pub fn resolve(self) -> anyhow::Result { + pub fn resolve(self) -> anyhow::Result { self.try_into() } } diff --git a/lib/crates/fabro-config/src/lib.rs b/lib/crates/fabro-config/src/lib.rs index 11c1aa350..1861a4b05 100644 --- a/lib/crates/fabro-config/src/lib.rs +++ b/lib/crates/fabro-config/src/lib.rs @@ -15,7 +15,6 @@ pub mod user; pub use config::ConfigLayer; pub use fabro_types::Combine; pub use fabro_util::path::expand_tilde; -pub use settings::{FabroSettings, FabroSettingsExt}; use std::path::Path; diff --git a/lib/crates/fabro-config/src/project.rs b/lib/crates/fabro-config/src/project.rs index ce5bf125f..596c08887 100644 --- a/lib/crates/fabro-config/src/project.rs +++ b/lib/crates/fabro-config/src/project.rs @@ -4,9 +4,9 @@ use std::path::{Path, PathBuf}; use anyhow::{Context, bail}; use serde::{Deserialize, Serialize}; -use crate::FabroSettings; use crate::config::ConfigLayer; use crate::run; +use fabro_types::Settings; pub use fabro_types::settings::project::ProjectSettings; const CONFIG_FILENAME: &str = "fabro.toml"; @@ -171,7 +171,7 @@ pub fn resolve_workflow_path( } } -pub fn resolve_working_directory(settings: &FabroSettings, caller_cwd: &Path) -> PathBuf { +pub fn resolve_working_directory(settings: &Settings, caller_cwd: &Path) -> PathBuf { let Some(work_dir) = settings.work_dir.as_deref() else { return caller_cwd.to_path_buf(); }; diff --git a/lib/crates/fabro-config/src/server.rs b/lib/crates/fabro-config/src/server.rs index 92bfa2700..5eced8d75 100644 --- a/lib/crates/fabro-config/src/server.rs +++ b/lib/crates/fabro-config/src/server.rs @@ -4,7 +4,7 @@ use anyhow::anyhow; use serde::{Deserialize, Serialize}; use crate::config::ConfigLayer; -use crate::settings::{FabroSettings, FabroSettingsExt}; +use fabro_types::Settings; pub use fabro_types::settings::server::{ ApiAuthStrategy, ApiSettings, AuthProvider, AuthSettings, FeaturesSettings, GitAuthorSettings, GitProvider, GitSettings, LogSettings, TlsSettings, WebSettings, WebhookSettings, @@ -185,11 +185,11 @@ pub fn load_server_config(path: Option<&Path>) -> anyhow::Result { crate::load_config_file(path, "server.toml") } -pub fn load_server_settings(path: Option<&Path>) -> anyhow::Result { +pub fn load_server_settings(path: Option<&Path>) -> anyhow::Result { load_server_config(path)?.try_into() } /// Resolve the storage directory: config value > default `~/.fabro`. -pub fn resolve_storage_dir(settings: &FabroSettings) -> PathBuf { +pub fn resolve_storage_dir(settings: &Settings) -> PathBuf { settings.storage_dir() } diff --git a/lib/crates/fabro-config/src/settings.rs b/lib/crates/fabro-config/src/settings.rs index 169156baf..f0ec2c2f5 100644 --- a/lib/crates/fabro-config/src/settings.rs +++ b/lib/crates/fabro-config/src/settings.rs @@ -1,24 +1,8 @@ -use std::path::PathBuf; - -pub use fabro_types::settings::FabroSettings; +use fabro_types::Settings; use crate::config::ConfigLayer; -pub trait FabroSettingsExt { - fn storage_dir(&self) -> PathBuf; -} - -impl FabroSettingsExt for FabroSettings { - fn storage_dir(&self) -> PathBuf { - self.storage_dir.clone().unwrap_or_else(|| { - dirs::home_dir() - .expect("could not determine home directory") - .join(".fabro") - }) - } -} - -impl TryFrom for FabroSettings { +impl TryFrom for Settings { type Error = anyhow::Error; fn try_from(value: ConfigLayer) -> Result { @@ -60,7 +44,7 @@ impl TryFrom for FabroSettings { } } -impl TryFrom<&ConfigLayer> for FabroSettings { +impl TryFrom<&ConfigLayer> for Settings { type Error = anyhow::Error; fn try_from(value: &ConfigLayer) -> Result { diff --git a/lib/crates/fabro-server/src/demo/mod.rs b/lib/crates/fabro-server/src/demo/mod.rs index f65b59ac5..2864ded99 100644 --- a/lib/crates/fabro-server/src/demo/mod.rs +++ b/lib/crates/fabro-server/src/demo/mod.rs @@ -1283,7 +1283,7 @@ mod runs { } pub(super) fn settings() -> serde_json::Value { - serde_json::to_value(fabro_config::FabroSettings { + serde_json::to_value(fabro_types::Settings { version: Some(1), goal: Some("Add rate limiting to auth endpoints".into()), graph: Some("implement.fabro".into()), @@ -1435,7 +1435,7 @@ mod workflows { ] } - fn run_settings_to_api(cfg: fabro_config::FabroSettings) -> RunSettings { + fn run_settings_to_api(cfg: fabro_types::Settings) -> RunSettings { fn strip_nulls(val: serde_json::Value) -> serde_json::Value { match val { serde_json::Value::Object(map) => serde_json::Value::Object( @@ -1459,7 +1459,7 @@ mod workflows { WorkflowDetail { name: "Fix Build".into(), slug: "fix_build".into(), filename: "fix_build.fabro".into(), description: "Automatically diagnoses and fixes CI build failures by analyzing error logs, identifying root causes, and applying targeted code changes.".into(), - settings: run_settings_to_api(fabro_config::FabroSettings { + settings: run_settings_to_api(fabro_types::Settings { version: Some(1), goal: Some("Diagnose and fix CI build failures".into()), graph: Some("fix_build.fabro".into()), @@ -1528,7 +1528,7 @@ mod workflows { WorkflowDetail { name: "Implement Feature".into(), slug: "implement".into(), filename: "implement.fabro".into(), description: "Generates production-ready code from a technical blueprint, including tests, documentation, and a pull request ready for review.".into(), - settings: run_settings_to_api(fabro_config::FabroSettings { + settings: run_settings_to_api(fabro_types::Settings { version: Some(1), goal: Some("Implement feature from technical blueprint".into()), graph: Some("implement.fabro".into()), @@ -1615,7 +1615,7 @@ mod workflows { WorkflowDetail { name: "Sync Drift".into(), slug: "sync_drift".into(), filename: "sync_drift.fabro".into(), description: "Detects configuration and code drift between environments, then generates reconciliation patches to bring everything back in sync.".into(), - settings: run_settings_to_api(fabro_config::FabroSettings { + settings: run_settings_to_api(fabro_types::Settings { version: Some(1), goal: Some("Detect and reconcile configuration drift across environments".into()), graph: Some("sync_drift.fabro".into()), @@ -1690,7 +1690,7 @@ mod workflows { WorkflowDetail { name: "Expand Product".into(), slug: "expand".into(), filename: "expand.fabro".into(), description: "Evolves the product by analyzing usage patterns and specifications to propose and implement incremental improvements.".into(), - settings: run_settings_to_api(fabro_config::FabroSettings { + settings: run_settings_to_api(fabro_types::Settings { version: Some(1), goal: Some("Propose and implement incremental product improvements".into()), graph: Some("expand.fabro".into()), @@ -3453,11 +3453,11 @@ mod insights { } mod settings { - use fabro_config::FabroSettings; use fabro_config::server::*; + use fabro_types::Settings; pub(super) fn server_settings() -> serde_json::Value { - serde_json::to_value(FabroSettings { + serde_json::to_value(Settings { storage_dir: Some("/home/fabro/.fabro".into()), max_concurrent_runs: Some(10), web: Some(WebSettings { diff --git a/lib/crates/fabro-server/src/lib.rs b/lib/crates/fabro-server/src/lib.rs index a914b1cc6..537b3ec18 100644 --- a/lib/crates/fabro-server/src/lib.rs +++ b/lib/crates/fabro-server/src/lib.rs @@ -12,8 +12,8 @@ pub mod serve; pub mod server; pub mod static_files; pub mod server_config { - pub use fabro_config::FabroSettings; pub use fabro_config::server::*; + pub use fabro_types::Settings; } pub mod sessions; pub mod tls; diff --git a/lib/crates/fabro-server/src/serve.rs b/lib/crates/fabro-server/src/serve.rs index 2ad1811fb..7dfeed151 100644 --- a/lib/crates/fabro-server/src/serve.rs +++ b/lib/crates/fabro-server/src/serve.rs @@ -11,7 +11,7 @@ use tracing::{error, info, warn}; use clap::Args; -use fabro_config::FabroSettings; +use fabro_types::Settings; use crate::github_webhooks::WebhookManager; use crate::jwt_auth::{AuthMode, AuthStrategy, resolve_auth_mode}; @@ -55,11 +55,7 @@ pub struct ServeArgs { pub config: Option, } -fn apply_serve_overrides( - base: &FabroSettings, - args: &ServeArgs, - dry_run_mode: bool, -) -> FabroSettings { +fn apply_serve_overrides(base: &Settings, args: &ServeArgs, dry_run_mode: bool) -> Settings { let mut settings = base.clone(); if dry_run_mode { settings.dry_run = Some(true); diff --git a/lib/crates/fabro-server/src/server.rs b/lib/crates/fabro-server/src/server.rs index 9285a0942..55f6de369 100644 --- a/lib/crates/fabro-server/src/server.rs +++ b/lib/crates/fabro-server/src/server.rs @@ -13,7 +13,6 @@ use axum::response::{IntoResponse, Response}; use axum::routing::{get, post}; use axum::{Json, Router}; use axum_extra::extract::cookie::Key; -use fabro_config::FabroSettings; use fabro_llm::client::Client as LlmClient; use fabro_llm::generate::{GenerateParams, generate, generate_object}; use fabro_llm::types::{ @@ -21,7 +20,7 @@ use fabro_llm::types::{ Response as LlmResponse, Role, StreamEvent, ToolChoice, ToolDefinition, Usage, }; use fabro_store::{InMemoryStore, Store}; -use fabro_types::RunId; +use fabro_types::{RunId, Settings}; use fabro_util::redact::redact_jsonl_line; use fabro_workflow::error::FabroError; use fabro_workflow::handler::HandlerRegistry; @@ -131,7 +130,7 @@ pub struct AppState { scheduler_notify: Notify, pub sessions: SessionStore, llm_client: OnceCell, - pub(crate) settings: Arc>, + pub(crate) settings: Arc>, pub(crate) session_key: Option, registry_factory_override: Option>, } @@ -405,7 +404,7 @@ async fn get_aggregate_usage( /// Create an `AppState` with the given LLM spec factory and database pool. pub fn create_app_state(db: sqlx::SqlitePool) -> Arc { - create_app_state_with_options(db, FabroSettings::default(), 5) + create_app_state_with_options(db, Settings::default(), 5) } #[doc(hidden)] @@ -415,7 +414,7 @@ pub fn create_app_state_with_registry_factory( ) -> Arc { build_app_state( db, - Arc::new(RwLock::new(FabroSettings::default())), + Arc::new(RwLock::new(Settings::default())), Some(Box::new(registry_factory_override)), 5, Arc::new(InMemoryStore::default()), @@ -425,7 +424,7 @@ pub fn create_app_state_with_registry_factory( /// Create an `AppState` with the given database pool, settings, and concurrency limit. pub fn create_app_state_with_options( db: sqlx::SqlitePool, - settings: FabroSettings, + settings: Settings, max_concurrent_runs: usize, ) -> Arc { create_app_state_with_store( @@ -438,7 +437,7 @@ pub fn create_app_state_with_options( pub fn create_app_state_with_store( db: sqlx::SqlitePool, - settings: Arc>, + settings: Arc>, max_concurrent_runs: usize, store: Arc, ) -> Arc { @@ -447,7 +446,7 @@ pub fn create_app_state_with_store( fn build_app_state( db: sqlx::SqlitePool, - settings: Arc>, + settings: Arc>, registry_factory_override: Option>, max_concurrent_runs: usize, store: Arc, @@ -1636,8 +1635,8 @@ mod tests { const POLL_INTERVAL: std::time::Duration = std::time::Duration::from_millis(10); const POLL_ATTEMPTS: usize = 500; - fn dry_run_settings() -> FabroSettings { - FabroSettings { + fn dry_run_settings() -> Settings { + Settings { dry_run: Some(true), ..Default::default() } @@ -1716,7 +1715,7 @@ mod tests { #[tokio::test] async fn auth_login_github_redirects_to_github() { - let mut settings = FabroSettings::default(); + let mut settings = Settings::default(); settings.web = Some(WebSettings { url: "http://localhost:3000".to_string(), auth: AuthSettings { @@ -2431,7 +2430,7 @@ mod tests { #[tokio::test] async fn start_run_persists_full_settings_snapshot() { - let settings = FabroSettings { + let settings = Settings { dry_run: Some(true), llm: Some(fabro_config::run::LlmSettings { model: Some("claude-sonnet-4-5".to_string()), @@ -2534,7 +2533,7 @@ mod tests { let body = body_json(response.into_body()).await; let run_id = body["id"].as_str().unwrap().parse::().unwrap(); - *state.settings.write().unwrap() = FabroSettings::default(); + *state.settings.write().unwrap() = Settings::default(); execute_run(Arc::clone(&state), run_id).await; @@ -2592,7 +2591,7 @@ mod tests { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn cancel_during_startup_persists_cancelled_reason() { - let settings = FabroSettings { + let settings = Settings { setup: Some(fabro_config::run::SetupSettings { commands: vec!["sleep 5".to_string()], timeout_ms: Some(30_000), @@ -2754,7 +2753,7 @@ mod tests { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn concurrency_limit_respected() { - let state = create_app_state_with_options(test_db().await, FabroSettings::default(), 1); + let state = create_app_state_with_options(test_db().await, Settings::default(), 1); let app = test_app_with_scheduler(state); // Submit two runs with max_concurrent_runs=1 diff --git a/lib/crates/fabro-server/src/sessions.rs b/lib/crates/fabro-server/src/sessions.rs index ce976c38d..e9368cf99 100644 --- a/lib/crates/fabro-server/src/sessions.rs +++ b/lib/crates/fabro-server/src/sessions.rs @@ -444,7 +444,7 @@ mod tests { let db = test_db().await; let state = create_app_state_with_options( db, - fabro_config::FabroSettings { + fabro_types::Settings { dry_run: Some(true), ..Default::default() }, diff --git a/lib/crates/fabro-server/src/web_auth.rs b/lib/crates/fabro-server/src/web_auth.rs index 115233d44..1bd4e6d89 100644 --- a/lib/crates/fabro-server/src/web_auth.rs +++ b/lib/crates/fabro-server/src/web_auth.rs @@ -9,7 +9,7 @@ use axum::{Json, Router, routing::get, routing::post}; use base64::Engine; use base64::engine::general_purpose::STANDARD; use cookie::{Cookie, CookieJar, Expiration, Key, SameSite, time::Duration}; -use fabro_config::FabroSettings; +use fabro_types::Settings; use fabro_types::settings::{ApiAuthStrategy, GitProvider, GitSettings}; use serde::{Deserialize, Serialize}; use serde_json::json; @@ -155,7 +155,7 @@ fn json_response(status: StatusCode, body: serde_json::Value) -> Response { (status, Json(body)).into_response() } -fn features_json(settings: &FabroSettings) -> serde_json::Value { +fn features_json(settings: &Settings) -> serde_json::Value { let features = settings.features.clone().unwrap_or_default(); json!({ "session_sandboxes": features.session_sandboxes, @@ -560,7 +560,7 @@ async fn setup_register( Json(json!({"ok": true, "restart_required": true})).into_response() } -fn build_server_toml(settings: &FabroSettings, git: &GitSettings) -> String { +fn build_server_toml(settings: &Settings, git: &GitSettings) -> String { let web_url = settings.web.as_ref().map_or_else( || "http://localhost:3000".to_string(), |web| web.url.clone(), diff --git a/lib/crates/fabro-server/tests/it/api.rs b/lib/crates/fabro-server/tests/it/api.rs index 386b5171f..88850eff8 100644 --- a/lib/crates/fabro-server/tests/it/api.rs +++ b/lib/crates/fabro-server/tests/it/api.rs @@ -662,7 +662,7 @@ mod sse_events { use axum::body::Body; use axum::http::{Request, StatusCode}; use fabro_server::server::{build_router, create_app_state_with_options}; - use fabro_types::settings::FabroSettings; + use fabro_types::Settings; use http_body_util::BodyExt; use tower::ServiceExt; @@ -677,8 +677,8 @@ mod sse_events { const POLL_INTERVAL: Duration = Duration::from_millis(10); const POLL_ATTEMPTS: usize = 500; - fn dry_run_settings() -> FabroSettings { - FabroSettings { + fn dry_run_settings() -> Settings { + Settings { dry_run: Some(true), ..Default::default() } @@ -858,7 +858,7 @@ mod serve_dry_run { async fn dry_run_app() -> axum::Router { let state = create_app_state_with_options( test_db().await, - fabro_config::FabroSettings { + fabro_types::Settings { dry_run: Some(true), ..Default::default() }, diff --git a/lib/crates/fabro-server/tests/it/openapi_conformance.rs b/lib/crates/fabro-server/tests/it/openapi_conformance.rs index 37af89db3..cb904fe1e 100644 --- a/lib/crates/fabro-server/tests/it/openapi_conformance.rs +++ b/lib/crates/fabro-server/tests/it/openapi_conformance.rs @@ -226,10 +226,10 @@ fn compare_schema( } } -/// Build a FabroSettings with every Option set to Some so all keys appear +/// Build a Settings with every Option set to Some so all keys appear /// in the serialized JSON. -fn fully_populated_server_config() -> FabroSettings { - FabroSettings { +fn fully_populated_server_config() -> Settings { + Settings { storage_dir: Some("/data".into()), max_concurrent_runs: Some(10), web: Some(WebSettings { diff --git a/lib/crates/fabro-store/src/memory.rs b/lib/crates/fabro-store/src/memory.rs index 8573b2c01..be1065b55 100644 --- a/lib/crates/fabro-store/src/memory.rs +++ b/lib/crates/fabro-store/src/memory.rs @@ -743,8 +743,8 @@ mod tests { use chrono::Duration as ChronoDuration; use fabro_types::{ - AttrValue, FabroSettings, Graph, PullRequestRecord, RunId, RunStatus, StageStatus, - StatusReason, fixtures, + AttrValue, Graph, PullRequestRecord, RunId, RunStatus, Settings, StageStatus, StatusReason, + fixtures, }; use tokio::time::timeout; @@ -773,7 +773,7 @@ mod tests { RunRecord { run_id: test_run_id(run_id), created_at, - settings: FabroSettings::default(), + settings: Settings::default(), graph, workflow_slug: Some("night-sky".to_string()), working_directory: PathBuf::from("/tmp/night-sky"), diff --git a/lib/crates/fabro-store/src/slate/mod.rs b/lib/crates/fabro-store/src/slate/mod.rs index a075d733d..40b169240 100644 --- a/lib/crates/fabro-store/src/slate/mod.rs +++ b/lib/crates/fabro-store/src/slate/mod.rs @@ -386,11 +386,11 @@ mod tests { use bytes::Bytes; use fabro_types::{ - AttrValue, Checkpoint, Conclusion, FabroSettings, Graph, NodeStatusRecord, RunId, - RunRecord, RunStatus, RunStatusRecord, StageStatus, StartRecord, StatusReason, fixtures, + AttrValue, Checkpoint, Conclusion, Graph, NodeStatusRecord, RunId, RunRecord, RunStatus, + RunStatusRecord, Settings, StageStatus, StartRecord, StatusReason, fixtures, }; use object_store::memory::InMemory; - use slatedb::config::Settings; + use slatedb::config::Settings as SlateSettings; use slatedb::{CloseReason, ErrorKind}; use tokio::time::timeout; @@ -425,7 +425,7 @@ mod tests { RunRecord { run_id: test_run_id(run_id), created_at, - settings: FabroSettings::default(), + settings: Settings::default(), graph, workflow_slug: Some("night-sky".to_string()), working_directory: PathBuf::from("/tmp/night-sky"), @@ -530,9 +530,9 @@ mod tests { include_init: bool, ) -> slatedb::Db { let db = slatedb::Db::builder(record.db_prefix.clone(), object_store) - .with_settings(Settings { + .with_settings(SlateSettings { flush_interval: Some(Duration::from_millis(1)), - ..Settings::default() + ..SlateSettings::default() }) .build() .await @@ -959,9 +959,9 @@ mod tests { let created_at = dt("2026-03-27T12:00:00Z"); let db_prefix = catalog::db_prefix("runs/", created_at, &test_run_id("run-1")); let db = slatedb::Db::builder(db_prefix.clone(), object_store) - .with_settings(Settings { + .with_settings(SlateSettings { flush_interval: Some(Duration::from_millis(1)), - ..Settings::default() + ..SlateSettings::default() }) .build() .await diff --git a/lib/crates/fabro-types/Cargo.toml b/lib/crates/fabro-types/Cargo.toml index 3b996e531..c66ac28c0 100644 --- a/lib/crates/fabro-types/Cargo.toml +++ b/lib/crates/fabro-types/Cargo.toml @@ -19,6 +19,7 @@ workspace = true [dependencies] chrono = { workspace = true, features = ["serde"] } clap = { workspace = true, optional = true } +dirs.workspace = true fabro-macros = { path = "../fabro-macros" } serde.workspace = true serde_json.workspace = true diff --git a/lib/crates/fabro-types/src/lib.rs b/lib/crates/fabro-types/src/lib.rs index ef302cc17..098e6f25b 100644 --- a/lib/crates/fabro-types/src/lib.rs +++ b/lib/crates/fabro-types/src/lib.rs @@ -32,7 +32,7 @@ pub use run::RunRecord; pub use run_id::RunId; pub use run_id::fixtures; pub use sandbox_record::SandboxRecord; -pub use settings::FabroSettings; +pub use settings::Settings; pub use start::StartRecord; pub use status::{ InvalidTransition, ParseRunStatusError, RunStatus, RunStatusRecord, StatusReason, diff --git a/lib/crates/fabro-types/src/run.rs b/lib/crates/fabro-types/src/run.rs index c465c1bd3..f0bbb90d1 100644 --- a/lib/crates/fabro-types/src/run.rs +++ b/lib/crates/fabro-types/src/run.rs @@ -6,13 +6,13 @@ use serde::{Deserialize, Serialize}; use crate::graph::Graph; use crate::run_id::RunId; -use crate::settings::FabroSettings; +use crate::settings::Settings; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct RunRecord { pub run_id: RunId, pub created_at: DateTime, - pub settings: FabroSettings, + pub settings: Settings, pub graph: Graph, #[serde(default, skip_serializing_if = "Option::is_none")] pub workflow_slug: Option, diff --git a/lib/crates/fabro-types/src/settings/mod.rs b/lib/crates/fabro-types/src/settings/mod.rs index de622095b..6ec1fd222 100644 --- a/lib/crates/fabro-types/src/settings/mod.rs +++ b/lib/crates/fabro-types/src/settings/mod.rs @@ -39,7 +39,7 @@ fn is_default_checkpoint(c: &CheckpointSettings) -> bool { } #[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)] -pub struct FabroSettings { +pub struct Settings { #[serde(default, skip_serializing_if = "Option::is_none")] pub version: Option, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -108,7 +108,7 @@ pub struct FabroSettings { pub fabro: Option, } -impl FabroSettings { +impl Settings { pub fn app_id(&self) -> Option<&str> { self.git.as_ref().and_then(|g| g.app_id.as_deref()) } @@ -183,4 +183,12 @@ impl FabroSettings { pub fn no_retro_enabled(&self) -> bool { self.no_retro.unwrap_or(false) } + + pub fn storage_dir(&self) -> PathBuf { + self.storage_dir.clone().unwrap_or_else(|| { + dirs::home_dir() + .expect("could not determine home directory") + .join(".fabro") + }) + } } diff --git a/lib/crates/fabro-workflow/src/git.rs b/lib/crates/fabro-workflow/src/git.rs index 0236a1446..7502dae5b 100644 --- a/lib/crates/fabro-workflow/src/git.rs +++ b/lib/crates/fabro-workflow/src/git.rs @@ -2,8 +2,8 @@ use std::path::Path; use std::process::Command; use fabro_checkpoint::git::Store; -use fabro_config::FabroSettings; use fabro_store::{NodeVisitRef, RunStore}; +use fabro_types::Settings; use crate::error::{FabroError, Result}; use tokio::task::{JoinError, spawn_blocking}; @@ -16,7 +16,7 @@ pub use fabro_checkpoint::metadata::MetadataStore; /// Branch prefix for workflow run branches (e.g. `fabro/run/{run_id}`). pub const RUN_BRANCH_PREFIX: &str = "fabro/run/"; -pub fn git_author_from_settings(settings: &FabroSettings) -> GitAuthor { +pub fn git_author_from_settings(settings: &Settings) -> GitAuthor { settings .git_author() .map(GitAuthor::from) @@ -592,7 +592,7 @@ mod tests { run.put_run(&RunRecord { run_id: fixtures::RUN_1, created_at, - settings: fabro_config::FabroSettings::default(), + settings: Settings::default(), graph: Graph::new("test"), workflow_slug: None, working_directory: std::path::PathBuf::from("."), diff --git a/lib/crates/fabro-workflow/src/handler/manager_loop.rs b/lib/crates/fabro-workflow/src/handler/manager_loop.rs index ac015d5b2..4c8763580 100644 --- a/lib/crates/fabro-workflow/src/handler/manager_loop.rs +++ b/lib/crates/fabro-workflow/src/handler/manager_loop.rs @@ -16,9 +16,9 @@ use crate::run_dir::visit_from_context; use crate::run_options::RunOptions; use async_trait::async_trait; use chrono::Utc; -use fabro_config::FabroSettings; use fabro_graphviz::graph::{AttrValue, Graph, Node}; use fabro_store::{InMemoryStore, Store}; +use fabro_types::Settings; use tokio::time::{sleep, timeout}; use super::{EngineServices, Handler}; @@ -65,7 +65,7 @@ fn parse_child_graph(node: &Node) -> Result { source: dot.to_string(), base_dir: None, }, - settings: FabroSettings::default(), + settings: Settings::default(), cwd: cwd.clone(), custom_transforms: Vec::new(), })?; @@ -81,7 +81,7 @@ fn parse_child_graph(node: &Node) -> Result { { let validated = validate(ValidateInput { workflow: WorkflowInput::Path(PathBuf::from(path)), - settings: FabroSettings::default(), + settings: Settings::default(), cwd, custom_transforms: Vec::new(), })?; @@ -161,7 +161,7 @@ impl Handler for SubWorkflowHandler { let child_cancel = Arc::clone(&cancel_token); let child_run_options = RunOptions { - settings: fabro_config::FabroSettings::default(), + settings: Settings::default(), run_dir: child_logs, cancel_token: Some(cancel_token), // Child workflows are part of the parent run's event stream. diff --git a/lib/crates/fabro-workflow/src/operations/create.rs b/lib/crates/fabro-workflow/src/operations/create.rs index 83cdea270..66afb487e 100644 --- a/lib/crates/fabro-workflow/src/operations/create.rs +++ b/lib/crates/fabro-workflow/src/operations/create.rs @@ -1,10 +1,9 @@ use chrono::{Local, Utc}; -use fabro_config::{FabroSettings, FabroSettingsExt}; use fabro_graphviz::graph::{AttrValue, Graph}; use fabro_model::{Catalog, Provider}; use fabro_sandbox::SandboxProvider; use fabro_store::Store; -use fabro_types::RunId; +use fabro_types::{RunId, Settings}; use std::collections::BTreeMap; use std::collections::HashMap; use std::path::{Path, PathBuf}; @@ -26,7 +25,7 @@ const RUN_CONFIG_FILE: &str = "workflow.toml"; #[derive(Clone, Debug)] pub struct CreateRunInput { pub workflow: WorkflowInput, - pub settings: FabroSettings, + pub settings: Settings, pub cwd: PathBuf, pub workflow_slug: Option, pub run_dir: Option, @@ -44,7 +43,7 @@ pub struct CreatedRun { } struct PersistCreateOptions { - settings: FabroSettings, + settings: Settings, run_dir: Option, run_id: Option, workflow_slug: Option, @@ -207,7 +206,7 @@ fn store_error(err: impl std::fmt::Display) -> FabroError { FabroError::engine(err.to_string()) } -fn validate_sandbox_provider(settings: &FabroSettings) -> Result<(), FabroError> { +fn validate_sandbox_provider(settings: &Settings) -> Result<(), FabroError> { if let Some(provider) = settings .sandbox_settings() .and_then(|sandbox| sandbox.provider.as_deref()) @@ -261,7 +260,7 @@ pub(super) fn preprocess_and_validate( dot_source: &str, base_dir: Option, custom_transforms: Vec>, - settings: Option<&FabroSettings>, + settings: Option<&Settings>, goal_override: Option<&str>, ) -> Result { let source = match settings.and_then(|resolved| resolved.vars.as_ref()) { @@ -338,7 +337,7 @@ fn persist_validated( ) } -pub(crate) fn resolve_run_settings(mut settings: FabroSettings, graph: &Graph) -> FabroSettings { +pub(crate) fn resolve_run_settings(mut settings: Settings, graph: &Graph) -> Settings { let llm_settings = settings.llm.as_ref(); let configured_model = llm_settings.and_then(|l| l.model.as_deref()); let configured_provider = llm_settings.and_then(|l| l.provider.as_deref()); @@ -414,7 +413,7 @@ mod tests { InMemoryStore::default() } - fn validate_dot(dot_source: &str, settings: FabroSettings) -> Validated { + fn validate_dot(dot_source: &str, settings: Settings) -> Validated { validate(ValidateInput { workflow: WorkflowInput::DotSource { source: dot_source.to_string(), @@ -436,7 +435,7 @@ mod tests { #[test] fn validate_minimal() { - let validated = validate_dot(MINIMAL_DOT, FabroSettings::default()); + let validated = validate_dot(MINIMAL_DOT, Settings::default()); validated.raise_on_errors().unwrap(); assert_eq!(validated.graph().name, "Test"); @@ -453,7 +452,7 @@ mod tests { exit [shape=Msquare] start -> work -> exit }"#; - let validated = validate_dot(dot, FabroSettings::default()); + let validated = validate_dot(dot, Settings::default()); validated.raise_on_errors().unwrap(); let prompt = validated.graph().nodes["work"] @@ -473,7 +472,7 @@ mod tests { exit [shape=Msquare] start -> work -> exit }"#; - let validated = validate_dot(dot, FabroSettings::default()); + let validated = validate_dot(dot, Settings::default()); validated.raise_on_errors().unwrap(); assert_eq!( @@ -493,7 +492,7 @@ mod tests { }"#; let validated = validate_dot( dot, - FabroSettings { + Settings { vars: Some(HashMap::from([("who".to_string(), "agent".to_string())])), goal: Some("override".to_string()), ..Default::default() @@ -517,7 +516,7 @@ mod tests { source: "not a graph".to_string(), base_dir: None, }, - settings: FabroSettings::default(), + settings: Settings::default(), cwd: PathBuf::from("."), custom_transforms: Vec::new(), }); @@ -530,7 +529,7 @@ mod tests { graph [goal="Test"] work [label="Work"] }"#; - let validated = validate_dot(dot, FabroSettings::default()); + let validated = validate_dot(dot, Settings::default()); assert!(validated.has_errors()); assert!(validated.raise_on_errors().is_err()); @@ -557,7 +556,7 @@ mod tests { source: MINIMAL_DOT.to_string(), base_dir: None, }, - settings: FabroSettings::default(), + settings: Settings::default(), cwd: PathBuf::from("."), custom_transforms: vec![Box::new(TagTransform)], }) @@ -590,7 +589,7 @@ mod tests { let validated = validate(ValidateInput { workflow: WorkflowInput::Path(dot_path), - settings: FabroSettings::default(), + settings: Settings::default(), cwd: dir.path().to_path_buf(), custom_transforms: Vec::new(), }) @@ -614,7 +613,7 @@ mod tests { source: dot.to_string(), base_dir: None, }, - settings: FabroSettings::default(), + settings: Settings::default(), cwd: dir.path().to_path_buf(), workflow_slug: None, run_dir: Some(dir.path().join("run")), @@ -645,7 +644,7 @@ mod tests { source: MINIMAL_DOT.to_string(), base_dir: None, }, - settings: FabroSettings { + settings: Settings { llm: Some(fabro_config::run::LlmSettings { model: Some("sonnet".to_string()), provider: None, @@ -734,7 +733,7 @@ mod tests { &store, CreateRunInput { workflow: WorkflowInput::Path(workflow_dir.join("workflow.toml")), - settings: FabroSettings { + settings: Settings { storage_dir: Some(dir.path().join("storage")), dry_run: Some(true), ..Default::default() @@ -770,7 +769,7 @@ mod tests { source: MINIMAL_DOT.to_string(), base_dir: None, }, - settings: FabroSettings { + settings: Settings { work_dir: Some("workspace".to_string()), dry_run: Some(true), ..Default::default() @@ -816,7 +815,7 @@ mod tests { source: MINIMAL_DOT.to_string(), base_dir: None, }, - settings: FabroSettings { + settings: Settings { storage_dir: Some(storage_dir.clone()), dry_run: Some(true), ..Default::default() diff --git a/lib/crates/fabro-workflow/src/operations/rebuild_meta.rs b/lib/crates/fabro-workflow/src/operations/rebuild_meta.rs index 4f5b31a7a..c7fa52049 100644 --- a/lib/crates/fabro-workflow/src/operations/rebuild_meta.rs +++ b/lib/crates/fabro-workflow/src/operations/rebuild_meta.rs @@ -333,11 +333,11 @@ mod tests { use std::sync::Arc; use chrono::{TimeZone, Utc}; - use fabro_config::FabroSettings; use fabro_graphviz::graph::Graph; use fabro_store::{InMemoryStore, NodeVisitRef, Store as _}; use fabro_types::{ - NodeStatusRecord, RunId, RunRecord, SandboxRecord, StageStatus, StartRecord, fixtures, + NodeStatusRecord, RunId, RunRecord, SandboxRecord, Settings, StageStatus, StartRecord, + fixtures, }; use super::*; @@ -360,7 +360,7 @@ mod tests { RunRecord { run_id, created_at: created_at(), - settings: FabroSettings::default(), + settings: Settings::default(), graph: Graph::new("test"), workflow_slug: None, working_directory: PathBuf::from("/tmp/project"), diff --git a/lib/crates/fabro-workflow/src/operations/source.rs b/lib/crates/fabro-workflow/src/operations/source.rs index 9228474e3..9b001042e 100644 --- a/lib/crates/fabro-workflow/src/operations/source.rs +++ b/lib/crates/fabro-workflow/src/operations/source.rs @@ -1,7 +1,8 @@ use std::path::{Path, PathBuf}; use anyhow::Context; -use fabro_config::{FabroSettings, project as project_config}; +use fabro_config::project as project_config; +use fabro_types::Settings; use fabro_util::path::expand_tilde; #[derive(Clone, Debug)] @@ -16,14 +17,14 @@ pub enum WorkflowInput { #[derive(Clone, Debug)] pub(crate) struct ResolveWorkflowInput { pub workflow: WorkflowInput, - pub settings: FabroSettings, + pub settings: Settings, pub cwd: PathBuf, } #[derive(Clone, Debug)] pub(crate) struct ResolvedWorkflow { pub raw_source: String, - pub settings: FabroSettings, + pub settings: Settings, pub workflow_slug: Option, pub workflow_toml_path: Option, pub dot_path: Option, @@ -125,7 +126,7 @@ mod tests { let resolved = resolve_workflow(ResolveWorkflowInput { workflow: WorkflowInput::Path(run_dir.join("workflow.toml")), - settings: FabroSettings::default(), + settings: Settings::default(), cwd: dir.path().to_path_buf(), }) .unwrap(); @@ -146,7 +147,7 @@ mod tests { source: "digraph Test { start -> exit }".to_string(), base_dir: None, }, - settings: FabroSettings { + settings: Settings { work_dir: Some("workspace".to_string()), ..Default::default() }, diff --git a/lib/crates/fabro-workflow/src/operations/start.rs b/lib/crates/fabro-workflow/src/operations/start.rs index 3582de8fe..16fccd314 100644 --- a/lib/crates/fabro-workflow/src/operations/start.rs +++ b/lib/crates/fabro-workflow/src/operations/start.rs @@ -5,14 +5,13 @@ use std::sync::{Arc, Mutex}; use std::time::{Duration, Instant}; use chrono::Utc; -use fabro_config::FabroSettings; use fabro_config::sandbox::WorktreeMode; use fabro_config::{project as project_config, run as run_config, sandbox as sandbox_config}; use fabro_interview::{AutoApproveInterviewer, Interviewer}; use fabro_model::{Catalog, FallbackTarget, Provider}; use fabro_sandbox::{SandboxProvider, SandboxSpec}; use fabro_store::RunStore; -use fabro_types::RunId; +use fabro_types::{RunId, Settings}; use serde::Serialize; use crate::context::Context; @@ -370,7 +369,7 @@ impl RunSession { } } -fn resolve_sandbox_provider(settings: &FabroSettings) -> Result { +fn resolve_sandbox_provider(settings: &Settings) -> Result { settings .sandbox_settings() .and_then(|sandbox| sandbox.provider.as_deref()) @@ -380,11 +379,11 @@ fn resolve_sandbox_provider(settings: &FabroSettings) -> Result bool { +fn resolve_preserve_sandbox(settings: &Settings) -> bool { settings.preserve_sandbox_enabled() } -fn resolve_worktree_mode(settings: &FabroSettings) -> sandbox_config::WorktreeMode { +fn resolve_worktree_mode(settings: &Settings) -> sandbox_config::WorktreeMode { settings .sandbox_settings() .and_then(|sandbox| sandbox.local.as_ref()) @@ -392,7 +391,7 @@ fn resolve_worktree_mode(settings: &FabroSettings) -> sandbox_config::WorktreeMo .unwrap_or_default() } -fn resolve_daytona_config(settings: &FabroSettings) -> Option { +fn resolve_daytona_config(settings: &Settings) -> Option { settings .sandbox_settings() .and_then(|sandbox| sandbox.daytona.clone()) @@ -401,7 +400,7 @@ fn resolve_daytona_config(settings: &FabroSettings) -> Option { fn resolve_fallback_chain( provider: Provider, model: &str, - settings: &FabroSettings, + settings: &Settings, ) -> Vec { let fallbacks = settings.llm.as_ref().and_then(|llm| llm.fallbacks.as_ref()); @@ -837,9 +836,8 @@ mod tests { use std::sync::atomic::{AtomicBool, Ordering}; use chrono::Utc; - use fabro_config::FabroSettings; use fabro_store::{InMemoryStore, Store}; - use fabro_types::fixtures; + use fabro_types::{Settings, fixtures}; use super::*; use crate::context::Context; @@ -866,7 +864,7 @@ mod tests { source: dot.to_string(), base_dir: None, }, - settings: FabroSettings { + settings: Settings { dry_run: Some(true), ..Default::default() }, diff --git a/lib/crates/fabro-workflow/src/operations/validate.rs b/lib/crates/fabro-workflow/src/operations/validate.rs index 70f49eb04..a4b90561f 100644 --- a/lib/crates/fabro-workflow/src/operations/validate.rs +++ b/lib/crates/fabro-workflow/src/operations/validate.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use fabro_config::FabroSettings; +use fabro_types::Settings; use crate::error::FabroError; use crate::pipeline::Validated; @@ -11,7 +11,7 @@ use super::source::{ResolveWorkflowInput, WorkflowInput, resolve_workflow}; pub struct ValidateInput { pub workflow: WorkflowInput, - pub settings: FabroSettings, + pub settings: Settings, pub cwd: PathBuf, pub custom_transforms: Vec>, } diff --git a/lib/crates/fabro-workflow/src/pipeline/execute/tests.rs b/lib/crates/fabro-workflow/src/pipeline/execute/tests.rs index 3317ac213..74cbc4b6f 100644 --- a/lib/crates/fabro-workflow/src/pipeline/execute/tests.rs +++ b/lib/crates/fabro-workflow/src/pipeline/execute/tests.rs @@ -9,13 +9,12 @@ use std::time::Duration; use async_trait::async_trait; use chrono::Utc; use fabro_agent::Sandbox; -use fabro_config::FabroSettings; use fabro_graphviz::graph::{AttrValue, Edge, Graph, Node}; use fabro_hooks::HookSettings; use fabro_interview::AutoApproveInterviewer; use fabro_sandbox::SandboxSpec; use fabro_store::InMemoryStore; -use fabro_types::{RunId, fixtures}; +use fabro_types::{RunId, Settings, fixtures}; use super::*; use crate::context::{self, Context}; @@ -90,7 +89,7 @@ fn test_run_options(run_dir: &Path, run_id: &str) -> RunOptions { run_dir: run_dir.to_path_buf(), cancel_token: None, run_id: test_run_id(run_id), - settings: FabroSettings::default(), + settings: Settings::default(), git: None, host_repo_path: None, labels: HashMap::new(), @@ -133,7 +132,7 @@ fn persisted_workflow(graph: Graph, source: String, run_dir: &Path, run_id: RunI RunRecord { run_id, created_at: Utc::now(), - settings: FabroSettings::default(), + settings: Settings::default(), graph, workflow_slug: Some("test".to_string()), working_directory: std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")), diff --git a/lib/crates/fabro-workflow/src/pipeline/finalize.rs b/lib/crates/fabro-workflow/src/pipeline/finalize.rs index 3f0b29be1..b39282918 100644 --- a/lib/crates/fabro-workflow/src/pipeline/finalize.rs +++ b/lib/crates/fabro-workflow/src/pipeline/finalize.rs @@ -349,10 +349,9 @@ mod tests { use std::sync::Arc; use chrono::Utc; - use fabro_config::FabroSettings; use fabro_graphviz::graph::Graph; use fabro_store::{InMemoryStore, Store}; - use fabro_types::{RunId, fixtures}; + use fabro_types::{RunId, Settings, fixtures}; use super::*; use crate::pipeline::types::Retroed; @@ -364,7 +363,7 @@ mod tests { fn test_run_options(run_dir: &std::path::Path) -> RunOptions { RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: run_dir.to_path_buf(), cancel_token: None, run_id: test_run_id(), diff --git a/lib/crates/fabro-workflow/src/pipeline/initialize.rs b/lib/crates/fabro-workflow/src/pipeline/initialize.rs index f6a5f7b7a..8ba4955d4 100644 --- a/lib/crates/fabro-workflow/src/pipeline/initialize.rs +++ b/lib/crates/fabro-workflow/src/pipeline/initialize.rs @@ -672,12 +672,11 @@ mod tests { use std::sync::Arc; use chrono::Utc; - use fabro_config::FabroSettings; use fabro_graphviz::graph::{AttrValue, Edge, Graph, Node}; use fabro_interview::AutoApproveInterviewer; use fabro_sandbox::SandboxSpec; use fabro_store::InMemoryStore; - use fabro_types::{RunId, fixtures}; + use fabro_types::{RunId, Settings, fixtures}; use super::*; use crate::pipeline::types::InitOptions; @@ -714,7 +713,7 @@ mod tests { fn test_settings(run_dir: &std::path::Path) -> RunOptions { RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: run_dir.to_path_buf(), cancel_token: None, run_id: test_run_id(), @@ -737,7 +736,7 @@ mod tests { RunRecord { run_id: test_run_id(), created_at: Utc::now(), - settings: FabroSettings::default(), + settings: Settings::default(), graph, workflow_slug: Some("test".to_string()), working_directory: std::env::current_dir().unwrap(), diff --git a/lib/crates/fabro-workflow/src/pipeline/persist.rs b/lib/crates/fabro-workflow/src/pipeline/persist.rs index eb9772850..4e86955f6 100644 --- a/lib/crates/fabro-workflow/src/pipeline/persist.rs +++ b/lib/crates/fabro-workflow/src/pipeline/persist.rs @@ -56,10 +56,9 @@ mod tests { use std::path::PathBuf; use chrono::Utc; - use fabro_config::FabroSettings; use fabro_graphviz::graph::{AttrValue, Edge, Graph, Node}; use fabro_store::{InMemoryStore, Store}; - use fabro_types::fixtures; + use fabro_types::{Settings, fixtures}; use super::*; use crate::records::RunRecord; @@ -112,7 +111,7 @@ mod tests { RunRecord { run_id: fixtures::RUN_1, created_at: Utc::now(), - settings: FabroSettings { + settings: Settings { dry_run: Some(true), verbose: Some(true), ..Default::default() diff --git a/lib/crates/fabro-workflow/src/pipeline/pull_request.rs b/lib/crates/fabro-workflow/src/pipeline/pull_request.rs index ae792c084..935744652 100644 --- a/lib/crates/fabro-workflow/src/pipeline/pull_request.rs +++ b/lib/crates/fabro-workflow/src/pipeline/pull_request.rs @@ -628,7 +628,6 @@ mod tests { use super::*; use crate::records::StageSummary; use chrono::Utc; - use fabro_config::FabroSettings; use fabro_graphviz::graph::Graph; use fabro_llm::client::Client; use fabro_llm::error::SdkError; @@ -639,8 +638,7 @@ mod tests { AggregateStats, FrictionKind, FrictionPoint, OpenItem, OpenItemKind, StageRetro, }; use fabro_store::{InMemoryStore, Store}; - use fabro_types::RunRecord; - use fabro_types::fixtures; + use fabro_types::{RunRecord, Settings, fixtures}; use futures::stream; struct MockProvider { @@ -1102,7 +1100,7 @@ mod tests { .put_run(&RunRecord { run_id: fixtures::RUN_1, created_at, - settings: FabroSettings::default(), + settings: Settings::default(), graph: Graph::new("test"), workflow_slug: Some("test".to_string()), working_directory: PathBuf::from("/tmp/project"), diff --git a/lib/crates/fabro-workflow/src/pipeline/retro.rs b/lib/crates/fabro-workflow/src/pipeline/retro.rs index 21410ba31..4d27b7b13 100644 --- a/lib/crates/fabro-workflow/src/pipeline/retro.rs +++ b/lib/crates/fabro-workflow/src/pipeline/retro.rs @@ -169,10 +169,9 @@ mod tests { use std::sync::{Arc, Mutex}; use chrono::Utc; - use fabro_config::FabroSettings; use fabro_graphviz::graph::Graph; use fabro_store::{InMemoryStore, Store}; - use fabro_types::{RunId, fixtures}; + use fabro_types::{RunId, Settings, fixtures}; use super::*; use crate::context::Context; @@ -223,7 +222,7 @@ mod tests { fn test_run_options(run_dir: &std::path::Path) -> RunOptions { RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: run_dir.to_path_buf(), cancel_token: None, run_id: test_run_id(), diff --git a/lib/crates/fabro-workflow/src/run_lookup.rs b/lib/crates/fabro-workflow/src/run_lookup.rs index 8aae2f8b1..50af6a59b 100644 --- a/lib/crates/fabro-workflow/src/run_lookup.rs +++ b/lib/crates/fabro-workflow/src/run_lookup.rs @@ -440,10 +440,9 @@ mod tests { use std::path::PathBuf; use chrono::Utc; - use fabro_config::FabroSettings; use fabro_graphviz::graph::Graph; use fabro_store::{InMemoryStore, Store}; - use fabro_types::{RunStatus, RunStatusRecord, fixtures}; + use fabro_types::{RunStatus, RunStatusRecord, Settings, fixtures}; use super::scan_runs_combined; use crate::records::{RunRecord, RunRecordExt}; @@ -452,7 +451,7 @@ mod tests { RunRecord { run_id: fixtures::RUN_1, created_at: Utc::now(), - settings: FabroSettings::default(), + settings: Settings::default(), graph: Graph::new("test"), workflow_slug: Some("test".to_string()), working_directory: PathBuf::from("/tmp/project"), diff --git a/lib/crates/fabro-workflow/src/run_options.rs b/lib/crates/fabro-workflow/src/run_options.rs index a39133aef..61ea9fb44 100644 --- a/lib/crates/fabro-workflow/src/run_options.rs +++ b/lib/crates/fabro-workflow/src/run_options.rs @@ -3,9 +3,8 @@ use std::path::PathBuf; use std::sync::Arc; use std::sync::atomic::AtomicBool; -use fabro_config::FabroSettings; use fabro_config::run::PullRequestSettings; -use fabro_types::RunId; +use fabro_types::{RunId, Settings}; use crate::git::{GitAuthor, git_author_from_settings}; @@ -20,7 +19,7 @@ pub struct GitCheckpointOptions { /// Options for a workflow run. #[derive(Clone)] pub struct RunOptions { - pub settings: FabroSettings, + pub settings: Settings, pub run_dir: PathBuf, pub cancel_token: Option>, /// Unique identifier for this workflow run. diff --git a/lib/crates/fabro-workflow/tests/it/daytona_integration.rs b/lib/crates/fabro-workflow/tests/it/daytona_integration.rs index a42f796d0..493611107 100644 --- a/lib/crates/fabro-workflow/tests/it/daytona_integration.rs +++ b/lib/crates/fabro-workflow/tests/it/daytona_integration.rs @@ -18,13 +18,12 @@ use std::path::Path; use std::sync::Arc; use fabro_agent::Sandbox; -use fabro_config::FabroSettings; use fabro_graphviz::graph::{AttrValue, Edge, Graph, Node}; use fabro_llm::provider::Provider; use fabro_sandbox::SandboxRecordExt; use fabro_sandbox::daytona::{DaytonaConfig, DaytonaSandbox, DaytonaSnapshotConfig}; use fabro_store::RuntimeState; -use fabro_types::RunId; +use fabro_types::{RunId, Settings}; use fabro_workflow::artifact::sync_artifacts_to_env; use fabro_workflow::context::Context; use fabro_workflow::error::FabroError; @@ -392,7 +391,7 @@ async fn daytona_pipeline_artifact_offload_and_sync() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), env.clone()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -581,7 +580,7 @@ async fn daytona_git_checkpoint_remote_emits_events() { let engine = WorkflowRunner::new(registry, Arc::new(emitter), env.clone()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("git-cp-test"), @@ -762,7 +761,7 @@ async fn daytona_parallel_git_branching_e2e() { let engine = WorkflowRunner::new(registry, Arc::new(emitter), Arc::clone(&env)); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: run_tmp.path().to_path_buf(), cancel_token: None, run_id, @@ -1122,7 +1121,7 @@ async fn daytona_git_checkpoint_with_shadow_branch() { let meta_branch = MetadataStore::branch_name(&run_id.to_string()); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), env.clone()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id, @@ -1260,11 +1259,11 @@ async fn daytona_asset_collection() { graph.edges.push(Edge::new("create_assets", "exit")); let run_options = RunOptions { - settings: FabroSettings { + settings: Settings { assets: Some(fabro_config::run::AssetsSettings { include: vec!["test-results/**".to_string()], }), - ..FabroSettings::default() + ..Settings::default() }, run_dir: dir.path().to_path_buf(), cancel_token: None, @@ -1515,7 +1514,7 @@ async fn daytona_git_push_run_branch_to_origin() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), env.clone()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id, diff --git a/lib/crates/fabro-workflow/tests/it/integration.rs b/lib/crates/fabro-workflow/tests/it/integration.rs index b2bfbddc7..33293c152 100644 --- a/lib/crates/fabro-workflow/tests/it/integration.rs +++ b/lib/crates/fabro-workflow/tests/it/integration.rs @@ -17,7 +17,6 @@ use std::path::Path; use std::sync::Arc; use std::time::Duration; -use fabro_config::FabroSettings; use fabro_graphviz::graph::{AttrValue, Edge, Graph, Node}; use fabro_graphviz::parser::parse; use fabro_interview::{ @@ -26,7 +25,7 @@ use fabro_interview::{ }; use fabro_llm::provider::Provider; use fabro_store::RuntimeState; -use fabro_types::RunId; +use fabro_types::{RunId, Settings}; use fabro_validate::{Severity, validate, validate_or_raise}; use fabro_workflow::context::Context; use fabro_workflow::error::{FabroError, FailureSignatureExt}; @@ -215,7 +214,7 @@ async fn end_to_end_linear_pipeline() { local_env(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -355,7 +354,7 @@ async fn end_to_end_branching_pipeline() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -474,7 +473,7 @@ async fn end_to_end_human_gate_pipeline() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -569,7 +568,7 @@ async fn human_gate_aborted_input_fails_closed_without_fail_route() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -679,7 +678,7 @@ async fn human_gate_aborted_input_routes_via_outcome_fail_condition() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -791,7 +790,7 @@ async fn goal_gate_routes_to_retry_target_on_failure() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -911,7 +910,7 @@ async fn goal_gate_routes_to_retry_target_when_present() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -1222,7 +1221,7 @@ async fn retry_on_failure_then_succeed() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -1296,7 +1295,7 @@ async fn pipeline_with_many_nodes() { local_env(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -1617,7 +1616,7 @@ async fn smoke_test_with_mock_codergen_backend() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -1717,7 +1716,7 @@ async fn end_to_end_parallel_fan_out_fan_in() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -1829,7 +1828,7 @@ async fn resume_from_checkpoint_completes_pipeline() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -1927,7 +1926,7 @@ async fn resume_from_checkpoint_preserves_goal_gate_outcomes() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -1969,7 +1968,7 @@ async fn graph_goal_in_context() { local_env(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2004,7 +2003,7 @@ async fn event_streaming_lifecycle() { let events = collect_events(&emitter); let engine = WorkflowRunner::new(make_linear_registry(), Arc::new(emitter), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2079,7 +2078,7 @@ async fn context_flow_between_stages() { local_env(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2131,7 +2130,7 @@ async fn tool_handler_e2e() { local_env(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2202,7 +2201,7 @@ async fn auto_approve_interviewer_e2e() { local_env(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2238,7 +2237,7 @@ async fn codergen_without_backend_simulated() { local_env(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2339,7 +2338,7 @@ async fn branching_loop_back_on_failure() { ); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2421,7 +2420,7 @@ async fn human_gate_loops_back() { registry.register("human", Box::new(HumanHandler::new(interviewer))); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2478,7 +2477,7 @@ async fn scenario_ship_a_feature() { local_env(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2559,7 +2558,7 @@ async fn scenario_parallel_expert_review() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2642,7 +2641,7 @@ async fn scenario_node_retries_on_retry_status() { ); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2703,7 +2702,7 @@ async fn scenario_loop_restart_resets_context() { ); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2770,7 +2769,7 @@ async fn scenario_bug_triage_router() { registry.register("conditional", Box::new(ConditionalHandler)); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2828,7 +2827,7 @@ async fn scenario_crash_recovery() { registry.register("exit", Box::new(ExitHandler)); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -2936,7 +2935,7 @@ async fn manager_loop_stop_condition_satisfied_e2e() { registry.register("stack.manager_loop", Box::new(SubWorkflowHandler)); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3014,7 +3013,7 @@ async fn manager_loop_max_cycles_exceeded_e2e() { registry.register("stack.manager_loop", Box::new(SubWorkflowHandler)); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3151,7 +3150,7 @@ async fn conditional_branching_success_fail_paths() { registry.register("always_fail", Box::new(AlwaysFailHandler)); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3203,7 +3202,7 @@ async fn edge_selection_condition_match_wins_over_weight() { registry.register("exit", Box::new(ExitHandler)); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3249,7 +3248,7 @@ async fn edge_selection_weight_breaks_ties() { registry.register("exit", Box::new(ExitHandler)); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3287,7 +3286,7 @@ async fn edge_selection_lexical_tiebreak() { registry.register("exit", Box::new(ExitHandler)); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3344,7 +3343,7 @@ async fn context_updates_visible_across_nodes() { registry.register("context_setter", Box::new(ContextSetterHandler)); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3387,7 +3386,7 @@ async fn stylesheet_applies_model_override() { local_env(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3442,7 +3441,7 @@ async fn custom_handler_registration_and_execution() { registry.register("my_custom", Box::new(CustomHandler)); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3512,7 +3511,7 @@ async fn integration_smoke_plan_implement_review_done() { local_env(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3613,7 +3612,7 @@ async fn manager_loop_runs_child_engine_e2e() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3746,7 +3745,7 @@ async fn manager_loop_context_flows_e2e() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3818,7 +3817,7 @@ async fn manager_loop_child_dotfile_e2e() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -3919,7 +3918,7 @@ async fn import_e2e_through_engine() { local_env(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4072,7 +4071,7 @@ async fn fidelity_default_is_compact() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4128,7 +4127,7 @@ async fn fidelity_graph_default_applied() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4180,7 +4179,7 @@ async fn fidelity_node_overrides_graph_default() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4238,7 +4237,7 @@ async fn fidelity_edge_overrides_node_and_graph() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4286,7 +4285,7 @@ async fn fidelity_full_produces_empty_preamble() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4344,7 +4343,7 @@ async fn fidelity_truncate_preamble_minimal() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4415,7 +4414,7 @@ async fn fidelity_summary_low_mode() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4481,7 +4480,7 @@ async fn fidelity_summary_medium_mode() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4547,7 +4546,7 @@ async fn fidelity_summary_high_mode() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4606,7 +4605,7 @@ async fn fidelity_full_sets_thread_id_in_context() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4676,7 +4675,7 @@ async fn fidelity_full_nodes_share_thread_id() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4756,7 +4755,7 @@ async fn fidelity_resume_degrades_full_to_summary_high() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4852,7 +4851,7 @@ async fn fidelity_resume_degrade_only_affects_first_hop() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4935,7 +4934,7 @@ async fn fidelity_resume_no_degrade_when_not_full() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -4976,7 +4975,7 @@ async fn fidelity_stored_in_checkpoint_context() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5061,7 +5060,7 @@ async fn fidelity_precedence_multi_node_pipeline() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5128,7 +5127,7 @@ async fn fidelity_compact_preamble_includes_completed_stages_and_context() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5203,7 +5202,7 @@ async fn fidelity_summary_low_excludes_context_values_in_pipeline() { let engine_low = WorkflowRunner::new(registry_low, Arc::new(EventEmitter::default()), local_env()); let run_options_low = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir_low.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5270,7 +5269,7 @@ async fn fidelity_summary_low_excludes_context_values_in_pipeline() { let engine_med = WorkflowRunner::new(registry_med, Arc::new(EventEmitter::default()), local_env()); let run_options_med = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir_med.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5340,7 +5339,7 @@ async fn fidelity_thread_id_fallback_to_previous_node_in_pipeline() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5393,7 +5392,7 @@ async fn fidelity_thread_id_from_node_class_in_pipeline() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5449,7 +5448,7 @@ async fn fidelity_edge_thread_id_override_in_pipeline() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5506,7 +5505,7 @@ async fn fidelity_full_without_explicit_thread_id_uses_previous_node() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5573,7 +5572,7 @@ async fn fidelity_from_parsed_dot_pipeline() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5620,7 +5619,7 @@ async fn fidelity_checkpoint_roundtrip_preserves_fidelity() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5689,7 +5688,7 @@ async fn fidelity_node_thread_id_overrides_edge_thread_id_in_pipeline() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5775,7 +5774,7 @@ async fn fidelity_resume_preserves_context_values_across_checkpoint() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -5817,8 +5816,8 @@ mod real_llm { use async_trait::async_trait; - use fabro_config::FabroSettings; use fabro_graphviz::graph::Node; + use fabro_types::Settings; use fabro_workflow::context::Context; use fabro_workflow::error::FabroError; use fabro_workflow::handler::agent::{AgentHandler, CodergenBackend, CodergenResult}; @@ -6015,7 +6014,7 @@ mod real_llm { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -6122,7 +6121,7 @@ mod real_llm { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -6254,7 +6253,7 @@ mod real_llm { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -6354,7 +6353,7 @@ mod real_llm { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -6449,7 +6448,7 @@ async fn human_gate_freeform_only_routes_text() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -6578,7 +6577,7 @@ async fn human_gate_freeform_with_fixed_choice_match() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -6692,7 +6691,7 @@ async fn human_gate_freeform_fallback_on_unmatched_text() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -6819,7 +6818,7 @@ async fn human_gate_freeform_sets_allow_freeform_on_question() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -6926,7 +6925,7 @@ async fn human_gate_without_freeform_sets_allow_freeform_false() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -7210,7 +7209,7 @@ fn engine_with_hooks_and_events( fn make_run_options(dir: &std::path::Path) -> RunOptions { RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.to_path_buf(), cancel_token: None, run_id: test_run_id("hook-test-run"), @@ -7894,7 +7893,7 @@ event = "run_complete" command = "echo done" "#; - let cfg: FabroSettings = toml::from_str(toml).unwrap(); + let cfg: Settings = toml::from_str(toml).unwrap(); assert_eq!(cfg.hooks.len(), 2); assert_eq!(cfg.hooks[0].event, fabro_hooks::HookEvent::StageStart); assert_eq!(cfg.hooks[0].matcher.as_deref(), Some("agent_loop")); @@ -8076,7 +8075,7 @@ max_tool_rounds = 10 timeout_ms = 120000 "#; - let cfg: FabroSettings = toml::from_str(toml).unwrap(); + let cfg: Settings = toml::from_str(toml).unwrap(); assert_eq!(cfg.hooks.len(), 2); // Prompt hook @@ -8215,7 +8214,7 @@ async fn run_fidelity_prompt_pipeline(fidelity: &str) -> String { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -8413,7 +8412,7 @@ async fn large_context_values_are_offloaded_to_artifact_store() { let events = collect_events(&emitter); let engine = WorkflowRunner::new(registry, Arc::new(emitter), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -8631,7 +8630,7 @@ async fn artifact_pointers_rewritten_for_remote_sandbox() { remote_env.clone(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -8760,7 +8759,7 @@ async fn node_dir_uses_visit_count_on_revisit() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -9733,7 +9732,7 @@ async fn full_pipeline_with_cli_backend_node() { let dir = tempfile::tempdir().unwrap(); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), env); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -9863,7 +9862,7 @@ async fn stylesheet_backend_property_routes_to_cli() { let dir = tempfile::tempdir().unwrap(); let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), env); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"), @@ -10051,7 +10050,7 @@ async fn git_checkpoint_host_emits_events_and_diff_patch() { let engine = WorkflowRunner::new(registry, Arc::new(emitter), env); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: run_dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-docker"), @@ -10237,7 +10236,7 @@ async fn git_checkpoint_host_writes_shadow_branch() { let meta_branch = MetadataStore::branch_name(&run_id.to_string()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: run_dir.path().to_path_buf(), cancel_token: None, run_id, @@ -10434,7 +10433,7 @@ async fn parallel_git_branching_host_e2e() { let engine = WorkflowRunner::new(registry, Arc::new(emitter), env); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: run_dir.path().to_path_buf(), cancel_token: None, run_id, @@ -10697,7 +10696,7 @@ async fn git_checkpoint_host_skips_empty_diff_patch() { let engine = WorkflowRunner::new(registry, Arc::new(emitter), env); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: run_dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("empty-diff"), @@ -11078,7 +11077,7 @@ async fn e2e_circuit_breaker_deterministic_self_loop() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-circuit-breaker"), @@ -11124,7 +11123,7 @@ async fn e2e_circuit_breaker_custom_limit() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-custom-limit"), @@ -11163,7 +11162,7 @@ async fn e2e_circuit_breaker_ignores_transient_failures() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-transient-no-breaker"), @@ -11209,7 +11208,7 @@ async fn e2e_circuit_breaker_different_reasons_separate_counters() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-varying-reasons"), @@ -11248,7 +11247,7 @@ async fn e2e_circuit_breaker_loop_restart() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-restart-breaker"), @@ -11309,7 +11308,7 @@ async fn e2e_failure_signature_persisted_in_context() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-sig-context"), @@ -11372,7 +11371,7 @@ async fn e2e_failure_signature_hint_overrides_reason_in_context() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-sig-hint"), @@ -11427,7 +11426,7 @@ async fn e2e_signature_maps_persist_in_checkpoint() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-sig-persist"), @@ -11553,7 +11552,7 @@ async fn e2e_circuit_breaker_emits_events_before_abort() { let engine = WorkflowRunner::new(registry, Arc::new(emitter), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-events"), @@ -11617,7 +11616,7 @@ async fn e2e_circuit_breaker_does_not_fire_below_limit() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-below-limit"), @@ -11712,7 +11711,7 @@ async fn e2e_circuit_breaker_multi_stage_impl_verify_cycle() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-impl-verify-cycle"), @@ -11808,7 +11807,7 @@ async fn e2e_loop_restart_blocked_for_deterministic_failure() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-restart-blocked-det"), @@ -11847,7 +11846,7 @@ async fn e2e_loop_restart_blocked_for_structural_failure() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-restart-blocked-struct"), @@ -11886,7 +11885,7 @@ async fn e2e_loop_restart_blocked_for_budget_exhausted_failure() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-restart-blocked-budget"), @@ -11925,7 +11924,7 @@ async fn e2e_loop_restart_blocked_for_canceled_failure() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-restart-blocked-canceled"), @@ -11961,7 +11960,7 @@ async fn e2e_loop_restart_blocked_for_compilation_loop_failure() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-restart-blocked-comploop"), @@ -12001,7 +12000,7 @@ async fn e2e_loop_restart_allowed_for_transient_infra() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("e2e-restart-allowed-transient"), @@ -12107,7 +12106,7 @@ async fn e2e_stall_watchdog_triggers_from_dot_parsed_pipeline() { let engine = WorkflowRunner::new(registry, Arc::new(emitter), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("stall-e2e"), @@ -12162,7 +12161,7 @@ async fn e2e_stall_watchdog_kept_alive_by_handler_events() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("stall-alive-e2e"), @@ -12207,7 +12206,7 @@ async fn e2e_stall_watchdog_disabled_with_zero_timeout() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("stall-disabled-e2e"), @@ -12271,7 +12270,7 @@ async fn e2e_stall_watchdog_with_explicit_timeout_override() { let engine = WorkflowRunner::new(registry, Arc::new(EventEmitter::default()), local_env()); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("stall-override-e2e"), @@ -12401,11 +12400,11 @@ async fn asset_collection_local_sandbox_success() { graph.edges.push(Edge::new("create_assets", "exit")); let run_options = RunOptions { - settings: FabroSettings { + settings: Settings { assets: Some(fabro_config::run::AssetsSettings { include: vec!["test-results/**".to_string()], }), - ..FabroSettings::default() + ..Settings::default() }, run_dir: run_dir.path().to_path_buf(), cancel_token: None, @@ -12528,11 +12527,11 @@ async fn asset_collection_local_sandbox_on_failure() { graph.edges.push(Edge::new("create_assets", "exit")); let run_options = RunOptions { - settings: FabroSettings { + settings: Settings { assets: Some(fabro_config::run::AssetsSettings { include: vec!["test-results/**".to_string()], }), - ..FabroSettings::default() + ..Settings::default() }, run_dir: run_dir.path().to_path_buf(), cancel_token: None, @@ -12619,11 +12618,11 @@ async fn asset_collection_docker_sandbox() { graph.edges.push(Edge::new("create_assets", "exit")); let run_options = RunOptions { - settings: FabroSettings { + settings: Settings { assets: Some(fabro_config::run::AssetsSettings { include: vec!["test-results/**".to_string()], }), - ..FabroSettings::default() + ..Settings::default() }, run_dir: run_dir.path().to_path_buf(), cancel_token: None, @@ -12687,7 +12686,7 @@ async fn wait_timer_e2e() { local_env(), ); let run_options = RunOptions { - settings: FabroSettings::default(), + settings: Settings::default(), run_dir: dir.path().to_path_buf(), cancel_token: None, run_id: test_run_id("test-run"),