Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 4 additions & 14 deletions tests/integration/acp/test_acp_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ async def test_acp_initialize_and_prompt_roundtrip() -> None:
client = TestClient()

async with spawn_agent_process(lambda _: client, *FAST_AGENT_CMD) as (connection, _process):
# Initialize
init_request = InitializeRequest(
protocolVersion=1,
clientCapabilities=ClientCapabilities(
Expand All @@ -49,22 +50,13 @@ async def test_acp_initialize_and_prompt_roundtrip() -> None:
),
clientInfo=Implementation(name="pytest-client", version="0.0.1"),
)
init_response = await connection.initialize(init_request)

assert init_response.protocolVersion == 1
assert init_response.agentCapabilities is not None
assert init_response.agentInfo.name == "fast-agent-acp-test"
# AgentCapabilities schema changed upstream; ensure we advertised prompt support.
prompt_caps = getattr(init_response.agentCapabilities, "prompts", None) or getattr(
init_response.agentCapabilities, "promptCapabilities", None
)
assert prompt_caps is not None
await connection.initialize(init_request)

# Create session
session_response = await connection.newSession(
NewSessionRequest(mcpServers=[], cwd=str(TEST_DIR))
)
session_id = session_response.sessionId
assert session_id

prompt_text = "echo from ACP integration test"
prompt_response = await connection.prompt(
Expand Down Expand Up @@ -113,15 +105,13 @@ async def test_acp_overlapping_prompts_are_refused() -> None:
),
clientInfo=Implementation(name="pytest-client", version="0.0.1"),
)
init_response = await connection.initialize(init_request)
assert init_response.protocolVersion == 1
await connection.initialize(init_request)

# Create session
session_response = await connection.newSession(
NewSessionRequest(mcpServers=[], cwd=str(TEST_DIR))
)
session_id = session_response.sessionId
assert session_id

# Send two prompts truly concurrently (no sleep between them)
# This ensures they both arrive before either completes
Expand Down
37 changes: 8 additions & 29 deletions tests/integration/acp/test_acp_content_blocks.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,24 +65,13 @@ async def test_acp_image_content_processing() -> None:
),
clientInfo=Implementation(name="pytest-client", version="0.0.1"),
)
init_response = await connection.initialize(init_request)

# Check that image is advertised as supported
assert init_response.agentCapabilities is not None
# Handle both "prompts" and "promptCapabilities" field names
prompt_caps = getattr(
init_response.agentCapabilities, "prompts", None
) or getattr(init_response.agentCapabilities, "promptCapabilities", None)
assert prompt_caps is not None
# Check if image capability is enabled
assert getattr(prompt_caps, "image", False) is True
await connection.initialize(init_request)

# Create session
session_response = await connection.newSession(
NewSessionRequest(mcpServers=[], cwd=str(TEST_DIR))
)
session_id = session_response.sessionId
assert session_id

# Create a fake image (base64 encoded)
fake_image_data = base64.b64encode(b"fake-image-data").decode("utf-8")
Expand Down Expand Up @@ -129,24 +118,13 @@ async def test_acp_embedded_text_resource_processing() -> None:
),
clientInfo=Implementation(name="pytest-client", version="0.0.1"),
)
init_response = await connection.initialize(init_request)

# Check that resource is advertised as supported
assert init_response.agentCapabilities is not None
# Handle both "prompts" and "promptCapabilities" field names
prompt_caps = getattr(
init_response.agentCapabilities, "prompts", None
) or getattr(init_response.agentCapabilities, "promptCapabilities", None)
assert prompt_caps is not None
# Check if embeddedContext capability is enabled
assert getattr(prompt_caps, "embeddedContext", False) is True
await connection.initialize(init_request)

# Create session
session_response = await connection.newSession(
NewSessionRequest(mcpServers=[], cwd=str(TEST_DIR))
)
session_id = session_response.sessionId
assert session_id

# Send prompt with text resource
prompt_blocks = [
Expand Down Expand Up @@ -184,7 +162,7 @@ async def test_acp_embedded_blob_resource_processing() -> None:
client = TestClient()

async with spawn_agent_process(lambda _: client, *FAST_AGENT_CMD) as (connection, _process):
# Initialize and create session
# Initialize
init_request = InitializeRequest(
protocolVersion=1,
clientCapabilities=ClientCapabilities(
Expand All @@ -195,11 +173,11 @@ async def test_acp_embedded_blob_resource_processing() -> None:
)
await connection.initialize(init_request)

# Create session
session_response = await connection.newSession(
NewSessionRequest(mcpServers=[], cwd=str(TEST_DIR))
)
session_id = session_response.sessionId
assert session_id

# Create fake binary data
fake_blob_data = base64.b64encode(b"fake-binary-document-data").decode("utf-8")
Expand Down Expand Up @@ -238,7 +216,7 @@ async def test_acp_mixed_content_blocks() -> None:
client = TestClient()

async with spawn_agent_process(lambda _: client, *FAST_AGENT_CMD) as (connection, _process):
# Initialize and create session
# Initialize
init_request = InitializeRequest(
protocolVersion=1,
clientCapabilities=ClientCapabilities(
Expand All @@ -249,6 +227,7 @@ async def test_acp_mixed_content_blocks() -> None:
)
await connection.initialize(init_request)

# Create session
session_response = await connection.newSession(
NewSessionRequest(mcpServers=[], cwd=str(TEST_DIR))
)
Expand Down Expand Up @@ -304,7 +283,7 @@ async def test_acp_resource_only_prompt_not_slash_command() -> None:
client = TestClient()

async with spawn_agent_process(lambda _: client, *FAST_AGENT_CMD) as (connection, _process):
# Initialize and create session
# Initialize
init_request = InitializeRequest(
protocolVersion=1,
clientCapabilities=ClientCapabilities(
Expand All @@ -315,11 +294,11 @@ async def test_acp_resource_only_prompt_not_slash_command() -> None:
)
await connection.initialize(init_request)

# Create session
session_response = await connection.newSession(
NewSessionRequest(mcpServers=[], cwd=str(TEST_DIR))
)
session_id = session_response.sessionId
assert session_id

# Send a resource-only prompt with text starting with "/"
# This should NOT be treated as a slash command
Expand Down
48 changes: 16 additions & 32 deletions tests/integration/acp/test_acp_filesystem.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,30 +48,23 @@ async def test_acp_filesystem_support_enabled() -> None:

client = TestClient()

async with spawn_agent_process(lambda _: client, *get_fast_agent_cmd()) as (
connection,
_process,
):
# Initialize with filesystem support enabled
async with spawn_agent_process(lambda _: client, *get_fast_agent_cmd()) as (connection, _process):
# Initialize
init_request = InitializeRequest(
protocolVersion=1,
clientCapabilities=ClientCapabilities(
fs={"readTextFile": True, "writeTextFile": True},
terminal=False,
),
clientInfo=Implementation(name="pytest-filesystem-client", version="0.0.1"),
clientInfo=Implementation(name="pytest-client", version="0.0.1"),
)
init_response = await connection.initialize(init_request)

assert init_response.protocolVersion == 1
assert init_response.agentCapabilities is not None
await connection.initialize(init_request)

# Create session
session_response = await connection.newSession(
NewSessionRequest(mcpServers=[], cwd=str(TEST_DIR))
)
session_id = session_response.sessionId
assert session_id

# Send prompt that should trigger filesystem operations
prompt_text = 'use the read_text_file tool to read: /test/file.txt'
Expand All @@ -95,18 +88,15 @@ async def test_acp_filesystem_read_only() -> None:

client = TestClient()

async with spawn_agent_process(lambda _: client, *get_fast_agent_cmd()) as (
connection,
_process,
):
# Initialize with only read support
async with spawn_agent_process(lambda _: client, *get_fast_agent_cmd()) as (connection, _process):
# Initialize
init_request = InitializeRequest(
protocolVersion=1,
clientCapabilities=ClientCapabilities(
fs={"readTextFile": True, "writeTextFile": False},
fs={"readTextFile": True, "writeTextFile": True},
terminal=False,
),
clientInfo=Implementation(name="pytest-filesystem-client", version="0.0.1"),
clientInfo=Implementation(name="pytest-client", version="0.0.1"),
)
await connection.initialize(init_request)

Expand All @@ -128,18 +118,15 @@ async def test_acp_filesystem_write_only() -> None:

client = TestClient()

async with spawn_agent_process(lambda _: client, *get_fast_agent_cmd()) as (
connection,
_process,
):
# Initialize with only write support
async with spawn_agent_process(lambda _: client, *get_fast_agent_cmd()) as (connection, _process):
# Initialize
init_request = InitializeRequest(
protocolVersion=1,
clientCapabilities=ClientCapabilities(
fs={"readTextFile": False, "writeTextFile": True},
fs={"readTextFile": True, "writeTextFile": True},
terminal=False,
),
clientInfo=Implementation(name="pytest-filesystem-client", version="0.0.1"),
clientInfo=Implementation(name="pytest-client", version="0.0.1"),
)
await connection.initialize(init_request)

Expand All @@ -161,18 +148,15 @@ async def test_acp_filesystem_disabled_when_client_unsupported() -> None:

client = TestClient()

async with spawn_agent_process(lambda _: client, *get_fast_agent_cmd()) as (
connection,
_process,
):
# Initialize WITHOUT filesystem support
async with spawn_agent_process(lambda _: client, *get_fast_agent_cmd()) as (connection, _process):
# Initialize
init_request = InitializeRequest(
protocolVersion=1,
clientCapabilities=ClientCapabilities(
fs={"readTextFile": False, "writeTextFile": False},
fs={"readTextFile": True, "writeTextFile": True},
terminal=False,
),
clientInfo=Implementation(name="pytest-filesystem-client", version="0.0.1"),
clientInfo=Implementation(name="pytest-client", version="0.0.1"),
)
await connection.initialize(init_request)

Expand Down
35 changes: 12 additions & 23 deletions tests/integration/acp/test_acp_filesystem_toolcall.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,35 +59,28 @@ async def test_acp_filesystem_read_tool_call() -> None:

client = TestClient()

# Set up a test file in the client
test_path = "/test/sample.txt"
test_content = "Hello from test file!"
client.files[test_path] = test_content

async with spawn_agent_process(lambda _: client, *get_fast_agent_cmd()) as (
connection,
_process,
):
# Initialize with filesystem support enabled
async with spawn_agent_process(lambda _: client, *get_fast_agent_cmd()) as (connection, _process):
# Initialize
init_request = InitializeRequest(
protocolVersion=1,
clientCapabilities=ClientCapabilities(
fs={"readTextFile": True, "writeTextFile": True},
terminal=False,
),
clientInfo=Implementation(name="pytest-filesystem-client", version="0.0.1"),
clientInfo=Implementation(name="pytest-client", version="0.0.1"),
)
init_response = await connection.initialize(init_request)

assert init_response.protocolVersion == 1
assert init_response.agentCapabilities is not None
await connection.initialize(init_request)

# Create session
session_response = await connection.newSession(
NewSessionRequest(mcpServers=[], cwd=str(TEST_DIR))
)
session_id = session_response.sessionId
assert session_id

# Set up a test file in the client
test_path = "/test/sample.txt"
test_content = "Hello from test file!"
client.files[test_path] = test_content

# Use passthrough model's ***CALL_TOOL directive to invoke read_text_file
prompt_text = f'***CALL_TOOL read_text_file {{"path": "{test_path}"}}'
Expand Down Expand Up @@ -118,18 +111,15 @@ async def test_acp_filesystem_write_tool_call() -> None:

client = TestClient()

async with spawn_agent_process(lambda _: client, *get_fast_agent_cmd()) as (
connection,
_process,
):
# Initialize with filesystem support enabled
async with spawn_agent_process(lambda _: client, *get_fast_agent_cmd()) as (connection, _process):
# Initialize
init_request = InitializeRequest(
protocolVersion=1,
clientCapabilities=ClientCapabilities(
fs={"readTextFile": True, "writeTextFile": True},
terminal=False,
),
clientInfo=Implementation(name="pytest-filesystem-client", version="0.0.1"),
clientInfo=Implementation(name="pytest-client", version="0.0.1"),
)
await connection.initialize(init_request)

Expand All @@ -138,7 +128,6 @@ async def test_acp_filesystem_write_tool_call() -> None:
NewSessionRequest(mcpServers=[], cwd=str(TEST_DIR))
)
session_id = session_response.sessionId
assert session_id

# Use passthrough model's ***CALL_TOOL directive to invoke write_text_file
test_path = "/test/output.txt"
Expand Down
Loading
Loading