Files
CoreRasurae bcce5dc42a
CI / lint (pull_request) Successful in 43s
CI / typecheck (pull_request) Successful in 47s
CI / security (pull_request) Successful in 46s
CI / quality (pull_request) Successful in 31s
CI / unit_tests (pull_request) Successful in 3m1s
CI / integration_tests (pull_request) Successful in 1m1s
CI / build (pull_request) Successful in 31s
CI / coverage (pull_request) Successful in 3m2s
CI / status-check (pull_request) Successful in 2s
CI / lint (push) Successful in 31s
CI / typecheck (push) Successful in 46s
CI / security (push) Successful in 47s
CI / quality (push) Successful in 30s
CI / unit_tests (push) Successful in 3m9s
CI / integration_tests (push) Successful in 1m7s
CI / build (push) Successful in 37s
CI / coverage (push) Successful in 3m11s
CI / status-check (push) Successful in 3s
fix(agents): validate tool name against declared tools list before dispatch
ISSUES CLOSED: #63
2026-06-30 12:06:05 +01:00

791 lines
26 KiB
Gherkin

Feature: ToolAgent Functionality
Scenario: Tool agent executes echo tool
Given a ToolAgent is configured with name "echo_tool_agent" and config
"""
{
"tools": ["echo"]
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: "echo hello world"
Then the result should be "hello world"
Scenario: Tool agent executes math tool with simple format
Given a ToolAgent is configured with name "math_tool_agent" and config
"""
{
"tools": ["math"]
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: "math 2+2*3"
Then the result should be "8"
Scenario: Tool agent executes math tool with JSON format
Given a ToolAgent is configured with name "math_tool_agent" and config
"""
{
"tools": ["math"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "math", "args": {"expression": "10 / 2"}}
"""
Then the result should be "5.0"
Scenario: Tool agent handles invalid math expression
Given a ToolAgent is configured with name "math_tool_agent" and config
"""
{
"tools": ["math"]
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: "math 1/0"
Then tool execution should fail with message containing "division by zero"
Scenario: Tool agent file write and read
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_tool_agent" and config
"""
{
"tools": ["file_write", "file_read"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "test.txt", "content": "hello from file"}}
"""
Then the tool result should contain "Successfully wrote"
When I process a JSON message with the ToolAgent:
"""
{"tool": "file_read", "args": {"file": "test.txt"}}
"""
Then the result should contain "hello from file"
Scenario: Tool agent file write requires unsafe mode
Given a ToolAgent is configured with name "file_tool_agent" and config
"""
{
"tools": ["file_write"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "test.txt", "content": "hello from file"}}
"""
Then tool execution should fail with message containing "File writing requires unsafe mode"
Scenario: Tool Agent shell command execution
Given I am running in unsafe mode
And a ToolAgent is configured with name "shell_tool_agent" and config
"""
{
"tools": ["/bin/echo"],
"allow_shell": true
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: "/bin/echo hello shell"
Then the result should be "hello shell"
Scenario: Tool Agent shell command execution fails for dangerous command
Given I am running in unsafe mode
And a ToolAgent is configured with name "shell_tool_agent" and config
"""
{
"tools": ["rm"],
"allow_shell": true,
"safe_mode": true
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: "rm -rf /"
Then tool execution should fail with message containing "Dangerous command 'rm' blocked in safe mode"
Scenario: Tool Agent validation fails for unknown tool
Given a ToolAgent is configured with name "bad_tool_agent" and config
"""
{
"tools": ["unknown_tool"],
"allow_shell": false
}
"""
When I try to create the ToolAgent
Then agent creation should fail with message containing "Unknown tool 'unknown_tool' and shell execution disabled"
Scenario: Tool Agent get capabilities and metadata
Given a ToolAgent is configured with name "meta_agent" and config
"""
{
"tools": ["echo", "math", "file_read", "file_write", "http_request"],
"allow_shell": true,
"safe_mode": false,
"timeout": 2
}
"""
When I create the ToolAgent
Then the agent capabilities should contain "tool-execution"
And the agent capabilities should contain "file-operations"
And the agent capabilities should contain "math-evaluation"
And the agent capabilities should contain "http-requests"
And the agent metadata "allow_shell" should be true
And the agent metadata "safe_mode" should be false
And the agent metadata "timeout" should be 2
Scenario: Tool Agent validation fails for invalid dict config
Given a ToolAgent is configured with name "bad_dict_tool_agent" and config
"""
{
"tools": [{"invalid": "config"}]
}
"""
When I try to create the ToolAgent
Then agent creation should fail with message containing "Tool configuration must include 'name'"
Scenario: Tool Agent fails for not allowed tool
Given a ToolAgent is configured with name "limited_tool_agent" and config
"""
{
"tools": ["math"]
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: "echo hello"
Then tool execution should fail with message containing "Tool 'echo' not in allowed tools list"
Scenario: Tool agent file read with unsafe path blocked
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_tool_agent" and config
"""
{
"tools": ["file_read"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_read", "args": {"file": "../unsafe.txt"}}
"""
Then tool execution should fail with message containing "Unsafe file path blocked in safe mode"
Scenario: Tool agent validates invalid tool configuration type
Given a ToolAgent is configured with name "invalid_tool_agent" and config
"""
{
"tools": [123]
}
"""
When I try to create the ToolAgent
Then agent creation should fail with message containing "Invalid tool configuration: 123"
Scenario: Tool agent handles empty tool request
Given a ToolAgent is configured with name "empty_tool_agent" and config
"""
{
"tools": ["echo"]
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: ""
Then tool execution should fail with message containing "Empty tool request"
Scenario: Tool agent handles invalid JSON in tool request
Given a ToolAgent is configured with name "json_tool_agent" and config
"""
{
"tools": ["echo"]
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: "{invalid json}"
Then tool execution should fail with message containing "Invalid JSON in tool request"
Scenario: Tool agent shell execution disabled during creation
Given a ToolAgent is configured with name "no_shell_agent" and config
"""
{
"tools": ["custom_command"],
"allow_shell": false
}
"""
When I try to create the ToolAgent
Then agent creation should fail with message containing "Unknown tool 'custom_command' and shell execution disabled"
Scenario: Tool agent shell execution disabled at runtime
Given a ToolAgent is configured with name "runtime_shell_agent" and config
"""
{
"tools": ["echo", "custom_runtime_command"],
"allow_shell": false
}
"""
When I try to create the ToolAgent
Then agent creation should fail with message containing "Unknown tool 'custom_runtime_command' and shell execution disabled"
Scenario: Tool agent shell command timeout
Given I am running in unsafe mode
And a ToolAgent is configured with name "timeout_agent" and config
"""
{
"tools": ["sleep"],
"allow_shell": true,
"timeout": 0.1,
"safe_mode": false
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: "sleep 1"
Then tool execution should fail with message containing "timed out after 0.1 seconds"
Scenario: Tool agent shell command with non-zero exit code
Given I am running in unsafe mode
And a ToolAgent is configured with name "error_command_agent" and config
"""
{
"tools": ["false"],
"allow_shell": true,
"safe_mode": false
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: "false"
Then tool execution should fail with message containing "Command failed with code 1"
Scenario: Tool agent echo tool with args format
Given a ToolAgent is configured with name "echo_args_agent" and config
"""
{
"tools": ["echo"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "echo", "args": {"args": ["hello", "from", "args"]}}
"""
Then the result should be "hello from args"
Scenario: Tool agent math tool requires expression
Given a ToolAgent is configured with name "math_empty_agent" and config
"""
{
"tools": ["math"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "math", "args": {}}
"""
Then tool execution should fail with message containing "Math tool requires an expression"
Scenario: Tool agent json_parse tool basic usage
Given a ToolAgent is configured with name "json_parse_agent" and config
"""
{
"tools": ["json_parse"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "json_parse", "args": {"json": "{\"key\": \"value\"}"}}
"""
Then the tool result should contain "key"
And the tool result should contain "value"
Scenario: Tool agent json_parse tool with args format
Given a ToolAgent is configured with name "json_parse_args_agent" and config
"""
{
"tools": ["json_parse"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "json_parse", "args": {"args": ["{\"test\": 123}"]}}
"""
Then the tool result should contain "test"
And the tool result should contain "123"
Scenario: Tool agent json_parse tool with invalid JSON
Given a ToolAgent is configured with name "json_parse_invalid_agent" and config
"""
{
"tools": ["json_parse"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "json_parse", "args": {"json": "invalid json"}}
"""
Then tool execution should fail with message containing "JSON parsing failed"
Scenario: Tool agent http_request tool basic usage
Given a ToolAgent is configured with name "http_agent" and config
"""
{
"tools": ["http_request"],
"timeout": 5
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "http_request", "args": {"url": "https://httpbin.org/get", "method": "GET"}}
"""
Then the tool result should contain "Status: 200"
Scenario: Tool agent http_request tool requires URL
Given a ToolAgent is configured with name "http_no_url_agent" and config
"""
{
"tools": ["http_request"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "http_request", "args": {}}
"""
Then tool execution should fail with message containing "HTTP tool requires a URL"
Scenario: Tool agent http_request tool with POST data
Given a ToolAgent is configured with name "http_post_agent" and config
"""
{
"tools": ["http_request"],
"timeout": 5
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "http_request", "args": {"url": "https://httpbin.org/post", "method": "POST", "data": {"test": "data"}, "headers": {"Content-Type": "application/json"}}}
"""
Then the tool result should contain "Status: 200"
Scenario: Tool agent file_read tool requires file path
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_read_no_path_agent" and config
"""
{
"tools": ["file_read"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_read", "args": {}}
"""
Then tool execution should fail with message containing "File read tool requires a file path"
Scenario: Tool agent file_read tool with args format
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_read_args_agent" and config
"""
{
"tools": ["file_read"]
}
"""
When I create the ToolAgent
And I create a test file with content "test file content"
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_read", "args": {"args": ["test_file.txt"]}}
"""
Then the result should contain "test file content"
Scenario: Tool agent file_read tool with absolute path in safe mode
Given a ToolAgent is configured with name "file_read_abs_path_agent" and config
"""
{
"tools": ["file_read"],
"safe_mode": true
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_read", "args": {"file": "/etc/passwd"}}
"""
Then tool execution should fail with message containing "Unsafe file path blocked in safe mode"
Scenario: Tool agent file_read tool with absolute path in unsafe context
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_read_abs_unsafe_agent" and config
"""
{
"tools": ["file_read"],
"safe_mode": true
}
"""
When I create the ToolAgent
And I create an absolute test file with content "absolute file content"
And I process a JSON message with unsafe context with the ToolAgent:
"""
{"tool": "file_read", "args": {"file": "/tmp/test_abs_file.txt"}}
"""
Then the result should contain "absolute file content"
Scenario: Tool agent file_read tool with file not found
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_read_not_found_agent" and config
"""
{
"tools": ["file_read"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_read", "args": {"file": "nonexistent.txt"}}
"""
Then tool execution should fail with message containing "File not found"
Scenario: Tool agent file_write tool requires file path and content
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_write_no_args_agent" and config
"""
{
"tools": ["file_write"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "test.txt"}}
"""
Then tool execution should fail with message containing "File write tool requires file path and content"
Scenario: Tool agent file_write tool with absolute path in safe mode
Given a ToolAgent is configured with name "file_write_abs_path_agent" and config
"""
{
"tools": ["file_write"],
"safe_mode": true
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "/tmp/test.txt", "content": "test"}}
"""
Then tool execution should fail with message containing "File writing requires unsafe mode"
Scenario: Tool agent file_write tool with directory traversal blocked
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_write_traversal_agent" and config
"""
{
"tools": ["file_write"],
"safe_mode": true
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "../test.txt", "content": "test"}}
"""
Then tool execution should fail with message containing "Unsafe file path blocked in safe mode"
Scenario: Tool agent file_write tool with write error
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_write_error_agent" and config
"""
{
"tools": ["file_write"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "/invalid/path/file.txt", "content": "test"}}
"""
Then tool execution should fail with message containing "File write failed"
Scenario: Tool agent capabilities with dict tool configuration
Given a ToolAgent is configured with name "dict_tools_agent" and config
"""
{
"tools": [{"name": "http_request"}, {"name": "file_read"}]
}
"""
When I create the ToolAgent
Then the agent capabilities should contain "http-requests"
And the agent capabilities should contain "file-operations"
Scenario: Tool agent http_request tool timeout error
Given a ToolAgent is configured with name "http_timeout_agent" and config
"""
{
"tools": ["http_request"],
"timeout": 0.001
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "http_request", "args": {"url": "https://httpbin.org/delay/1", "method": "GET"}}
"""
Then tool execution should fail with message containing "HTTP request failed"
Scenario: Tool agent http_request tool with invalid URL
Given a ToolAgent is configured with name "http_invalid_agent" and config
"""
{
"tools": ["http_request"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "http_request", "args": {"url": "invalid://url", "method": "GET"}}
"""
Then tool execution should fail with message containing "HTTP request failed"
Scenario: Tool agent math tool with args format
Given a ToolAgent is configured with name "math_args_agent" and config
"""
{
"tools": ["math"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "math", "args": {"args": ["2*3+1"]}}
"""
Then the result should be "7"
Scenario: Tool agent echo tool with text parameter
Given a ToolAgent is configured with name "echo_text_agent" and config
"""
{
"tools": ["echo"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "echo", "args": {"text": "hello text param"}}
"""
Then the result should be "hello text param"
Scenario: Tool agent shell safe mode blocking
Given I am running in unsafe mode
And a ToolAgent is configured with name "safe_shell_agent" and config
"""
{
"tools": ["rm"],
"allow_shell": true,
"safe_mode": true
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: "rm -rf test"
Then tool execution should fail with message containing "Dangerous command 'rm' blocked in safe mode"
Scenario: Tool agent with dict tool config validation
Given a ToolAgent is configured with name "dict_config_agent" and config
"""
{
"tools": [{"name": "echo", "description": "echo tool"}]
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: "echo hello dict"
Then the result should be "hello dict"
Scenario: Tool agent file write append mode
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_write_append_agent" and config
"""
{
"tools": ["file_write", "file_read"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "test_append.txt", "content": "initial content", "mode": "w"}}
"""
Then the tool result should contain "Successfully wrote"
When I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "test_append.txt", "content": " appended content", "mode": "a"}}
"""
Then the tool result should contain "Successfully appended"
When I process a JSON message with the ToolAgent:
"""
{"tool": "file_read", "args": {"file": "test_append.txt"}}
"""
Then the result should contain "initial content appended content"
Scenario: Tool agent file write insert mode at end
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_write_insert_agent" and config
"""
{
"tools": ["file_write", "file_read"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "test_insert.txt", "content": "line1\nline2\nline3", "mode": "w"}}
"""
Then the tool result should contain "Successfully wrote"
When I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "test_insert.txt", "content": "inserted line", "mode": "insert", "position": "end"}}
"""
Then the tool result should contain "Successfully inserted"
When I process a JSON message with the ToolAgent:
"""
{"tool": "file_read", "args": {"file": "test_insert.txt"}}
"""
Then the result should contain "inserted line"
Scenario: Tool agent file write insert mode at start
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_write_insert_start_agent" and config
"""
{
"tools": ["file_write", "file_read"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "test_insert_start.txt", "content": "original line", "mode": "w"}}
"""
Then the tool result should contain "Successfully wrote"
When I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "test_insert_start.txt", "content": "first line", "mode": "insert", "position": "start"}}
"""
Then the tool result should contain "Successfully inserted"
When I process a JSON message with the ToolAgent:
"""
{"tool": "file_read", "args": {"file": "test_insert_start.txt"}}
"""
Then the result should contain "first line"
Scenario: Tool agent file write insert mode at specific line
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_write_insert_line_agent" and config
"""
{
"tools": ["file_write", "file_read"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "test_insert_line.txt", "content": "line1\nline2\nline3", "mode": "w"}}
"""
Then the tool result should contain "Successfully wrote"
When I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "test_insert_line.txt", "content": "middle line", "mode": "insert", "position": 2}}
"""
Then the tool result should contain "Successfully inserted"
When I process a JSON message with the ToolAgent:
"""
{"tool": "file_read", "args": {"file": "test_insert_line.txt"}}
"""
Then the result should contain "middle line"
Scenario: Tool agent file write invalid mode
Given I am running in unsafe mode
And a ToolAgent is configured with name "file_write_invalid_mode_agent" and config
"""
{
"tools": ["file_write"]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_write", "args": {"file": "test.txt", "content": "test", "mode": "invalid"}}
"""
Then tool execution should fail with message containing "Invalid mode"
# ── ToolAgent dict-style tool name dispatch fix (issue #63) ──────────
Scenario: Tool agent with dict-style tools rejects unauthorized tool
Given a ToolAgent is configured with name "dict_tool_agent" and config
"""
{
"tools": [{"name": "echo"}]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_read", "args": {"file": "test.txt"}}
"""
Then tool execution should fail with message containing "not in allowed tools list"
Scenario: Tool agent with dict-style tools accepts authorized tool
Given a ToolAgent is configured with name "dict_echo_agent" and config
"""
{
"tools": [{"name": "echo"}]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "echo", "args": {"text": "dict works"}}
"""
Then the result should be "dict works"
Scenario: Tool agent with mixed string and dict tools rejects unauthorized
Given a ToolAgent is configured with name "mixed_tool_agent" and config
"""
{
"tools": ["echo", {"name": "math"}]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "file_read", "args": {"file": "test.txt"}}
"""
Then tool execution should fail with message containing "not in allowed tools list"
Scenario: Tool agent with mixed string and dict tools accepts authorized string tool
Given a ToolAgent is configured with name "mixed_echo_agent" and config
"""
{
"tools": ["echo", {"name": "math"}]
}
"""
When I create the ToolAgent
And I process a message with the ToolAgent: "echo works with mixed"
Then the result should be "works with mixed"
Scenario: Tool agent with mixed string and dict tools accepts authorized dict tool
Given a ToolAgent is configured with name "mixed_math_agent" and config
"""
{
"tools": ["echo", {"name": "math"}]
}
"""
When I create the ToolAgent
And I process a JSON message with the ToolAgent:
"""
{"tool": "math", "args": {"expression": "40+2"}}
"""
Then the result should be "42"