import io import sys from unittest.mock import patch from behave import given from behave import then from behave import when from cleveragents.agents.base import Agent from cleveragents.interactive.commands import execute_command from cleveragents.interactive.commands import format_help_text from cleveragents.interactive.commands import parse_command from cleveragents.interactive.session import InteractiveSession from cleveragents.routing.router import Router from cleveragents.templates.renderer import TemplateRenderer class MockAgent(Agent): async def process(self, message, context=None): return f"Response to: {message}" def get_capabilities(self): return ["mock"] @given("an interactive session is active") def step_impl(context): context.template_renderer = TemplateRenderer() agent = MockAgent("test_agent", {}, context.template_renderer) context.router = Router("test_router", {"agent": agent}, context.template_renderer) context.session = InteractiveSession( routers={"test_router": context.router}, initial_route_name="test_router" ) @when('I enter the "{command}" command') def step_impl(context, command): context.stdout = io.StringIO() with patch("sys.stdout", context.stdout): if command.startswith("/"): context.continue_session = context.session.process_command(command) else: context.parsed_command = parse_command(command) context.command_result = execute_command(context.parsed_command) @then("I should see the help information") def step_impl(context): output = context.stdout.getvalue() assert "Available Commands:" in output assert "/help" in output assert "/exit" in output @given("an interactive session with some history") def step_impl(context): context.template_renderer = TemplateRenderer() agent = MockAgent("test_agent", {}, context.template_renderer) context.router = Router("test_router", {"agent": agent}, context.template_renderer) context.session = InteractiveSession( routers={"test_router": context.router}, initial_route_name="test_router" ) context.session.add_to_history("user", "Hello") context.session.add_to_history("assistant", "Hi there!") @then("I should see the conversation history") def step_impl(context): output = context.stdout.getvalue() assert "You: Hello" in output assert "Agent: Hi there!" in output @then("the session should end") def step_impl(context): assert context.continue_session is False