diff --git a/lib/crates/fabro-cli/src/commands/attach.rs b/lib/crates/fabro-cli/src/commands/attach.rs index b766f3fa2..e94a53391 100644 --- a/lib/crates/fabro-cli/src/commands/attach.rs +++ b/lib/crates/fabro-cli/src/commands/attach.rs @@ -345,7 +345,7 @@ fn write_interview_response_atomically( fn determine_exit_code(conclusion_path: &Path, status_record: Option) -> ExitCode { if conclusion_path.exists() { - if let Ok(conclusion) = fabro_workflows::conclusion::Conclusion::load(conclusion_path) { + if let Ok(conclusion) = fabro_workflows::records::Conclusion::load(conclusion_path) { let success = matches!( conclusion.status, fabro_workflows::outcome::StageStatus::Success @@ -395,7 +395,7 @@ mod tests { use chrono::Utc; use fabro_interview::{Answer, AnswerValue}; use fabro_util::terminal::Styles; - use fabro_workflows::conclusion::Conclusion; + use fabro_workflows::records::Conclusion; use fabro_workflows::outcome::StageStatus; use fabro_workflows::run_status::{write_run_status, StatusReason}; diff --git a/lib/crates/fabro-cli/src/commands/detached_support.rs b/lib/crates/fabro-cli/src/commands/detached_support.rs index f9dd71209..183ca7ba4 100644 --- a/lib/crates/fabro-cli/src/commands/detached_support.rs +++ b/lib/crates/fabro-cli/src/commands/detached_support.rs @@ -3,7 +3,7 @@ use std::path::{Path, PathBuf}; use anyhow::{Context, Result}; use chrono::{SecondsFormat, Utc}; -use fabro_workflows::conclusion::Conclusion; +use fabro_workflows::records::Conclusion; use fabro_workflows::event::{RunNoticeLevel, WorkflowRunEvent}; use fabro_workflows::outcome::StageStatus; use fabro_workflows::run_status::{self, RunStatus, StatusReason}; @@ -331,7 +331,7 @@ mod tests { assert_eq!(record.status, RunStatus::Failed); assert_eq!(record.reason, Some(StatusReason::BootstrapFailed)); let conclusion = - fabro_workflows::conclusion::Conclusion::load(&dir.path().join("conclusion.json")) + fabro_workflows::records::Conclusion::load(&dir.path().join("conclusion.json")) .unwrap(); assert_eq!(conclusion.status, StageStatus::Fail); assert_eq!( diff --git a/lib/crates/fabro-cli/src/commands/inspect.rs b/lib/crates/fabro-cli/src/commands/inspect.rs index a45ffa6f3..28cf952a7 100644 --- a/lib/crates/fabro-cli/src/commands/inspect.rs +++ b/lib/crates/fabro-cli/src/commands/inspect.rs @@ -43,7 +43,7 @@ fn inspect_run_dir( .ok() .and_then(|v| serde_json::to_value(v).ok()); let conclusion = - fabro_workflows::conclusion::Conclusion::load(&run_dir.join("conclusion.json")) + fabro_workflows::records::Conclusion::load(&run_dir.join("conclusion.json")) .ok() .and_then(|v| serde_json::to_value(v).ok()); let checkpoint = diff --git a/lib/crates/fabro-cli/src/commands/pr.rs b/lib/crates/fabro-cli/src/commands/pr.rs index d64ba9083..7e907ee53 100644 --- a/lib/crates/fabro-cli/src/commands/pr.rs +++ b/lib/crates/fabro-cli/src/commands/pr.rs @@ -332,7 +332,7 @@ async fn create_from( .context("Failed to load start.json")?; let conclusion = - fabro_workflows::conclusion::Conclusion::load(&run_dir.join("conclusion.json")) + fabro_workflows::records::Conclusion::load(&run_dir.join("conclusion.json")) .context("Failed to load conclusion.json — is the run finished?")?; match conclusion.status { diff --git a/lib/crates/fabro-cli/src/commands/run.rs b/lib/crates/fabro-cli/src/commands/run.rs index cdbb29291..573bbe267 100644 --- a/lib/crates/fabro-cli/src/commands/run.rs +++ b/lib/crates/fabro-cli/src/commands/run.rs @@ -1852,7 +1852,7 @@ pub(crate) fn emit_run_notice( /// the same result block that `run_command` prints in-process. pub fn print_run_summary(run_dir: &Path, run_id: &str, styles: &Styles) { let conclusion_path = run_dir.join("conclusion.json"); - let Ok(conclusion) = fabro_workflows::conclusion::Conclusion::load(&conclusion_path) else { + let Ok(conclusion) = fabro_workflows::records::Conclusion::load(&conclusion_path) else { return; }; @@ -1879,7 +1879,7 @@ pub fn print_run_summary(run_dir: &Path, run_id: &str, styles: &Styles) { } pub(crate) fn print_run_conclusion( - conclusion: &fabro_workflows::conclusion::Conclusion, + conclusion: &fabro_workflows::records::Conclusion, run_id: &str, run_dir: &Path, pushed_branch: Option<&str>, diff --git a/lib/crates/fabro-cli/src/commands/wait.rs b/lib/crates/fabro-cli/src/commands/wait.rs index f1f617d68..16bc5d0b6 100644 --- a/lib/crates/fabro-cli/src/commands/wait.rs +++ b/lib/crates/fabro-cli/src/commands/wait.rs @@ -64,7 +64,7 @@ pub fn run(args: WaitArgs, styles: &Styles) -> Result<()> { }; let conclusion_path = run_info.path.join("conclusion.json"); - let conclusion = fabro_workflows::conclusion::Conclusion::load(&conclusion_path).ok(); + let conclusion = fabro_workflows::records::Conclusion::load(&conclusion_path).ok(); if args.json { let json_value = build_json_output(final_status, &run_info.run_id, conclusion.as_ref()); @@ -85,7 +85,7 @@ pub fn run(args: WaitArgs, styles: &Styles) -> Result<()> { fn build_json_output( status: RunStatus, run_id: &str, - conclusion: Option<&fabro_workflows::conclusion::Conclusion>, + conclusion: Option<&fabro_workflows::records::Conclusion>, ) -> serde_json::Value { let mut value = serde_json::json!({ "run_id": run_id, @@ -103,7 +103,7 @@ fn build_json_output( fn print_human_output( status: RunStatus, run_id: &str, - conclusion: Option<&fabro_workflows::conclusion::Conclusion>, + conclusion: Option<&fabro_workflows::records::Conclusion>, styles: &Styles, ) { let (style, label) = match status { @@ -137,7 +137,7 @@ fn print_human_output( #[cfg(test)] mod tests { use super::*; - use fabro_workflows::conclusion::Conclusion; + use fabro_workflows::records::Conclusion; use fabro_workflows::outcome::StageStatus; fn no_color_styles() -> Styles { diff --git a/lib/crates/fabro-workflows/src/handler/llm/api.rs b/lib/crates/fabro-workflows/src/handler/llm/api.rs index 19570d93d..c0ec48b03 100644 --- a/lib/crates/fabro-workflows/src/handler/llm/api.rs +++ b/lib/crates/fabro-workflows/src/handler/llm/api.rs @@ -12,11 +12,11 @@ use fabro_llm::client::Client; use fabro_model::FallbackTarget; use fabro_model::Provider; +use super::super::agent::{CodergenBackend, CodergenResult}; use crate::context::{Context, WorkflowContext}; use crate::cost::compute_stage_cost; use crate::error::FabroError; use crate::event::WorkflowRunEvent; -use super::super::agent::{CodergenBackend, CodergenResult}; use crate::outcome::StageUsage; use fabro_graphviz::graph::Node; diff --git a/lib/crates/fabro-workflows/src/handler/llm/cli.rs b/lib/crates/fabro-workflows/src/handler/llm/cli.rs index 43043b09a..a0ba5de59 100644 --- a/lib/crates/fabro-workflows/src/handler/llm/cli.rs +++ b/lib/crates/fabro-workflows/src/handler/llm/cli.rs @@ -7,11 +7,11 @@ use fabro_agent::sandbox::ExecResult; use fabro_agent::Sandbox; use fabro_model::Provider; +use super::super::agent::{CodergenBackend, CodergenResult}; use crate::context::Context; use crate::cost::compute_stage_cost; use crate::error::FabroError; use crate::event::{EventEmitter, WorkflowRunEvent}; -use super::super::agent::{CodergenBackend, CodergenResult}; use crate::outcome::StageUsage; use fabro_graphviz::graph::Node; diff --git a/lib/crates/fabro-workflows/src/handler/llm/mod.rs b/lib/crates/fabro-workflows/src/handler/llm/mod.rs index b8562dbd1..364561966 100644 --- a/lib/crates/fabro-workflows/src/handler/llm/mod.rs +++ b/lib/crates/fabro-workflows/src/handler/llm/mod.rs @@ -1,5 +1,6 @@ pub mod api; pub mod cli; +pub mod preamble; pub use api::AgentApiBackend; pub use cli::{parse_cli_response, AgentCliBackend, BackendRouter}; diff --git a/lib/crates/fabro-workflows/src/preamble.rs b/lib/crates/fabro-workflows/src/handler/llm/preamble.rs similarity index 100% rename from lib/crates/fabro-workflows/src/preamble.rs rename to lib/crates/fabro-workflows/src/handler/llm/preamble.rs diff --git a/lib/crates/fabro-workflows/src/handler/mod.rs b/lib/crates/fabro-workflows/src/handler/mod.rs index 98317f52a..12dfee2fe 100644 --- a/lib/crates/fabro-workflows/src/handler/mod.rs +++ b/lib/crates/fabro-workflows/src/handler/mod.rs @@ -1,10 +1,10 @@ pub mod agent; pub mod command; -pub mod llm; pub mod conditional; pub mod exit; pub mod fan_in; pub mod human; +pub mod llm; pub mod manager_loop; pub mod parallel; pub mod prompt; diff --git a/lib/crates/fabro-workflows/src/lib.rs b/lib/crates/fabro-workflows/src/lib.rs index 6bba79fec..dd10ce799 100644 --- a/lib/crates/fabro-workflows/src/lib.rs +++ b/lib/crates/fabro-workflows/src/lib.rs @@ -92,7 +92,6 @@ pub mod artifact; pub mod asset_snapshot; pub mod assets; pub mod checkpoint; -pub mod conclusion; pub mod condition; pub mod context; pub mod cost; @@ -109,6 +108,7 @@ pub mod operations; pub mod outcome; pub mod pipeline; pub mod pull_request; +pub mod records; pub mod run_dir; pub mod run_lookup; pub mod run_record; diff --git a/lib/crates/fabro-workflows/src/lifecycle/artifact.rs b/lib/crates/fabro-workflows/src/lifecycle/artifact.rs index d924ba6ac..064665313 100644 --- a/lib/crates/fabro-workflows/src/lifecycle/artifact.rs +++ b/lib/crates/fabro-workflows/src/lifecycle/artifact.rs @@ -8,10 +8,10 @@ use fabro_core::lifecycle::{AttemptContext, AttemptResultContext, RunLifecycle}; use fabro_core::outcome::NodeResult; use fabro_core::state::RunState; -use crate::graph::WorkflowGraph; -use crate::graph::WorkflowNode; use crate::artifact::{offload_large_values, sync_artifacts_to_env, ArtifactStore}; use crate::event::{EventEmitter, RunNoticeLevel, WorkflowRunEvent}; +use crate::graph::WorkflowGraph; +use crate::graph::WorkflowNode; use crate::outcome::StageUsage; use fabro_core::lifecycle::NodeDecision; diff --git a/lib/crates/fabro-workflows/src/lifecycle/circuit_breaker.rs b/lib/crates/fabro-workflows/src/lifecycle/circuit_breaker.rs index 90fe85fc3..45ae484ab 100644 --- a/lib/crates/fabro-workflows/src/lifecycle/circuit_breaker.rs +++ b/lib/crates/fabro-workflows/src/lifecycle/circuit_breaker.rs @@ -8,9 +8,9 @@ use fabro_core::lifecycle::{EdgeContext, EdgeDecision, RunLifecycle}; use fabro_core::outcome::NodeResult; use fabro_core::state::RunState; +use crate::error::{FailureCategory, FailureSignature}; use crate::graph::WorkflowGraph; use crate::graph::WorkflowNode; -use crate::error::{FailureCategory, FailureSignature}; use crate::graph_ops::classify_outcome; use crate::outcome::{OutcomeExt, StageStatus, StageUsage}; diff --git a/lib/crates/fabro-workflows/src/lifecycle/disk.rs b/lib/crates/fabro-workflows/src/lifecycle/disk.rs index 8d815bc47..f22e91ecf 100644 --- a/lib/crates/fabro-workflows/src/lifecycle/disk.rs +++ b/lib/crates/fabro-workflows/src/lifecycle/disk.rs @@ -8,11 +8,11 @@ use fabro_core::lifecycle::RunLifecycle; use fabro_core::outcome::NodeResult; use fabro_core::state::RunState; -use crate::graph::WorkflowGraph; -use crate::graph::WorkflowNode; use super::circuit_breaker::CircuitBreakerLifecycle; use crate::checkpoint::Checkpoint; use crate::event::{EventEmitter, RunNoticeLevel, WorkflowRunEvent}; +use crate::graph::WorkflowGraph; +use crate::graph::WorkflowNode; use crate::outcome::StageUsage; use crate::run_dir::{write_node_status, write_start_record}; use crate::run_settings::RunSettings; diff --git a/lib/crates/fabro-workflows/src/lifecycle/event.rs b/lib/crates/fabro-workflows/src/lifecycle/event.rs index 97911983a..0102fb16b 100644 --- a/lib/crates/fabro-workflows/src/lifecycle/event.rs +++ b/lib/crates/fabro-workflows/src/lifecycle/event.rs @@ -8,11 +8,11 @@ use fabro_core::lifecycle::{AttemptContext, AttemptResultContext, EdgeContext, R use fabro_core::outcome::NodeResult; use fabro_core::state::RunState; -use crate::graph::WorkflowGraph; -use crate::graph::WorkflowNode; use super::git::GitCheckpointResult; use crate::artifact::ArtifactStore; use crate::event::{EventEmitter, WorkflowRunEvent}; +use crate::graph::WorkflowGraph; +use crate::graph::WorkflowNode; use crate::graph_ops::node_script; use crate::outcome::{FailureCategory, FailureDetail, Outcome, StageStatus, StageUsage}; diff --git a/lib/crates/fabro-workflows/src/lifecycle/fidelity.rs b/lib/crates/fabro-workflows/src/lifecycle/fidelity.rs index 319a17909..0a359fa34 100644 --- a/lib/crates/fabro-workflows/src/lifecycle/fidelity.rs +++ b/lib/crates/fabro-workflows/src/lifecycle/fidelity.rs @@ -6,12 +6,12 @@ use fabro_core::graph::NodeSpec; use fabro_core::lifecycle::{EdgeContext, NodeDecision, RunLifecycle}; use fabro_core::state::RunState; +use crate::context::keys; use crate::graph::WorkflowGraph; use crate::graph::WorkflowNode; -use crate::context::keys; use crate::graph_ops::{resolve_fidelity, resolve_thread_id}; +use crate::handler::llm::preamble::build_preamble; use crate::outcome::StageUsage; -use crate::preamble::build_preamble; type WfRunState = RunState>; type WfNodeDecision = NodeDecision>; diff --git a/lib/crates/fabro-workflows/src/lifecycle/git.rs b/lib/crates/fabro-workflows/src/lifecycle/git.rs index 45ebe6bb4..0bc5efc1f 100644 --- a/lib/crates/fabro-workflows/src/lifecycle/git.rs +++ b/lib/crates/fabro-workflows/src/lifecycle/git.rs @@ -9,10 +9,10 @@ use fabro_core::lifecycle::RunLifecycle; use fabro_core::outcome::NodeResult; use fabro_core::state::RunState; -use crate::graph::WorkflowGraph; -use crate::graph::WorkflowNode; use crate::artifact::ArtifactStore; use crate::event::{EventEmitter, RunNoticeLevel, WorkflowRunEvent}; +use crate::graph::WorkflowGraph; +use crate::graph::WorkflowNode; use crate::outcome::{Outcome, StageStatus, StageUsage}; use crate::run_dir::node_dir; use crate::run_settings::RunSettings; diff --git a/lib/crates/fabro-workflows/src/lifecycle/mod.rs b/lib/crates/fabro-workflows/src/lifecycle/mod.rs index d0fdb7c0a..e5dd639ef 100644 --- a/lib/crates/fabro-workflows/src/lifecycle/mod.rs +++ b/lib/crates/fabro-workflows/src/lifecycle/mod.rs @@ -23,11 +23,11 @@ use fabro_core::lifecycle::{ use fabro_core::outcome::NodeResult; use fabro_core::state::RunState; -use crate::graph::WorkflowGraph; -use crate::graph::WorkflowNode; use crate::artifact::ArtifactStore; use crate::context; use crate::event::EventEmitter; +use crate::graph::WorkflowGraph; +use crate::graph::WorkflowNode; use crate::outcome::{Outcome, StageUsage}; use crate::run_settings::RunSettings; use fabro_hooks::HookRunner; diff --git a/lib/crates/fabro-workflows/src/node_handler.rs b/lib/crates/fabro-workflows/src/node_handler.rs index 5b1250d65..4af683def 100644 --- a/lib/crates/fabro-workflows/src/node_handler.rs +++ b/lib/crates/fabro-workflows/src/node_handler.rs @@ -147,8 +147,8 @@ mod tests { use fabro_graphviz::graph::types::{Edge, Graph, Node}; use fabro_graphviz::graph::AttrValue; - use crate::graph::WorkflowGraph; use super::*; + use crate::graph::WorkflowGraph; /// Minimal spike handler that always succeeds — proves the trait plumbing. pub struct SpikeHandler; diff --git a/lib/crates/fabro-workflows/src/pipeline/execute.rs b/lib/crates/fabro-workflows/src/pipeline/execute.rs index 3fe205f56..c3adfc8b5 100644 --- a/lib/crates/fabro-workflows/src/pipeline/execute.rs +++ b/lib/crates/fabro-workflows/src/pipeline/execute.rs @@ -6,11 +6,11 @@ use fabro_core::state::RunState; use tokio_util::sync::CancellationToken; use crate::context::{self, Context}; +use crate::error::FabroError; use crate::graph::WorkflowGraph; +use crate::handler::EngineServices; use crate::lifecycle::WorkflowLifecycle; use crate::node_handler::WorkflowNodeHandler; -use crate::error::FabroError; -use crate::handler::EngineServices; use crate::outcome::{Outcome, StageStatus}; use crate::sandbox_git::GitState; diff --git a/lib/crates/fabro-workflows/src/pipeline/finalize.rs b/lib/crates/fabro-workflows/src/pipeline/finalize.rs index 681326d83..88a70989c 100644 --- a/lib/crates/fabro-workflows/src/pipeline/finalize.rs +++ b/lib/crates/fabro-workflows/src/pipeline/finalize.rs @@ -2,7 +2,7 @@ use std::path::Path; use std::sync::Arc; use crate::checkpoint::Checkpoint; -use crate::conclusion::Conclusion; +use crate::records::Conclusion; use crate::error::FabroError; use crate::event::{EventEmitter, RunNoticeLevel, WorkflowRunEvent}; use crate::outcome::{Outcome, OutcomeExt, StageStatus}; @@ -106,7 +106,7 @@ pub fn build_conclusion( total_reasoning_tokens += usage.reasoning_tokens.unwrap_or(0); } - stages.push(crate::conclusion::StageSummary { + stages.push(crate::records::StageSummary { stage_id: node_id.clone(), stage_label: node_id.clone(), duration_ms: stage_durations.get(node_id).copied().unwrap_or(0), diff --git a/lib/crates/fabro-workflows/src/pipeline/types.rs b/lib/crates/fabro-workflows/src/pipeline/types.rs index 768a40c1a..a8e311ee8 100644 --- a/lib/crates/fabro-workflows/src/pipeline/types.rs +++ b/lib/crates/fabro-workflows/src/pipeline/types.rs @@ -8,7 +8,7 @@ use fabro_hooks::HookRunner; use fabro_validate::Diagnostic; use crate::checkpoint::Checkpoint; -use crate::conclusion::Conclusion; +use crate::records::Conclusion; use crate::context::Context; use crate::error::FabroError; use crate::event::EventEmitter; diff --git a/lib/crates/fabro-workflows/src/pull_request.rs b/lib/crates/fabro-workflows/src/pull_request.rs index b18a3aef6..a55df5c7c 100644 --- a/lib/crates/fabro-workflows/src/pull_request.rs +++ b/lib/crates/fabro-workflows/src/pull_request.rs @@ -6,7 +6,7 @@ use tracing::{debug, info}; use fabro_github::{self as github_app, ssh_url_to_https, GitHubAppCredentials}; -use crate::conclusion::Conclusion; +use crate::records::Conclusion; use crate::run_record::RunRecord; use fabro_retro::retro::Retro; @@ -452,7 +452,7 @@ pub async fn maybe_open_pull_request( #[cfg(test)] mod tests { use super::*; - use crate::conclusion::StageSummary; + use crate::records::StageSummary; use chrono::Utc; use fabro_retro::retro::{ AggregateStats, FrictionKind, FrictionPoint, OpenItem, OpenItemKind, StageRetro, diff --git a/lib/crates/fabro-workflows/src/conclusion.rs b/lib/crates/fabro-workflows/src/records/conclusion.rs similarity index 100% rename from lib/crates/fabro-workflows/src/conclusion.rs rename to lib/crates/fabro-workflows/src/records/conclusion.rs diff --git a/lib/crates/fabro-workflows/src/records/mod.rs b/lib/crates/fabro-workflows/src/records/mod.rs new file mode 100644 index 000000000..03a27be2c --- /dev/null +++ b/lib/crates/fabro-workflows/src/records/mod.rs @@ -0,0 +1,3 @@ +mod conclusion; + +pub use conclusion::{Conclusion, StageSummary}; diff --git a/lib/crates/fabro-workflows/src/run_lookup.rs b/lib/crates/fabro-workflows/src/run_lookup.rs index 7fb5d5231..19285a8a4 100644 --- a/lib/crates/fabro-workflows/src/run_lookup.rs +++ b/lib/crates/fabro-workflows/src/run_lookup.rs @@ -165,7 +165,7 @@ fn read_status(run_dir: &Path) -> StatusInfo { if let Ok(record) = RunStatusRecord::load(&run_dir.join("status.json")) { if record.status.is_terminal() { if let Ok(conclusion) = - crate::conclusion::Conclusion::load(&run_dir.join("conclusion.json")) + crate::records::Conclusion::load(&run_dir.join("conclusion.json")) { return StatusInfo { status: record.status,