diff --git a/apps/fabro-web/app/routes.ts b/apps/fabro-web/app/routes.ts
index 8759b626f..780553f0b 100644
--- a/apps/fabro-web/app/routes.ts
+++ b/apps/fabro-web/app/routes.ts
@@ -25,7 +25,7 @@ export default [
route("runs/:id", "routes/run-detail.tsx", [
index("routes/run-overview.tsx"),
route("stages/:stageId", "routes/run-stages.tsx"),
- route("configuration", "routes/run-configuration.tsx"),
+ route("settings", "routes/run-settings.tsx"),
route("graph", "routes/run-graph.tsx"),
route("files", "routes/run-files.tsx"),
route("verification", "routes/run-verification.tsx"),
diff --git a/apps/fabro-web/app/routes/run-graph.tsx b/apps/fabro-web/app/routes/run-graph.tsx
index ceab91895..9ad786fc4 100644
--- a/apps/fabro-web/app/routes/run-graph.tsx
+++ b/apps/fabro-web/app/routes/run-graph.tsx
@@ -305,11 +305,11 @@ export default function RunGraph({ loaderData }: Route.ComponentProps) {
-
- Run Configuration
+ Run Settings
-
diff --git a/apps/fabro-web/app/routes/run-overview.tsx b/apps/fabro-web/app/routes/run-overview.tsx
index ef73f182d..fd1eee6a7 100644
--- a/apps/fabro-web/app/routes/run-overview.tsx
+++ b/apps/fabro-web/app/routes/run-overview.tsx
@@ -320,11 +320,11 @@ export default function RunOverview({ loaderData }: Route.ComponentProps) {
-
- Run Configuration
+ Run Settings
-
diff --git a/apps/fabro-web/app/routes/run-configuration.tsx b/apps/fabro-web/app/routes/run-settings.tsx
similarity index 84%
rename from apps/fabro-web/app/routes/run-configuration.tsx
rename to apps/fabro-web/app/routes/run-settings.tsx
index 0b2dbad81..2a5cfba7e 100644
--- a/apps/fabro-web/app/routes/run-configuration.tsx
+++ b/apps/fabro-web/app/routes/run-settings.tsx
@@ -4,8 +4,8 @@ import { DocumentTextIcon, MapIcon } from "@heroicons/react/24/outline";
import { CollapsibleFile } from "../components/collapsible-file";
import { apiJson } from "../api-client";
import { formatDurationSecs } from "../lib/format";
-import type { PaginatedRunStageList, RunConfiguration } from "@qltysh/fabro-api-client";
-import type { Route } from "./+types/run-configuration";
+import type { PaginatedRunStageList, RunSettings } from "@qltysh/fabro-api-client";
+import type { Route } from "./+types/run-settings";
export const handle = { wide: true };
@@ -27,9 +27,9 @@ const statusConfig: Record(`/runs/${params.id}/stages`, { request }),
- apiJson(`/runs/${params.id}/configuration`, { request }),
+ apiJson(`/runs/${params.id}/settings`, { request }),
]);
const stages: Stage[] = apiStages.map((s) => ({
id: s.id,
@@ -37,12 +37,12 @@ export async function loader({ request, params }: Route.LoaderArgs) {
status: s.status as StageStatus,
duration: s.duration_secs != null ? formatDurationSecs(s.duration_secs) : "--",
}));
- return { stages, config };
+ return { stages, settings };
}
-export default function RunConfiguration({ loaderData }: Route.ComponentProps) {
+export default function RunSettingsPage({ loaderData }: Route.ComponentProps) {
const { id } = useParams();
- const { stages, config } = loaderData;
+ const { stages, settings } = loaderData;
return (
@@ -74,11 +74,11 @@ export default function RunConfiguration({ loaderData }: Route.ComponentProps) {
-
- Run Configuration
+ Run Settings
-
@@ -96,7 +96,7 @@ export default function RunConfiguration({ loaderData }: Route.ComponentProps) {
diff --git a/apps/fabro-web/app/routes/run-stages.tsx b/apps/fabro-web/app/routes/run-stages.tsx
index 4964df5f5..5df7394f0 100644
--- a/apps/fabro-web/app/routes/run-stages.tsx
+++ b/apps/fabro-web/app/routes/run-stages.tsx
@@ -144,11 +144,11 @@ export default function RunStages({ loaderData }: Route.ComponentProps) {
-
- Run Configuration
+ Run Settings
-
diff --git a/apps/fabro-web/app/routes/settings.tsx b/apps/fabro-web/app/routes/settings.tsx
index 1a622bd5e..4103f2baa 100644
--- a/apps/fabro-web/app/routes/settings.tsx
+++ b/apps/fabro-web/app/routes/settings.tsx
@@ -1,6 +1,6 @@
import { apiJson } from "../api-client";
import { CollapsibleFile } from "../components/collapsible-file";
-import type { ServerConfiguration } from "@qltysh/fabro-api-client";
+import type { ServerSettings } from "@qltysh/fabro-api-client";
import type { Route } from "./+types/settings";
export function meta({}: Route.MetaArgs) {
@@ -10,17 +10,17 @@ export function meta({}: Route.MetaArgs) {
export const handle = { hideHeader: true };
export async function loader({ request }: Route.LoaderArgs) {
- const config = await apiJson("/settings", { request });
- return { config };
+ const settings = await apiJson("/settings", { request });
+ return { settings };
}
export default function Settings({ loaderData }: Route.ComponentProps) {
- const { config } = loaderData;
+ const { settings } = loaderData;
return (
);
diff --git a/apps/fabro-web/app/routes/workflow-definition.tsx b/apps/fabro-web/app/routes/workflow-definition.tsx
index 8499dfb92..353951ad4 100644
--- a/apps/fabro-web/app/routes/workflow-definition.tsx
+++ b/apps/fabro-web/app/routes/workflow-definition.tsx
@@ -21,13 +21,13 @@ export default function WorkflowDefinition() {
}, []);
if (workflow == null) {
- return No configuration found.
;
+ return No settings found.
;
}
return (
{dotReady && (
diff --git a/apps/fabro-web/app/routes/workflow-detail.tsx b/apps/fabro-web/app/routes/workflow-detail.tsx
index 569c8da2c..12e5b81d1 100644
--- a/apps/fabro-web/app/routes/workflow-detail.tsx
+++ b/apps/fabro-web/app/routes/workflow-detail.tsx
@@ -1,7 +1,7 @@
import { ChevronRightIcon } from "@heroicons/react/20/solid";
import { Link, Outlet, useLocation, useParams } from "react-router";
import { apiJson } from "../api-client";
-import type { WorkflowDetail as ApiWorkflowDetail, RunConfiguration } from "@qltysh/fabro-api-client";
+import type { WorkflowDetail as ApiWorkflowDetail, RunSettings } from "@qltysh/fabro-api-client";
import type { Route } from "./+types/workflow-detail";
export interface WorkflowEntry {
@@ -9,7 +9,7 @@ export interface WorkflowEntry {
slug: string;
description: string;
filename: string;
- config: RunConfiguration;
+ settings: RunSettings;
graph: string;
}
@@ -21,7 +21,7 @@ export const workflowData: Record
= {
slug: "fix_build",
filename: "fix_build.fabro",
description: "Automatically diagnoses and fixes CI build failures by analyzing error logs, identifying root causes, and applying targeted code changes.",
- config: {
+ settings: {
version: 1,
goal: "Diagnose and fix CI build failures",
graph: "fix_build.fabro",
@@ -62,7 +62,7 @@ export const workflowData: Record = {
slug: "implement",
filename: "implement.fabro",
description: "Generates production-ready code from a technical blueprint, including tests, documentation, and a pull request ready for review.",
- config: {
+ settings: {
version: 1,
goal: "Implement feature from technical blueprint",
graph: "implement.fabro",
@@ -118,7 +118,7 @@ export const workflowData: Record = {
slug: "sync_drift",
filename: "sync_drift.fabro",
description: "Detects configuration and code drift between environments, then generates reconciliation patches to bring everything back in sync.",
- config: {
+ settings: {
version: 1,
goal: "Detect and reconcile configuration drift across environments",
graph: "sync_drift.fabro",
@@ -163,7 +163,7 @@ export const workflowData: Record = {
slug: "expand",
filename: "expand.fabro",
description: "Evolves the product by analyzing usage patterns and specifications to propose and implement incremental improvements.",
- config: {
+ settings: {
version: 1,
goal: "Propose and implement incremental product improvements",
graph: "expand.fabro",
@@ -216,7 +216,7 @@ export async function loader({ request, params }: Route.LoaderArgs) {
slug: apiWorkflow.slug,
description: apiWorkflow.description,
filename: apiWorkflow.filename,
- config: apiWorkflow.config,
+ settings: apiWorkflow.settings,
graph: apiWorkflow.graph,
};
return { workflow };
diff --git a/docs/api-reference/fabro-api.yaml b/docs/api-reference/fabro-api.yaml
index 59d9b2dd7..00199ce10 100644
--- a/docs/api-reference/fabro-api.yaml
+++ b/docs/api-reference/fabro-api.yaml
@@ -563,21 +563,21 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
- /runs/{id}/configuration:
+ /runs/{id}/settings:
get:
- operationId: retrieveRunConfiguration
+ operationId: retrieveRunSettings
tags: [Run Internals]
- summary: Retrieve Run Configuration
- description: Returns the structured configuration used to launch this run.
+ summary: Retrieve Run Settings
+ description: Returns the structured settings used to launch this run.
parameters:
- $ref: "#/components/parameters/RunId"
responses:
"200":
- description: Run configuration
+ description: Run settings
content:
application/json:
schema:
- $ref: "#/components/schemas/RunConfiguration"
+ $ref: "#/components/schemas/RunSettings"
"404":
description: Run not found
content:
@@ -673,7 +673,7 @@ paths:
operationId: retrieveWorkflow
tags: [Workflows]
summary: Retrieve Workflow
- description: Returns the full detail of a workflow including its Graphviz graph, TOML config, and description.
+ description: Returns the full detail of a workflow including its Graphviz graph, resolved settings, and description.
parameters:
- $ref: "#/components/parameters/WorkflowName"
responses:
@@ -1257,17 +1257,17 @@ paths:
/settings:
get:
- operationId: retrieveServerConfiguration
+ operationId: retrieveServerSettings
tags: [Settings]
- summary: Retrieve Server Configuration
- description: Returns the structured server configuration.
+ summary: Retrieve Server Settings
+ description: Returns the structured server settings.
responses:
"200":
- description: Server configuration
+ description: Server settings
content:
application/json:
schema:
- $ref: "#/components/schemas/ServerConfiguration"
+ $ref: "#/components/schemas/ServerSettings"
components:
securitySchemes:
@@ -2925,14 +2925,14 @@ components:
$ref: "#/components/schemas/WorkflowSchedule"
WorkflowDetail:
- description: Full detail of a workflow definition including graph and configuration.
+ description: Full detail of a workflow definition including graph and resolved settings.
type: object
required:
- name
- slug
- filename
- description
- - config
+ - settings
- graph
properties:
name:
@@ -2951,8 +2951,8 @@ components:
type: string
description: Prose description of what the workflow does.
example: Automatically diagnoses and fixes CI build failures.
- config:
- $ref: "#/components/schemas/RunConfiguration"
+ settings:
+ $ref: "#/components/schemas/RunSettings"
graph:
type: string
description: Graphviz DOT language source defining the workflow graph.
@@ -3981,10 +3981,10 @@ components:
description: Number of rows returned.
example: 6
- # ── Configuration Schemas ────────────────────────────────────────────
+ # ── Settings Schemas ─────────────────────────────────────────────────
- RunConfiguration:
- description: Structured run configuration mirroring FabroConfig.
+ RunSettings:
+ description: Structured run settings mirroring FabroSettings.
type: object
required:
- version
@@ -3992,7 +3992,7 @@ components:
properties:
version:
type: integer
- description: Configuration schema version.
+ description: Settings schema version.
example: 1
goal:
type: string
@@ -4006,11 +4006,11 @@ components:
type: string
description: Working directory for the run.
llm:
- $ref: "#/components/schemas/LlmConfiguration"
+ $ref: "#/components/schemas/LlmSettings"
setup:
- $ref: "#/components/schemas/SetupConfiguration"
+ $ref: "#/components/schemas/SetupSettings"
sandbox:
- $ref: "#/components/schemas/SandboxConfiguration"
+ $ref: "#/components/schemas/SandboxSettings"
vars:
type: object
additionalProperties:
@@ -4021,7 +4021,7 @@ components:
items:
$ref: "#/components/schemas/HookDefinition"
- LlmConfiguration:
+ LlmSettings:
description: LLM provider and model settings.
type: object
properties:
@@ -4041,7 +4041,7 @@ components:
type: string
description: Provider fallback chains.
- SetupConfiguration:
+ SetupSettings:
description: Setup commands run before the workflow.
type: object
required:
@@ -4056,7 +4056,7 @@ components:
type: integer
description: Timeout per command in milliseconds.
- SandboxConfiguration:
+ SandboxSettings:
description: Sandbox execution environment settings.
type: object
properties:
@@ -4071,20 +4071,20 @@ components:
type: boolean
description: Whether to use a devcontainer for the sandbox.
daytona:
- $ref: "#/components/schemas/DaytonaConfiguration"
+ $ref: "#/components/schemas/DaytonaSettings"
exe:
- $ref: "#/components/schemas/ExeConfiguration"
+ $ref: "#/components/schemas/ExeSettings"
ssh:
- $ref: "#/components/schemas/SshConfiguration"
+ $ref: "#/components/schemas/SshSettings"
local:
- $ref: "#/components/schemas/LocalSandboxConfiguration"
+ $ref: "#/components/schemas/LocalSandboxSettings"
env:
type: object
additionalProperties:
type: string
description: Environment variables injected into the sandbox.
- LocalSandboxConfiguration:
+ LocalSandboxSettings:
description: Local sandbox settings.
type: object
properties:
@@ -4094,7 +4094,7 @@ components:
enum: [always, clean, dirty, never]
default: clean
- ExeConfiguration:
+ ExeSettings:
description: exe.dev sandbox configuration.
type: object
properties:
@@ -4102,7 +4102,7 @@ components:
type: string
description: VM image to use for the exe.dev sandbox.
- SshConfiguration:
+ SshSettings:
description: SSH sandbox configuration for user-provided hosts.
type: object
required:
@@ -4119,7 +4119,7 @@ components:
type: string
description: Optional path to a custom SSH config file.
- DaytonaConfiguration:
+ DaytonaSettings:
description: Daytona-specific sandbox settings.
type: object
properties:
@@ -4132,7 +4132,7 @@ components:
type: string
description: Labels applied to the sandbox.
snapshot:
- $ref: "#/components/schemas/DaytonaSnapshotConfiguration"
+ $ref: "#/components/schemas/DaytonaSnapshotSettings"
network:
description: "Network access mode: \"block\", \"allow_all\", or {\"allow_list\": [...]}."
oneOf:
@@ -4154,7 +4154,7 @@ components:
default: false
description: Skip git repo detection and cloning during initialization.
- DaytonaSnapshotConfiguration:
+ DaytonaSnapshotSettings:
description: Snapshot configuration for Daytona sandboxes.
type: object
required:
@@ -4255,8 +4255,8 @@ components:
type: boolean
description: Whether hook runs in sandbox.
- ServerConfiguration:
- description: Structured server configuration mirroring FabroConfig.
+ ServerSettings:
+ description: Structured server settings mirroring FabroSettings.
type: object
properties:
storage_dir:
@@ -4266,48 +4266,48 @@ components:
type: integer
description: Maximum concurrent runs.
web:
- $ref: "#/components/schemas/WebConfiguration"
+ $ref: "#/components/schemas/WebSettings"
api:
- $ref: "#/components/schemas/ApiConfiguration"
+ $ref: "#/components/schemas/ApiSettings"
git:
- $ref: "#/components/schemas/GitConfiguration"
+ $ref: "#/components/schemas/GitSettings"
features:
$ref: "#/components/schemas/Features"
log:
- $ref: "#/components/schemas/LogConfiguration"
+ $ref: "#/components/schemas/LogSettings"
work_dir:
type: string
description: Default working directory.
llm:
- $ref: "#/components/schemas/LlmConfiguration"
+ $ref: "#/components/schemas/LlmSettings"
setup:
- $ref: "#/components/schemas/SetupConfiguration"
+ $ref: "#/components/schemas/SetupSettings"
sandbox:
- $ref: "#/components/schemas/SandboxConfiguration"
+ $ref: "#/components/schemas/SandboxSettings"
vars:
type: object
additionalProperties:
type: string
description: Default variable map.
checkpoint:
- $ref: "#/components/schemas/CheckpointConfiguration"
+ $ref: "#/components/schemas/CheckpointSettings"
pull_request:
- $ref: "#/components/schemas/PullRequestConfiguration"
+ $ref: "#/components/schemas/PullRequestSettings"
hooks:
type: array
items:
$ref: "#/components/schemas/HookDefinition"
assets:
- $ref: "#/components/schemas/AssetsConfiguration"
+ $ref: "#/components/schemas/AssetsSettings"
mcp_servers:
type: object
additionalProperties:
$ref: "#/components/schemas/McpServerEntry"
description: Default MCP server configurations.
github:
- $ref: "#/components/schemas/GitHubConfiguration"
+ $ref: "#/components/schemas/GitHubSettings"
- GitHubConfiguration:
+ GitHubSettings:
description: GitHub App token injection configuration.
type: object
properties:
@@ -4349,7 +4349,7 @@ components:
type: integer
description: Tool call timeout in seconds.
- AssetsConfiguration:
+ AssetsSettings:
description: Asset collection configuration.
type: object
properties:
@@ -4359,7 +4359,7 @@ components:
type: string
description: Glob patterns for files to collect as run assets.
- LogConfiguration:
+ LogSettings:
description: Logging configuration.
type: object
properties:
@@ -4367,7 +4367,7 @@ components:
type: string
description: Log level (e.g. trace, debug, info).
- CheckpointConfiguration:
+ CheckpointSettings:
description: Checkpoint configuration for file exclusion.
type: object
properties:
@@ -4377,7 +4377,7 @@ components:
type: string
description: Glob patterns to exclude from checkpoints.
- PullRequestConfiguration:
+ PullRequestSettings:
description: Pull request creation configuration.
type: object
properties:
@@ -4395,7 +4395,7 @@ components:
enum: [squash, merge, rebase]
description: Merge strategy for auto-merge.
- WebConfiguration:
+ WebSettings:
description: Web UI configuration.
type: object
properties:
@@ -4403,9 +4403,9 @@ components:
type: string
description: Web UI URL.
auth:
- $ref: "#/components/schemas/AuthConfiguration"
+ $ref: "#/components/schemas/AuthSettings"
- AuthConfiguration:
+ AuthSettings:
description: Authentication configuration.
type: object
properties:
@@ -4421,7 +4421,7 @@ components:
type: string
description: Allowed usernames.
- ApiConfiguration:
+ ApiSettings:
description: API server configuration.
type: object
properties:
@@ -4437,9 +4437,9 @@ components:
- mtls
description: Authentication strategies.
tls:
- $ref: "#/components/schemas/TlsConfiguration"
+ $ref: "#/components/schemas/TlsSettings"
- TlsConfiguration:
+ TlsSettings:
description: TLS certificate configuration.
type: object
required:
@@ -4457,7 +4457,7 @@ components:
type: string
description: CA certificate file path.
- GitConfiguration:
+ GitSettings:
description: Git provider configuration.
type: object
properties:
@@ -4476,11 +4476,11 @@ components:
type: string
description: GitHub App slug.
author:
- $ref: "#/components/schemas/GitAuthorConfiguration"
+ $ref: "#/components/schemas/GitAuthorSettings"
webhooks:
- $ref: "#/components/schemas/WebhookConfiguration"
+ $ref: "#/components/schemas/WebhookSettings"
- GitAuthorConfiguration:
+ GitAuthorSettings:
description: Git commit author configuration.
type: object
properties:
@@ -4491,7 +4491,7 @@ components:
type: string
description: Author email for commits.
- WebhookConfiguration:
+ WebhookSettings:
description: Webhook delivery configuration.
type: object
required:
@@ -4566,4 +4566,4 @@ components:
login:
type: string
description: User's login identifier (e.g. GitHub username).
- example: octocat
\ No newline at end of file
+ example: octocat
diff --git a/lib/crates/fabro-api/src/demo/mod.rs b/lib/crates/fabro-api/src/demo/mod.rs
index e5aa519d4..ad1b5d86a 100644
--- a/lib/crates/fabro-api/src/demo/mod.rs
+++ b/lib/crates/fabro-api/src/demo/mod.rs
@@ -104,12 +104,12 @@ pub async fn get_run_verification(
paginated_response(runs::verifications(), &pagination)
}
-pub async fn get_run_configuration(
+pub async fn get_run_settings(
_auth: AuthenticatedService,
State(_state): State>,
Path(_id): Path,
) -> Response {
- (StatusCode::OK, Json(runs::configuration())).into_response()
+ (StatusCode::OK, Json(runs::settings())).into_response()
}
pub async fn steer_run_stub(
@@ -588,11 +588,11 @@ pub async fn list_models(
// ── Settings ───────────────────────────────────────────────────────────
-pub async fn get_server_configuration(
+pub async fn get_server_settings(
_auth: AuthenticatedService,
State(_state): State>,
) -> Response {
- (StatusCode::OK, Json(settings::server_config())).into_response()
+ (StatusCode::OK, Json(settings::server_settings())).into_response()
}
// ── Usage ──────────────────────────────────────────────────────────────
@@ -1276,7 +1276,7 @@ mod runs {
]
}
- pub fn configuration() -> serde_json::Value {
+ pub fn settings() -> serde_json::Value {
serde_json::to_value(fabro_config::FabroSettings {
version: Some(1),
goal: Some("Add rate limiting to auth endpoints".into()),
@@ -1431,7 +1431,7 @@ mod workflows {
]
}
- fn run_config_to_api(cfg: fabro_config::FabroSettings) -> RunConfiguration {
+ fn run_settings_to_api(cfg: fabro_config::FabroSettings) -> RunSettings {
fn strip_nulls(val: serde_json::Value) -> serde_json::Value {
match val {
serde_json::Value::Object(map) => serde_json::Value::Object(
@@ -1455,7 +1455,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(),
- config: run_config_to_api(fabro_config::FabroSettings {
+ settings: run_settings_to_api(fabro_config::FabroSettings {
version: Some(1),
goal: Some("Diagnose and fix CI build failures".into()),
graph: Some("fix_build.fabro".into()),
@@ -1526,7 +1526,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(),
- config: run_config_to_api(fabro_config::FabroSettings {
+ settings: run_settings_to_api(fabro_config::FabroSettings {
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(),
- config: run_config_to_api(fabro_config::FabroSettings {
+ settings: run_settings_to_api(fabro_config::FabroSettings {
version: Some(1),
goal: Some("Detect and reconcile configuration drift across environments".into()),
graph: Some("sync_drift.fabro".into()),
@@ -1692,7 +1692,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(),
- config: run_config_to_api(fabro_config::FabroSettings {
+ settings: run_settings_to_api(fabro_config::FabroSettings {
version: Some(1),
goal: Some("Propose and implement incremental product improvements".into()),
graph: Some("expand.fabro".into()),
@@ -3244,7 +3244,7 @@ mod settings {
use fabro_config::server::*;
use fabro_config::FabroSettings;
- pub fn server_config() -> serde_json::Value {
+ pub fn server_settings() -> serde_json::Value {
serde_json::to_value(FabroSettings {
storage_dir: Some("/home/fabro/.fabro".into()),
max_concurrent_runs: Some(10),
diff --git a/lib/crates/fabro-api/src/serve.rs b/lib/crates/fabro-api/src/serve.rs
index df33aab0b..f6613b7fb 100644
--- a/lib/crates/fabro-api/src/serve.rs
+++ b/lib/crates/fabro-api/src/serve.rs
@@ -83,12 +83,11 @@ pub async fn serve_command(args: ServeArgs, styles: &'static Styles) -> anyhow::
// Initialize data directory and SQLite database
let config_path = args.config;
- let server_config: FabroSettings =
- fabro_config::server::load_server_config(config_path.as_deref())?.try_into()?;
- let data_dir = fabro_config::server::resolve_storage_dir(&server_config);
+ let server_settings = fabro_config::server::load_server_settings(config_path.as_deref())?;
+ let data_dir = fabro_config::server::resolve_storage_dir(&server_settings);
// Shared config for live reloading
- let shared_config = Arc::new(RwLock::new(server_config));
+ let shared_config = Arc::new(RwLock::new(server_settings));
// CLI overrides take precedence over config file values, even after reload
let cli_model = args.model;
@@ -215,12 +214,8 @@ pub async fn serve_command(args: ServeArgs, styles: &'static Styles) -> anyhow::
interval.tick().await; // skip first immediate tick
loop {
interval.tick().await;
- match fabro_config::server::load_server_config(config_path_for_poll.as_deref()) {
+ match fabro_config::server::load_server_settings(config_path_for_poll.as_deref()) {
Ok(new_config) => {
- let Ok(new_config) = FabroSettings::try_from(new_config) else {
- warn!("Failed to finalize reloaded server config");
- continue;
- };
let changed = {
let cfg = config_for_poll.read().expect("config lock poisoned");
*cfg != new_config
diff --git a/lib/crates/fabro-api/src/server.rs b/lib/crates/fabro-api/src/server.rs
index b20aaeb7b..d747b9ee1 100644
--- a/lib/crates/fabro-api/src/server.rs
+++ b/lib/crates/fabro-api/src/server.rs
@@ -185,10 +185,7 @@ fn demo_routes() -> Router> {
"/runs/{id}/verification",
get(crate::demo::get_run_verification),
)
- .route(
- "/runs/{id}/configuration",
- get(crate::demo::get_run_configuration),
- )
+ .route("/runs/{id}/settings", get(crate::demo::get_run_settings))
.route("/runs/{id}/steer", post(crate::demo::steer_run_stub))
.route(
"/runs/{id}/preview",
@@ -250,7 +247,7 @@ fn demo_routes() -> Router> {
.route("/models", get(crate::demo::list_models))
.route("/models/{id}/test", post(test_model))
.route("/completions", post(create_completion))
- .route("/settings", get(crate::demo::get_server_configuration))
+ .route("/settings", get(crate::demo::get_server_settings))
.route("/usage", get(crate::demo::get_aggregate_usage))
}
@@ -273,7 +270,7 @@ fn real_routes() -> Router> {
.route("/runs/{id}/files", get(not_implemented))
.route("/runs/{id}/usage", get(not_implemented))
.route("/runs/{id}/verification", get(not_implemented))
- .route("/runs/{id}/configuration", get(not_implemented))
+ .route("/runs/{id}/settings", get(not_implemented))
.route("/runs/{id}/steer", post(not_implemented))
.route("/runs/{id}/preview", post(not_implemented))
.route("/workflows", get(not_implemented))
@@ -520,7 +517,7 @@ async fn start_run(
let run_id = ulid::Ulid::new().to_string();
info!(run_id = %run_id, "Run queued");
let run_dir = std::env::temp_dir().join(format!("fabro-{}", uuid::Uuid::new_v4()));
- let config = fabro_config::FabroSettings {
+ let settings = fabro_config::FabroSettings {
dry_run: Some(state.dry_run),
hooks: state.hooks.clone(),
sandbox: Some(fabro_config::sandbox::SandboxSettings {
@@ -529,11 +526,11 @@ async fn start_run(
}),
..Default::default()
};
- let run_labels = config.labels.clone();
+ let run_labels = settings.labels.clone();
let persisted = match operations::create(
&req.dot_source,
RunCreateOptions {
- config,
+ settings,
run_dir: Some(run_dir.clone()),
run_id: Some(run_id.clone()),
workflow_slug: None,
@@ -701,10 +698,9 @@ async fn execute_run(state: Arc, run_id: String) {
};
let run_record = persisted.run_record().clone();
let run_options = RunOptions {
- config: run_record.config,
+ settings: run_record.settings,
run_dir: run_dir.clone(),
cancel_token: Some(cancel_token),
- dry_run: state.dry_run,
run_id: run_id.clone(),
labels: run_record.labels,
git_author: state.git_author.clone(),
diff --git a/lib/crates/fabro-api/tests/openapi_conformance.rs b/lib/crates/fabro-api/tests/openapi_conformance.rs
index a28fbadee..57ba1f382 100644
--- a/lib/crates/fabro-api/tests/openapi_conformance.rs
+++ b/lib/crates/fabro-api/tests/openapi_conformance.rs
@@ -396,18 +396,18 @@ fn fully_populated_server_config() -> FabroSettings {
}
#[test]
-fn server_config_keys_match_openapi_spec() {
- let config = fully_populated_server_config();
- let json = serde_json::to_value(&config).expect("serialize ServerConfig");
+fn server_settings_keys_match_openapi_spec() {
+ let settings = fully_populated_server_config();
+ let json = serde_json::to_value(&settings).expect("serialize ServerSettings");
let spec = load_spec_json();
- let schema = &spec["components"]["schemas"]["ServerConfiguration"];
+ let schema = &spec["components"]["schemas"]["ServerSettings"];
let mut errors = Vec::new();
- compare_schema("ServerConfiguration", &json, schema, &spec, &mut errors);
+ compare_schema("ServerSettings", &json, schema, &spec, &mut errors);
if !errors.is_empty() {
panic!(
- "ServerConfig ↔ OpenAPI schema drift:\n {}",
+ "ServerSettings ↔ OpenAPI schema drift:\n {}",
errors.join("\n ")
);
}
diff --git a/lib/crates/fabro-cli/src/cli_config.rs b/lib/crates/fabro-cli/src/cli_config.rs
index 676b45063..245694e62 100644
--- a/lib/crates/fabro-cli/src/cli_config.rs
+++ b/lib/crates/fabro-cli/src/cli_config.rs
@@ -8,7 +8,7 @@ use fabro_config::FabroSettings;
#[cfg(feature = "server")]
use tracing::debug;
-pub fn load_cli_config(path: Option<&Path>) -> anyhow::Result {
+pub fn load_cli_settings(path: Option<&Path>) -> anyhow::Result {
fabro_config::cli::load_cli_config(path)?.try_into()
}
diff --git a/lib/crates/fabro-cli/src/commands/asset/cp.rs b/lib/crates/fabro-cli/src/commands/asset/cp.rs
index 4976b2d9e..d21da42cf 100644
--- a/lib/crates/fabro-cli/src/commands/asset/cp.rs
+++ b/lib/crates/fabro-cli/src/commands/asset/cp.rs
@@ -6,7 +6,7 @@ use crate::args::AssetCpArgs;
use crate::shared::split_run_path;
pub fn cp_command(args: &AssetCpArgs) -> Result<()> {
- let cli_config = crate::cli_config::load_cli_config(None)?;
+ let cli_config = crate::cli_config::load_cli_settings(None)?;
let base = fabro_workflows::run_lookup::runs_base(&cli_config.storage_dir());
let (run_id, asset_path) = parse_source(&args.source);
let run = fabro_workflows::run_lookup::resolve_run(&base, run_id)?;
diff --git a/lib/crates/fabro-cli/src/commands/asset/list.rs b/lib/crates/fabro-cli/src/commands/asset/list.rs
index 58a6309a4..4eb3c37d8 100644
--- a/lib/crates/fabro-cli/src/commands/asset/list.rs
+++ b/lib/crates/fabro-cli/src/commands/asset/list.rs
@@ -4,7 +4,7 @@ use crate::args::AssetListArgs;
use crate::shared::format_size;
pub fn list_command(args: &AssetListArgs) -> Result<()> {
- let cli_config = crate::cli_config::load_cli_config(None)?;
+ let cli_config = crate::cli_config::load_cli_settings(None)?;
let base = fabro_workflows::run_lookup::runs_base(&cli_config.storage_dir());
let run = fabro_workflows::run_lookup::resolve_run(&base, &args.run_id)?;
let entries = fabro_workflows::assets::scan_assets(&run.path, args.node.as_deref())?;
diff --git a/lib/crates/fabro-cli/src/commands/doctor.rs b/lib/crates/fabro-cli/src/commands/doctor.rs
index ea7f3c2d6..eae34fc28 100644
--- a/lib/crates/fabro-cli/src/commands/doctor.rs
+++ b/lib/crates/fabro-cli/src/commands/doctor.rs
@@ -928,7 +928,7 @@ pub async fn run_doctor(verbose: bool, live: bool) -> i32 {
spinner.enable_steady_tick(std::time::Duration::from_millis(80));
// Gather state
- let cli_config = crate::cli_config::load_cli_config(None).unwrap_or_default();
+ let cli_config = crate::cli_config::load_cli_settings(None).unwrap_or_default();
let config_path = dirs::home_dir().map(|h| h.join(".fabro").join("cli.toml"));
let config_exists = config_path.as_ref().is_some_and(|p| p.exists());
@@ -943,9 +943,7 @@ pub async fn run_doctor(verbose: bool, live: bool) -> i32 {
let daytona_configured = std::env::var("DAYTONA_API_KEY").is_ok();
#[cfg(feature = "server")]
- let server_config = fabro_config::server::load_server_config(None)
- .and_then(fabro_config::FabroSettings::try_from)
- .unwrap_or_default();
+ let server_config = fabro_config::server::load_server_settings(None).unwrap_or_default();
#[cfg(feature = "server")]
let api_status = {
diff --git a/lib/crates/fabro-cli/src/commands/exec.rs b/lib/crates/fabro-cli/src/commands/exec.rs
index c0c5abc02..3b607e2bb 100644
--- a/lib/crates/fabro-cli/src/commands/exec.rs
+++ b/lib/crates/fabro-cli/src/commands/exec.rs
@@ -4,7 +4,7 @@ use crate::args::GlobalArgs;
use crate::cli_config;
pub async fn execute(mut args: fabro_agent::cli::AgentArgs, globals: &GlobalArgs) -> Result<()> {
- let cli_config = cli_config::load_cli_config(None)?;
+ let cli_config = cli_config::load_cli_settings(None)?;
#[cfg(feature = "sleep_inhibitor")]
let _sleep_guard = crate::sleep_inhibitor::guard(cli_config.prevent_idle_sleep_enabled());
let exec_defaults = cli_config.exec.as_ref();
diff --git a/lib/crates/fabro-cli/src/commands/llm/mod.rs b/lib/crates/fabro-cli/src/commands/llm/mod.rs
index a4ebf8247..76ef04d0a 100644
--- a/lib/crates/fabro-cli/src/commands/llm/mod.rs
+++ b/lib/crates/fabro-cli/src/commands/llm/mod.rs
@@ -6,7 +6,7 @@ use anyhow::Result;
use crate::args::{GlobalArgs, LlmCommand, LlmNamespace};
pub async fn dispatch(ns: LlmNamespace, globals: &GlobalArgs) -> Result<()> {
- let cli_config = crate::cli_config::load_cli_config(None)?;
+ let cli_config = crate::cli_config::load_cli_settings(None)?;
match ns.command {
LlmCommand::Prompt(args) => prompt::execute(args, &cli_config, globals).await,
diff --git a/lib/crates/fabro-cli/src/commands/model.rs b/lib/crates/fabro-cli/src/commands/model.rs
index 61ff875b1..6c4250770 100644
--- a/lib/crates/fabro-cli/src/commands/model.rs
+++ b/lib/crates/fabro-cli/src/commands/model.rs
@@ -11,7 +11,7 @@ pub async fn execute(
let server = {
#[cfg(feature = "server")]
{
- let cli_config = cli_config::load_cli_config(None)?;
+ let cli_config = cli_config::load_cli_settings(None)?;
let resolved = cli_config::resolve_mode(
globals.mode.clone(),
globals.server_url.as_deref(),
diff --git a/lib/crates/fabro-cli/src/commands/pr/close.rs b/lib/crates/fabro-cli/src/commands/pr/close.rs
index 6ca7be3c9..e45b9a136 100644
--- a/lib/crates/fabro-cli/src/commands/pr/close.rs
+++ b/lib/crates/fabro-cli/src/commands/pr/close.rs
@@ -9,7 +9,7 @@ pub async fn close_command(
args: PrCloseArgs,
github_app: Option,
) -> Result<()> {
- let cli_config = crate::cli_config::load_cli_config(None)?;
+ let cli_config = crate::cli_config::load_cli_settings(None)?;
let base = fabro_workflows::run_lookup::runs_base(&cli_config.storage_dir());
close_from(&base, args, github_app).await
}
diff --git a/lib/crates/fabro-cli/src/commands/pr/create.rs b/lib/crates/fabro-cli/src/commands/pr/create.rs
index 82995b900..705ef6397 100644
--- a/lib/crates/fabro-cli/src/commands/pr/create.rs
+++ b/lib/crates/fabro-cli/src/commands/pr/create.rs
@@ -10,7 +10,7 @@ pub async fn create_command(
args: PrCreateArgs,
github_app: Option,
) -> Result<()> {
- let cli_config = crate::cli_config::load_cli_config(None)?;
+ let cli_config = crate::cli_config::load_cli_settings(None)?;
let base = fabro_workflows::run_lookup::runs_base(&cli_config.storage_dir());
create_from(&base, args, github_app).await
}
diff --git a/lib/crates/fabro-cli/src/commands/pr/list.rs b/lib/crates/fabro-cli/src/commands/pr/list.rs
index dc34a04eb..840d77e26 100644
--- a/lib/crates/fabro-cli/src/commands/pr/list.rs
+++ b/lib/crates/fabro-cli/src/commands/pr/list.rs
@@ -9,7 +9,7 @@ pub async fn list_command(
args: PrListArgs,
github_app: Option,
) -> Result<()> {
- let cli_config = crate::cli_config::load_cli_config(None)?;
+ let cli_config = crate::cli_config::load_cli_settings(None)?;
let base = fabro_workflows::run_lookup::runs_base(&cli_config.storage_dir());
list_from(&base, args, github_app).await
}
diff --git a/lib/crates/fabro-cli/src/commands/pr/merge.rs b/lib/crates/fabro-cli/src/commands/pr/merge.rs
index 7a257f63d..75430017d 100644
--- a/lib/crates/fabro-cli/src/commands/pr/merge.rs
+++ b/lib/crates/fabro-cli/src/commands/pr/merge.rs
@@ -9,7 +9,7 @@ pub async fn merge_command(
args: PrMergeArgs,
github_app: Option,
) -> Result<()> {
- let cli_config = crate::cli_config::load_cli_config(None)?;
+ let cli_config = crate::cli_config::load_cli_settings(None)?;
let base = fabro_workflows::run_lookup::runs_base(&cli_config.storage_dir());
merge_from(&base, args, github_app).await
}
diff --git a/lib/crates/fabro-cli/src/commands/pr/mod.rs b/lib/crates/fabro-cli/src/commands/pr/mod.rs
index e199a5757..3936b05a6 100644
--- a/lib/crates/fabro-cli/src/commands/pr/mod.rs
+++ b/lib/crates/fabro-cli/src/commands/pr/mod.rs
@@ -11,7 +11,7 @@ use anyhow::{Context, Result};
use crate::args::{PrCommand, PrNamespace};
pub async fn dispatch(ns: PrNamespace) -> Result<()> {
- let cli_config = crate::cli_config::load_cli_config(None)?;
+ let cli_config = crate::cli_config::load_cli_settings(None)?;
let github_app = crate::shared::github::build_github_app_credentials(cli_config.app_id());
match ns.command {
diff --git a/lib/crates/fabro-cli/src/commands/pr/view.rs b/lib/crates/fabro-cli/src/commands/pr/view.rs
index 04a29bcd6..720d0fed4 100644
--- a/lib/crates/fabro-cli/src/commands/pr/view.rs
+++ b/lib/crates/fabro-cli/src/commands/pr/view.rs
@@ -9,7 +9,7 @@ pub async fn view_command(
args: PrViewArgs,
github_app: Option,
) -> Result<()> {
- let cli_config = crate::cli_config::load_cli_config(None)?;
+ let cli_config = crate::cli_config::load_cli_settings(None)?;
let base = fabro_workflows::run_lookup::runs_base(&cli_config.storage_dir());
view_from(&base, args, github_app).await
}
diff --git a/lib/crates/fabro-cli/src/commands/preflight.rs b/lib/crates/fabro-cli/src/commands/preflight.rs
index 8d515cafc..89d1f8c6b 100644
--- a/lib/crates/fabro-cli/src/commands/preflight.rs
+++ b/lib/crates/fabro-cli/src/commands/preflight.rs
@@ -29,11 +29,8 @@ pub async fn execute(mut args: PreflightArgs) -> anyhow::Result<()> {
let git_status =
fabro_workflows::git::sync_status(&original_cwd, "origin", detected_base_branch.as_deref());
- let sandbox_provider = resolve_sandbox_provider(
- args.sandbox.map(Into::into),
- Some(&source_input.config),
- &source_input.run_defaults,
- )?;
+ let sandbox_provider =
+ resolve_sandbox_provider(args.sandbox.map(Into::into), &source_input.settings)?;
let validated = fabro_workflows::operations::validate(
&source_input.raw_source,
@@ -45,7 +42,7 @@ pub async fn execute(mut args: PreflightArgs) -> anyhow::Result<()> {
.unwrap_or(Path::new("."))
.to_path_buf(),
),
- config: Some(source_input.config.clone()),
+ settings: Some(source_input.settings.clone()),
goal_override: source_input.goal_override.clone(),
..Default::default()
},
@@ -57,10 +54,9 @@ pub async fn execute(mut args: PreflightArgs) -> anyhow::Result<()> {
run_preflight(
validated.graph(),
- &Some(source_input.config),
+ &source_input.settings,
args.model.as_deref(),
args.provider.as_deref(),
- &source_input.run_defaults,
git_status,
sandbox_provider,
styles,
diff --git a/lib/crates/fabro-cli/src/commands/repo/init.rs b/lib/crates/fabro-cli/src/commands/repo/init.rs
index a322666ca..9a3928f7d 100644
--- a/lib/crates/fabro-cli/src/commands/repo/init.rs
+++ b/lib/crates/fabro-cli/src/commands/repo/init.rs
@@ -150,7 +150,7 @@ async fn check_github_app_installation() {
};
// Load CLI config to get app_id and slug
- let cli_config = match crate::cli_config::load_cli_config(None) {
+ let cli_config = match crate::cli_config::load_cli_settings(None) {
Ok(c) => c,
Err(_) => return,
};
diff --git a/lib/crates/fabro-cli/src/commands/run/attach.rs b/lib/crates/fabro-cli/src/commands/run/attach.rs
index 34b2fd4c9..f8cd61091 100644
--- a/lib/crates/fabro-cli/src/commands/run/attach.rs
+++ b/lib/crates/fabro-cli/src/commands/run/attach.rs
@@ -42,7 +42,7 @@ pub async fn attach_run(
let is_tty = std::io::stderr().is_terminal();
let verbose = fabro_workflows::records::RunRecord::load(run_dir)
- .map(|record| record.config.verbose_enabled())
+ .map(|record| record.settings.verbose_enabled())
.unwrap_or(false);
let mut progress_ui = run_progress::ProgressUI::new(is_tty, verbose);
diff --git a/lib/crates/fabro-cli/src/commands/run/cp.rs b/lib/crates/fabro-cli/src/commands/run/cp.rs
index 848cf6d6d..c19ff523e 100644
--- a/lib/crates/fabro-cli/src/commands/run/cp.rs
+++ b/lib/crates/fabro-cli/src/commands/run/cp.rs
@@ -21,7 +21,7 @@ enum CopyDirection {
pub async fn cp_command(args: CpArgs) -> Result<()> {
let direction = parse_direction(&args.src, &args.dst)?;
- let cli_config = crate::cli_config::load_cli_config(None)?;
+ let cli_config = crate::cli_config::load_cli_settings(None)?;
let base = fabro_workflows::run_lookup::runs_base(&cli_config.storage_dir());
match direction {
diff --git a/lib/crates/fabro-cli/src/commands/run/create.rs b/lib/crates/fabro-cli/src/commands/run/create.rs
index c45a03994..0ccf77a2d 100644
--- a/lib/crates/fabro-cli/src/commands/run/create.rs
+++ b/lib/crates/fabro-cli/src/commands/run/create.rs
@@ -33,7 +33,7 @@ pub async fn create_run(
let run_dir = match args
.storage_dir
.clone()
- .or_else(|| source_input.config.storage_dir.clone())
+ .or_else(|| source_input.settings.storage_dir.clone())
{
Some(sd) => make_run_dir(&sd.join("runs"), &run_id, args.dry_run),
None => default_run_dir(&run_id, args.dry_run),
@@ -43,24 +43,20 @@ pub async fn create_run(
.ok()
.and_then(|(_, branch)| branch);
if !args.dry_run {
- let _ = resolve_sandbox_provider(
- args.sandbox.map(Into::into),
- Some(&source_input.config),
- &source_input.run_defaults,
- )?;
+ let _ = resolve_sandbox_provider(args.sandbox.map(Into::into), &source_input.settings)?;
}
- let config = source_input.config.clone();
+ let settings = source_input.settings.clone();
let persisted = match fabro_workflows::operations::create(
&source_input.raw_source,
fabro_workflows::operations::RunCreateOptions {
- config,
+ settings,
run_dir: Some(run_dir.clone()),
run_id: Some(run_id.clone()),
workflow_slug: source_input.workflow_slug.clone(),
labels: {
- let mut labels = source_input.config.labels.clone();
+ let mut labels = source_input.settings.labels.clone();
labels.extend(parse_labels(&args.label));
labels
},
diff --git a/lib/crates/fabro-cli/src/commands/run/detached.rs b/lib/crates/fabro-cli/src/commands/run/detached.rs
index 9f63f9bd4..fbf9be5dd 100644
--- a/lib/crates/fabro-cli/src/commands/run/detached.rs
+++ b/lib/crates/fabro-cli/src/commands/run/detached.rs
@@ -16,7 +16,7 @@ pub async fn execute(storage_dir: PathBuf, run_id: String, resume: bool) -> Resu
let run_dir = fabro_workflows::run_lookup::find_run_by_prefix(&runs_base, &run_id)?;
let styles: &'static fabro_util::terminal::Styles =
Box::leak(Box::new(fabro_util::terminal::Styles::detect_stderr()));
- let cli_config = cli_config::load_cli_config(None)?;
+ let cli_config = cli_config::load_cli_settings(None)?;
let github_app = shared::github::build_github_app_credentials(cli_config.app_id());
let git_author = fabro_workflows::git::GitAuthor::from_options(
cli_config.git_author().and_then(|a| a.name.clone()),
@@ -54,22 +54,14 @@ pub async fn execute(storage_dir: PathBuf, run_id: String, resume: bool) -> Resu
super::execute::resume_from_record(
persisted,
run_dir.clone(),
- cli_config,
styles,
github_app,
git_author,
)
.await
} else {
- super::execute::run_from_record(
- persisted,
- run_dir.clone(),
- cli_config,
- styles,
- github_app,
- git_author,
- )
- .await
+ super::execute::run_from_record(persisted, run_dir.clone(), styles, github_app, git_author)
+ .await
};
match result {
diff --git a/lib/crates/fabro-cli/src/commands/run/diff.rs b/lib/crates/fabro-cli/src/commands/run/diff.rs
index 043328db6..50afb41fc 100644
--- a/lib/crates/fabro-cli/src/commands/run/diff.rs
+++ b/lib/crates/fabro-cli/src/commands/run/diff.rs
@@ -8,7 +8,7 @@ use crate::args::DiffArgs;
pub async fn run(args: DiffArgs) -> Result<()> {
info!(run_id = %args.run, "Showing diff");
- let cli_config = crate::cli_config::load_cli_config(None)?;
+ let cli_config = crate::cli_config::load_cli_settings(None)?;
let base = fabro_workflows::run_lookup::runs_base(&cli_config.storage_dir());
let run_dir = fabro_workflows::run_lookup::resolve_run(&base, &args.run)?.path;
diff --git a/lib/crates/fabro-cli/src/commands/run/execute.rs b/lib/crates/fabro-cli/src/commands/run/execute.rs
index b44a66907..7595a51ef 100644
--- a/lib/crates/fabro-cli/src/commands/run/execute.rs
+++ b/lib/crates/fabro-cli/src/commands/run/execute.rs
@@ -32,7 +32,7 @@ use tracing::debug;
use super::detached::{DetachedRunBootstrapGuard, DetachedRunCompletionGuard};
use super::run_progress;
-use crate::args::{CliSandboxProvider, GlobalArgs, PreflightArgs, RunArgs};
+use crate::args::{GlobalArgs, PreflightArgs, RunArgs};
use crate::shared::{
format_tokens_human, print_diagnostics, read_workflow_file, relative_path, tilde_path,
};
@@ -149,45 +149,27 @@ pub(crate) fn workflow_slug_from_path(workflow_path: &Path) -> Option {
Some(file_stem.into_owned())
}
-fn is_cached_run_restart(workflow_path: &Path, run_dir: &Path) -> bool {
- workflow_path.starts_with(run_dir)
- && workflow_path.file_name().is_some_and(|f| {
- f == std::ffi::OsStr::new(RUN_CONFIG_FILE) || f == std::ffi::OsStr::new(RUN_GRAPH_FILE)
- })
-}
-
-/// Resolve model and provider through the full precedence chain:
-/// CLI flag > TOML config > run defaults > DOT graph attrs > provider-specific defaults.
+/// Resolve model and provider from resolved settings, with graph attrs as fallback.
/// Then resolve through the catalog for alias expansion.
pub(crate) fn resolve_model_provider(
cli_model: Option<&str>,
cli_provider: Option<&str>,
- run_cfg: Option<&FabroSettings>,
- run_defaults: &FabroSettings,
+ settings: &FabroSettings,
graph: &fabro_graphviz::graph::Graph,
) -> (String, Option) {
- let toml_model = run_cfg
- .and_then(|c| c.llm.as_ref())
- .and_then(|l| l.model.as_deref());
- let toml_provider = run_cfg
- .and_then(|c| c.llm.as_ref())
- .and_then(|l| l.provider.as_deref());
- let defaults_model = run_defaults.llm.as_ref().and_then(|l| l.model.as_deref());
- let defaults_provider = run_defaults
+ let configured_model = settings.llm.as_ref().and_then(|llm| llm.model.as_deref());
+ let configured_provider = settings
.llm
.as_ref()
- .and_then(|l| l.provider.as_deref());
+ .and_then(|llm| llm.provider.as_deref());
- // Precedence: CLI flag > TOML > run defaults > DOT graph attrs > defaults
let provider = cli_provider
- .or(toml_provider)
- .or(defaults_provider)
+ .or(configured_provider)
.or_else(|| graph.attrs.get("default_provider").and_then(|v| v.as_str()))
.map(String::from);
let model = cli_model
- .or(toml_model)
- .or(defaults_model)
+ .or(configured_model)
.or_else(|| graph.attrs.get("default_model").and_then(|v| v.as_str()))
.map(String::from)
.unwrap_or_else(|| {
@@ -210,89 +192,62 @@ pub(crate) fn resolve_model_provider(
}
}
-/// Parse sandbox provider from an optional `SandboxConfig`.
+/// Parse sandbox provider from resolved settings.
pub(crate) fn parse_sandbox_provider(
- sandbox: Option<&sandbox_config::SandboxSettings>,
+ settings: &FabroSettings,
) -> anyhow::Result