agent-block 0.30.0

Lua-first Agent Runtime built on AgentMesh
mod common;

use predicates::prelude::*;
use tempfile::tempdir;

#[test]
fn build_tools_mcp_group_filter() {
    let tmp = tempdir().expect("tempdir");
    common::agent_block_cmd()
        .env("AGENT_BLOCK_HOME", tmp.path())
        .args(["-s", &common::fixture("build_tools_mcp_group.lua")])
        .assert()
        .success()
        .stdout(
            predicate::str::contains("case1.outline_included=true")
                .and(predicate::str::contains("case1.search_excluded=true"))
                .and(predicate::str::contains("case2.search_included=true"))
                .and(predicate::str::contains("case2.outline_excluded=true"))
                .and(predicate::str::contains(
                    "case3.all_tools_count=2_expected=2",
                ))
                .and(predicate::str::contains("case4.mcp_not_in_default=true"))
                .and(predicate::str::contains(
                    "case5.group_not_in_emitted_def=true",
                )),
        );
}

#[test]
fn build_tools_extra_flatten() {
    let tmp = tempdir().expect("tempdir");
    common::agent_block_cmd()
        .env("AGENT_BLOCK_HOME", tmp.path())
        .args(["-s", &common::fixture("build_tools_extra.lua")])
        .assert()
        .success()
        .stdout(
            predicate::str::contains("nested.name=nested_x")
                .and(predicate::str::contains("nested.description=nested desc"))
                .and(predicate::str::contains("nested.handler=nil"))
                .and(predicate::str::contains("nested.schema=nil"))
                .and(predicate::str::contains("flat.name=flat_y"))
                .and(predicate::str::contains("flat.description=flat desc"))
                .and(predicate::str::contains("nested.group=nil"))
                .and(predicate::str::contains("flat.group=nil")),
        );
}

#[test]
fn compile_loop_make_default_dedup() {
    let tmp = tempdir().expect("tempdir");
    common::agent_block_cmd()
        .env("AGENT_BLOCK_HOME", tmp.path())
        .args(["-s", &common::fixture("build_tools_dedup.lua")])
        .assert()
        .success()
        .stdout(predicate::str::contains("dedup=ok"));
}

#[test]
fn dispatch_extra_tools_via_registry() {
    let tmp = tempdir().expect("tempdir");
    common::agent_block_cmd()
        .env("AGENT_BLOCK_HOME", tmp.path())
        .args(["-s", &common::fixture("dispatch_extra_tools.lua")])
        .assert()
        .success()
        .stdout(predicate::str::contains("dispatch=ok"));
}

#[test]
fn resolve_mcp_group_priority() {
    let tmp = tempdir().expect("tempdir");
    common::agent_block_cmd()
        .env("AGENT_BLOCK_HOME", tmp.path())
        .args(["-s", &common::fixture("resolve_mcp_group.lua")])
        .assert()
        .success()
        .stdout(
            predicate::str::contains("case1._meta.group_wins=true")
                .and(predicate::str::contains("case2.no_meta_fallback=true"))
                .and(predicate::str::contains("case3.empty_group_fallback=true"))
                .and(predicate::str::contains("case4.number_group_fallback=true"))
                .and(predicate::str::contains("case5.table_group_fallback=true"))
                .and(predicate::str::contains("case6.no_group_key_fallback=true"))
                .and(predicate::str::contains(
                    "case7.meta_group_used_for_filtering=true",
                )),
        );
}