rho-coding-agent 1.26.0

A lightweight agent harness inspired by Pi
Documentation
use std::collections::BTreeMap;

use super::{FrozenWorkflow, NodeId, WorkflowError, WorkflowResult};

pub(crate) fn normalize_workflow(mut workflow: FrozenWorkflow) -> WorkflowResult<FrozenWorkflow> {
    let mut normalized = BTreeMap::new();
    for (key, mut node) in workflow.graph.nodes {
        if key != node.id {
            return Err(WorkflowError::Schema {
                path: format!("graph.nodes.{key}"),
                reason: format!("map key does not match node ID '{}'", node.id),
            });
        }
        node.needs.sort();
        node.needs.dedup();
        normalized.insert(key, node);
    }
    workflow.graph.nodes = normalized;
    workflow.resolved_nodes = workflow
        .resolved_nodes
        .into_iter()
        .collect::<BTreeMap<NodeId, _>>();
    workflow.graph_digest = super::graph_digest(&workflow)?;
    Ok(workflow)
}