From 8d2a3220f7b31c1ead45743cdfdb92dcb465da74 Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Fri, 3 Apr 2026 11:24:36 -0700 Subject: [PATCH] Simplify: rename internal AggregateUsageTotals to UsageAccumulator, add TODO MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eliminates confusing alias (`ApiAggregateUsageTotals`) by giving the internal accumulator struct a distinct name. Adds a TODO for removing the OAS 3.1→3.0 patch when progenitor gains 3.1 support. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/crates/fabro-api/build.rs | 1 + lib/crates/fabro-server/src/server.rs | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/crates/fabro-api/build.rs b/lib/crates/fabro-api/build.rs index 9c802dbaa..9a7495bc2 100644 --- a/lib/crates/fabro-api/build.rs +++ b/lib/crates/fabro-api/build.rs @@ -81,6 +81,7 @@ fn main() { let mut spec_value: serde_json::Value = serde_yaml::from_str(&spec_text).unwrap_or_else(|e| panic!("failed to parse YAML: {e}")); + // TODO: Remove 3.1→3.0 patch when progenitor supports OpenAPI 3.1. // Progenitor only supports OpenAPI 3.0.x; our spec uses 3.1.0 but doesn't // rely on any 3.1-only features that affect codegen. spec_value["openapi"] = serde_json::Value::String("3.0.3".to_string()); diff --git a/lib/crates/fabro-server/src/server.rs b/lib/crates/fabro-server/src/server.rs index 6d992be05..c9578a3e4 100644 --- a/lib/crates/fabro-server/src/server.rs +++ b/lib/crates/fabro-server/src/server.rs @@ -52,7 +52,7 @@ use fabro_workflow::operations::{self, CreateRunInput, WorkflowInput}; use fabro_workflow::pipeline::Persisted; use fabro_workflow::records::Checkpoint; -use fabro_api::types::AggregateUsageTotals as ApiAggregateUsageTotals; +use fabro_api::types::AggregateUsageTotals; pub use fabro_api::types::{ AggregateUsage, ApiQuestion, ApiQuestionOption, CompletionContentPart, CompletionMessage, CompletionMessageRole, CompletionResponse, CompletionToolChoiceMode, CompletionUsage, @@ -116,7 +116,7 @@ struct ModelUsageTotals { /// In-memory aggregate usage counters, reset on server restart. #[derive(Default)] -struct AggregateUsageTotals { +struct UsageAccumulator { total_runs: i64, total_runtime_secs: f64, by_model: HashMap, @@ -127,7 +127,7 @@ type RegistryFactoryOverride = dyn Fn(Arc) -> HandlerRegistry + /// Shared application state for the server. pub struct AppState { runs: Mutex>, - aggregate_usage: Mutex, + aggregate_usage: Mutex, store: StoreHandle, pub db: sqlx::SqlitePool, max_concurrent_runs: usize, @@ -394,7 +394,7 @@ async fn get_aggregate_usage( }) .collect(); let response = AggregateUsage { - totals: ApiAggregateUsageTotals { + totals: AggregateUsageTotals { runs: agg.total_runs, input_tokens: by_model.iter().map(|m| m.usage.input_tokens).sum(), output_tokens: by_model.iter().map(|m| m.usage.output_tokens).sum(), @@ -465,7 +465,7 @@ fn build_app_state( ) -> Arc { Arc::new(AppState { runs: Mutex::new(HashMap::new()), - aggregate_usage: Mutex::new(AggregateUsageTotals::default()), + aggregate_usage: Mutex::new(UsageAccumulator::default()), store, db, max_concurrent_runs,