ironclad-api 0.9.8

HTTP routes, WebSocket, auth, rate limiting, and dashboard for the Ironclad agent runtime
Documentation
pub(super) fn requests_execution(prompt: &str) -> bool {
    let lower = prompt.to_ascii_lowercase();
    [
        " run ",
        " execute ",
        " use a tool",
        "use the tool",
        "tools you can use",
        "pick one at random",
        "introspection tool",
        "introspection skill",
        "introspect",
        "list entries",
        "list files",
        "file distribution",
        "schedule a cron",
        "schedule cron",
        "create cron",
        "order a subagent",
        "delegate",
        "orchestrate",
        "ls ",
        "/status",
    ]
    .iter()
    .any(|m| lower.contains(m))
}

pub(super) fn requests_delegation(prompt: &str) -> bool {
    let lower = prompt.to_ascii_lowercase();
    if lower.contains("delegate") || lower.contains("orchestrate") {
        return true;
    }
    if lower.contains("assign") && (lower.contains("subagent") || lower.contains("sub agent")) {
        return true;
    }
    (lower.contains("subagent") || lower.contains("sub agent"))
        && (lower.contains("order")
            || lower.contains("ask")
            || lower.contains("task")
            || lower.contains("run ")
            || lower.contains("to a subagent")
            || lower.contains("to a sub agent")
            || lower.contains("to the subagent")
            || lower.contains("to the sub agent"))
}

pub(super) fn requests_cron(prompt: &str) -> bool {
    let lower = prompt.to_ascii_lowercase();
    lower.contains("cron") || (lower.contains("schedule") && lower.contains("minute"))
}

pub(super) fn requests_file_distribution(prompt: &str) -> bool {
    let lower = prompt.to_ascii_lowercase();
    lower.contains("file distribution")
}

pub(super) fn requests_current_events(prompt: &str) -> bool {
    let lower = prompt.to_ascii_lowercase();
    [
        "geopolitical situation",
        "geopolitical",
        "geo political",
        "geopolitical sitrep",
        "sitrep",
        "current events",
        "latest news",
        "what's happening",
        "what is happening",
        "goings on",
        "going on in the",
        "what does the",
        "today's",
        "as of today",
    ]
    .iter()
    .any(|m| lower.contains(m))
}

pub(super) fn requests_introspection(prompt: &str) -> bool {
    let lower = prompt.to_ascii_lowercase();
    [
        "introspection tool",
        "introspection skill",
        "introspect",
        "what tools can you use",
        "what tools do you have",
        "available tools",
        "subagent functionality",
        "current subagent functionality",
        "summarize the results",
        "summarize introspection",
    ]
    .iter()
    .any(|m| lower.contains(m))
}

pub(super) fn requests_acknowledgement(prompt: &str) -> bool {
    let lower = prompt.to_ascii_lowercase();
    (lower.contains("acknowledge") || lower.contains("acknowledg"))
        && (lower.contains("one sentence") || lower.contains("then wait"))
}

pub(super) fn requests_provider_inventory(prompt: &str) -> bool {
    let lower = prompt.to_ascii_lowercase();
    lower.contains("which llm providers")
        || lower.contains("what llm providers")
        || lower.contains("which providers")
        || lower.contains("what providers")
}

pub(super) fn requests_personality_profile(prompt: &str) -> bool {
    let lower = prompt.to_ascii_lowercase();
    (lower.contains("personality") && (lower.contains("your") || lower.contains("you")))
        || lower.contains("who are you")
}

pub(super) fn requests_capability_summary(prompt: &str) -> bool {
    let lower = prompt.to_ascii_lowercase();
    lower.contains("what are you able to do")
        || lower.contains("what can you do")
        || lower.contains("what are you able")
        || lower.contains("what can you help")
}

pub(super) fn requests_obsidian_insights(prompt: &str) -> bool {
    let lower = prompt.to_ascii_lowercase();
    let mentions_vault = lower.contains("obsidian") || lower.contains("vault");
    let asks_for_summary = lower.contains("insight")
        || lower.contains("summary")
        || lower.contains("summarize")
        || lower.contains("what")
        || lower.contains("say about")
        || lower.contains("status");
    mentions_vault && asks_for_summary
}

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

    #[test]
    fn execution_markers_cover_shortcut_and_guard_triggers() {
        assert!(requests_execution(
            "tell me about the tools you can use, pick one at random, and use it"
        ));
        assert!(requests_execution("/status"));
        assert!(requests_execution("please execute ls /tmp"));
    }

    #[test]
    fn delegation_and_cron_markers_match_expected_prompts() {
        assert!(requests_delegation("order a subagent to do this"));
        assert!(requests_delegation("ask the sub agent to do this"));
        assert!(!requests_delegation(
            "use your introspection tool to discover current subagent functionality"
        ));
        assert!(requests_cron("schedule a cron job every 5 minute"));
    }

    #[test]
    fn current_events_markers_match_expected_prompts() {
        assert!(requests_current_events(
            "What's the geopolitical situation?"
        ));
        assert!(requests_current_events("Give me a geopolitical sitrep"));
        assert!(requests_current_events(
            "What does the geo political sub agent say about goings on in the US?"
        ));
        assert!(requests_current_events("What are today's current events?"));
    }

    #[test]
    fn introspection_markers_match_expected_prompts() {
        assert!(requests_introspection(
            "I want you to use your introspection skill"
        ));
        assert!(requests_introspection(
            "use your introspection tool to discover current subagent functionality"
        ));
        assert!(requests_introspection("what tools do you have available?"));
    }

    #[test]
    fn acknowledgement_markers_match_expected_prompts() {
        assert!(requests_acknowledgement(
            "Good evening Duncan. Acknowledge this request in one sentence, then wait."
        ));
        assert!(requests_acknowledgement(
            "acknowledge this in one sentence and then wait for my next command"
        ));
        assert!(!requests_acknowledgement("please acknowledge receipt"));
    }

    #[test]
    fn provider_inventory_markers_match_expected_prompts() {
        assert!(requests_provider_inventory("which llm providers?"));
        assert!(requests_provider_inventory("what providers are configured"));
        assert!(!requests_provider_inventory("what model are you using"));
    }

    #[test]
    fn personality_and_capability_markers_match_expected_prompts() {
        assert!(requests_personality_profile(
            "Tell me about your personality"
        ));
        assert!(requests_personality_profile("who are you"));
        assert!(requests_capability_summary(
            "Duncan, what are you able to do for me right now?"
        ));
    }

    #[test]
    fn obsidian_insight_markers_match_expected_prompts() {
        assert!(requests_obsidian_insights(
            "Any insights you care to draw from the obsidian vault?"
        ));
        assert!(requests_obsidian_insights("summarize my vault"));
        assert!(!requests_obsidian_insights("vault token price"));
    }
}