roboticus-core 0.11.1

Shared types, config parsing, personality system, and error types for the Roboticus agent runtime
Documentation
//! Canonical virtual delegation tool names.
//!
//! All crates that match tool names against delegation / orchestration output
//! must use these helpers so SQL fragments, API virtual tools, and metrics stay
//! aligned.

/// Returns true for virtual subagent delegation tools (hyphen and underscore
/// spellings, ASCII case-insensitive trimming).
///
/// Includes `select-subagent-model`, which does **not** emit `delegated_subagent=`
/// in output — use [`is_delegation_output_tool`] for SQL that counts delegations.
pub fn is_virtual_delegation_tool(name: &str) -> bool {
    matches!(
        name.trim().to_ascii_lowercase().as_str(),
        "orchestrate-subagents"
            | "orchestrate_subagents"
            | "assign-tasks"
            | "assign_tasks"
            | "delegate-subagent"
            | "delegate_subagent"
            | "select-subagent-model"
            | "select_subagent_model"
    )
}

/// Subset of virtual delegation tools whose successful tool output may contain
/// `delegated_subagent=<name>` (used for retirement metrics and DB queries).
/// Excludes `select-subagent-model`.
pub fn is_delegation_output_tool(name: &str) -> bool {
    matches!(
        name.trim().to_ascii_lowercase().as_str(),
        "orchestrate-subagents"
            | "orchestrate_subagents"
            | "assign-tasks"
            | "assign_tasks"
            | "delegate-subagent"
            | "delegate_subagent"
    )
}

/// SQL fragment: `tool_name IN ('a','b',...)` for delegation-output tools only.
pub fn delegation_output_tool_name_sql_in_predicate() -> &'static str {
    "tool_name IN ('delegate-subagent','delegate_subagent','assign-tasks','assign_tasks','orchestrate-subagents','orchestrate_subagents')"
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn delegation_output_is_subset_of_virtual_delegation() {
        for name in [
            "delegate-subagent",
            "delegate_subagent",
            "assign-tasks",
            "orchestrate_subagents",
        ] {
            assert!(
                is_virtual_delegation_tool(name),
                "{name} should be a virtual delegation tool"
            );
            assert!(
                is_delegation_output_tool(name),
                "{name} should count as delegation output"
            );
        }
    }

    #[test]
    fn select_subagent_model_is_virtual_but_not_delegation_output() {
        assert!(is_virtual_delegation_tool("select-subagent-model"));
        assert!(!is_delegation_output_tool("select-subagent-model"));
    }

    #[test]
    fn sql_predicate_lists_only_delegation_output_tools() {
        let pred = delegation_output_tool_name_sql_in_predicate();
        assert!(pred.contains("delegate-subagent"));
        assert!(pred.contains("orchestrate_subagents"));
        assert!(!pred.contains("select-subagent"));
        assert!(!pred.contains("select_subagent"));
    }
}