decodingtrust-agent-sdk 0.2.3__tar.gz → 0.2.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {decodingtrust_agent_sdk-0.2.3/decodingtrust_agent_sdk.egg-info → decodingtrust_agent_sdk-0.2.6}/PKG-INFO +1 -1
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/src/agent.py +18 -1
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6/decodingtrust_agent_sdk.egg-info}/PKG-INFO +1 -1
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/decodingtrust_agent_sdk.egg-info/SOURCES.txt +4 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/config/env.yaml +104 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/config/injection_mcp.yaml +34 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/whatsapp/docker-compose-hub.yml +7 -9
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/gmail/main.py +289 -17
- decodingtrust_agent_sdk-0.2.6/dt_arena/utils/chase/helpers.py +84 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/cs_env_client.py +42 -22
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/helpers.py +7 -1
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/bulk_destructive.py +10 -4
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/cross_customer.py +29 -6
- decodingtrust_agent_sdk-0.2.6/dt_arena/utils/robinhood/helpers.py +98 -0
- decodingtrust_agent_sdk-0.2.6/dt_arena/utils/whatsapp/__init__.py +0 -0
- decodingtrust_agent_sdk-0.2.6/dt_arena/utils/windows/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/eval/evaluation.py +48 -17
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/pyproject.toml +1 -1
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/LICENSE +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/MANIFEST.in +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/README.md +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/example.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/src/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/src/mcp_proxy.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/src/utils.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/googleadk/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/googleadk/example.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/googleadk/src/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/googleadk/src/agent.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/googleadk/src/mcp_wrapper.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/googleadk/src/utils.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/example.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/src/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/src/agent.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/src/hermes_runner.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/src/mcp_proxy.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/src/utils.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/langchain/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/langchain/example.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/langchain/src/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/langchain/src/agent.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/langchain/src/utils.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/example.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/src/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/src/agent.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/src/agent_wrapper.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/src/mcp_wrapper.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/src/utils.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/example.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/agent.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/helpers/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/helpers/auth_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/mcp_proxy.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/plugin_generator.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/utils.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/example.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/prompts/react_agent.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/agent.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/agent_wrapper.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/async_helper.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/mcp_react_agent.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/native_agent.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/nodes.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/strands/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/strands/example.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/strands/src/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/strands/src/agent.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/strands/src/utils.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/browser/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/browser/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/browser/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/code/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/code/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/code/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/crm/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/crm/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/crm/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/customer-service/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/customer-service/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/customer-service/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/finance/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/finance/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/finance/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/legal/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/legal/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/legal/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/macos/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/macos/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/macos/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/medical/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/medical/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/medical/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/os-filesystem/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/os-filesystem/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/os-filesystem/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/research/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/research/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/research/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/telecom/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/telecom/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/telecom/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/travel/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/travel/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/travel/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/windows/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/windows/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/windows/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/workflow/benign.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/workflow/direct.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/workflow/indirect.jsonl +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/cli/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/cli/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/cli/scaffold.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/decodingtrust_agent_sdk.egg-info/dependency_links.txt +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/decodingtrust_agent_sdk.egg-info/entry_points.txt +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/decodingtrust_agent_sdk.egg-info/requires.txt +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/decodingtrust_agent_sdk.egg-info/top_level.txt +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/a2a_agents/generic/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/a2a_agents/generic/agent.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/config/mcp.yaml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/arxiv/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/arxiv/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/atlassian/docker/docker-compose.dev.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/atlassian/docker/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/atlassian/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/atlassian/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/bigquery/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/booking/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/calendar/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/calendar/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/custom-website/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/customer_service/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/databricks/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/databricks/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/ecommerce/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/ers/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/ers/hrms/docker/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/finance/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/github/docker/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/github/docker/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/gmail/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/gmail/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/google-form/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/google-form/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/googledocs/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/googledocs/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/hospital/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/hospital/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/legal/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/linkedin/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/macos/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/os-filesystem/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/os-filesystem/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/paypal/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/paypal/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/research/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/research/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/salesforce_crm/docker-compose-hub.yaml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/salesforce_crm/docker-compose.yaml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/slack/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/slack/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/snowflake/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/snowflake/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/telecom/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/telecom/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/telegram/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/telegram/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/terminal/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/terminal/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/travel/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/travel/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/whatsapp/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/windows/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/zoom/docker-compose-hub.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/zoom/docker-compose.yml +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/atlassian/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/calendar/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/custom_website/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/customer_service/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/databricks/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/ecommerce/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/finance/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/github/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/gmail/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/google_form/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/googledocs/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/hospital/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/legal/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/macos/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/os-filesystem/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/paypal/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/research/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/salesforce/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/slack/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/snowflake/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/telecom/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/telegram/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/terminal/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/travel/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/whatsapp/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/windows/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/zoom/env_injection.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/atlassian/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/atlassian/test_server.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/bigquery/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/booking/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/browser/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/calendar/example_multi_user.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/calendar/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/calendar/test_mcp.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/customer_service/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/databricks/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/databricks/probe.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/ers/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/core/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/core/data_loader.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/core/portfolio.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/evaluation/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/evaluation/evaluator.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/evaluation/logger.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/config.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/content.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/html.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/locations.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/methods.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/presets.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/run_mcp.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/run_web.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/extractor.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/extractor_minimal.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/extractor_simple.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/injection_mcp.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/mcp.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/tools/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/tools/account.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/tools/browsing.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/tools/social.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/tools/trading.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/tools/utility.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/web.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/benchmark/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/benchmark/attack_pool.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/benchmark/attack_runner.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/benchmark/finra_requirements.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/benchmark/finra_tasks.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/benchmark/malicious_tasks.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/redteam_suite/run_redteam_suite.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/test_mcp_tools.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/github/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/google_form/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/googledocs/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/hospital/mcp_server.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/core/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/core/courtlistener_store.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/core/data_loader.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/core/document_store.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/core/matter_manager.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/scripts/collect_data.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/server/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/server/mcp.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/macos/client_test.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/macos/mcp_server.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/os-filesystem/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/paypal/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/research/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/salesforce/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/slack/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/snowflake/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/snowflake/probe.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/telecom/mcp_client.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/telecom/mcp_server.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/telegram/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/terminal/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/travel/client_test.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/travel/mcp_server.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/whatsapp/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/windows/client_test.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/windows/mcp_server.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/zoom/main.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/hooks/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/hooks/audit_log.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/hooks/hooks.json +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/run_benign.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/agent.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/attacks.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/environment.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/hooks.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/judge.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/red_teaming_trajectory.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/task.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/trajectory.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/atlassian/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/atlassian/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/bigquery/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/bigquery/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/calendar/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/calendar/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/finance → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/chase}/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/abusive_comms.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/email_exfiltration.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/financial_fraud.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/llm_utils.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/pii_disclosure.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/policy_misrep.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/text_utils.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/databricks/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/databricks/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/legal → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/finance}/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/finance/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/github/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/github/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/gmail/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/gmail/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/google_form/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/google_form/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/macos → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/legal}/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/legal/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/research → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/macos}/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/macos/env_setup.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/macos/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/os_filesystem/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/os_filesystem/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/paypal/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/paypal/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/port_allocator.py +0 -0
- {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/telegram → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/research}/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/research/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/terminal → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/robinhood}/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/salesforce/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/salesforce/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/slack/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/slack/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/snowflake/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/snowflake/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/telecom/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/telecom/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/travel → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/telegram}/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/telegram/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/whatsapp → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/terminal}/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/terminal/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/windows → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/travel}/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/travel/env_client.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/travel/llm_judge.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/travel/prompts.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/utils/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/whatsapp/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/windows/env_reset.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/windows/env_setup.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/windows/exfil_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/windows/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/zoom/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/zoom/helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/eval/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/eval/_ui.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/eval/task_runner.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/setup.cfg +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/__init__.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/a2a_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/agent_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/agent_wrapper.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/compose_utils.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/config.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/env_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/eval_stats.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/injection_a2a_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/injection_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/injection_mcp_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/judge_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/judge_utils.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/llm.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/logging.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/mcp_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/mcp_manager.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/memory_guard.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/red_teaming_sandbox.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/reset_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/resource_manager.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/skill_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/task_executor.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/task_helpers.py +0 -0
- {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/template_helpers.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: decodingtrust-agent-sdk
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.6
|
|
4
4
|
Summary: DecodingTrust Agent Platform (DTap) — A controllable and interactive red-teaming platform for AI agents
|
|
5
5
|
Author-email: DTap Team <zhaorun@uchicago.edu>
|
|
6
6
|
License: Apache License
|
{decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/src/agent.py
RENAMED
|
@@ -3,6 +3,7 @@ import shutil
|
|
|
3
3
|
import tempfile
|
|
4
4
|
import uuid
|
|
5
5
|
from datetime import datetime
|
|
6
|
+
from pathlib import Path
|
|
6
7
|
from typing import Dict, Any, Optional, List, Union
|
|
7
8
|
|
|
8
9
|
from claude_agent_sdk import (
|
|
@@ -70,9 +71,25 @@ class ClaudeSDKAgent(Agent):
|
|
|
70
71
|
# Skill injection temp directory
|
|
71
72
|
self._skill_temp_dir: Optional[str] = None
|
|
72
73
|
|
|
73
|
-
# Per-instance Claude Code home.
|
|
74
|
+
# Per-instance Claude Code home.
|
|
74
75
|
self._claude_home: str = tempfile.mkdtemp(prefix="claude-home-")
|
|
75
76
|
|
|
77
|
+
# Seed the isolated home with the user's OAuth credentials so that,
|
|
78
|
+
# when ANTHROPIC_API_KEY is unset, the spawned `claude` CLI authenticates
|
|
79
|
+
# via the logged-in subscription (Max/Pro) instead of reporting
|
|
80
|
+
# "Not logged in". CLAUDE_CONFIG_DIR points the CLI at this temp home, so
|
|
81
|
+
# without this copy it can't find ~/.claude/.credentials.json. The temp
|
|
82
|
+
# home (and this copy) is removed when the agent is cleaned up.
|
|
83
|
+
# No-op when API-key billing is used or no credentials file exists.
|
|
84
|
+
_src_creds = Path.home() / ".claude" / ".credentials.json"
|
|
85
|
+
if _src_creds.is_file():
|
|
86
|
+
try:
|
|
87
|
+
_dst_creds = Path(self._claude_home) / ".credentials.json"
|
|
88
|
+
shutil.copy2(_src_creds, _dst_creds)
|
|
89
|
+
os.chmod(_dst_creds, 0o600)
|
|
90
|
+
except OSError as e:
|
|
91
|
+
print(f"[WARNING] Could not seed Claude subscription credentials: {e}")
|
|
92
|
+
|
|
76
93
|
# Claude SDK client for multi-turn conversations
|
|
77
94
|
self._client: Optional[ClaudeSDKClient] = None
|
|
78
95
|
self._options: Optional[ClaudeAgentOptions] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: decodingtrust-agent-sdk
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.6
|
|
4
4
|
Summary: DecodingTrust Agent Platform (DTap) — A controllable and interactive red-teaming platform for AI agents
|
|
5
5
|
Author-email: DTap Team <zhaorun@uchicago.edu>
|
|
6
6
|
License: Apache License
|
|
@@ -304,6 +304,8 @@ dt_arena/utils/bigquery/__init__.py
|
|
|
304
304
|
dt_arena/utils/bigquery/helpers.py
|
|
305
305
|
dt_arena/utils/calendar/__init__.py
|
|
306
306
|
dt_arena/utils/calendar/helpers.py
|
|
307
|
+
dt_arena/utils/chase/__init__.py
|
|
308
|
+
dt_arena/utils/chase/helpers.py
|
|
307
309
|
dt_arena/utils/customer_service/__init__.py
|
|
308
310
|
dt_arena/utils/customer_service/cs_env_client.py
|
|
309
311
|
dt_arena/utils/customer_service/helpers.py
|
|
@@ -338,6 +340,8 @@ dt_arena/utils/paypal/__init__.py
|
|
|
338
340
|
dt_arena/utils/paypal/helpers.py
|
|
339
341
|
dt_arena/utils/research/__init__.py
|
|
340
342
|
dt_arena/utils/research/helpers.py
|
|
343
|
+
dt_arena/utils/robinhood/__init__.py
|
|
344
|
+
dt_arena/utils/robinhood/helpers.py
|
|
341
345
|
dt_arena/utils/salesforce/__init__.py
|
|
342
346
|
dt_arena/utils/salesforce/helpers.py
|
|
343
347
|
dt_arena/utils/slack/__init__.py
|
|
@@ -566,3 +566,107 @@ environments:
|
|
|
566
566
|
BIGQUERY_GRPC_PORT:
|
|
567
567
|
default: 9060
|
|
568
568
|
container_port: 9060
|
|
569
|
+
|
|
570
|
+
chase:
|
|
571
|
+
docker_compose: "dt_arena/envs/chase/docker-compose.yml"
|
|
572
|
+
reset_endpoints:
|
|
573
|
+
api:
|
|
574
|
+
url: "http://127.0.0.1:${CHASE_API_PORT}/admin/reset"
|
|
575
|
+
method: POST
|
|
576
|
+
ports:
|
|
577
|
+
CHASE_PG_PORT:
|
|
578
|
+
default: 5468
|
|
579
|
+
container_port: 5468
|
|
580
|
+
CHASE_API_PORT:
|
|
581
|
+
default: 8068
|
|
582
|
+
container_port: 8068
|
|
583
|
+
CHASE_UI_PORT:
|
|
584
|
+
default: 8069
|
|
585
|
+
container_port: 8069
|
|
586
|
+
|
|
587
|
+
robinhood:
|
|
588
|
+
docker_compose: "dt_arena/envs/robinhood/docker-compose.yml"
|
|
589
|
+
reset_endpoints:
|
|
590
|
+
api:
|
|
591
|
+
url: "http://127.0.0.1:${ROBINHOOD_API_PORT}/admin/reset"
|
|
592
|
+
method: POST
|
|
593
|
+
ports:
|
|
594
|
+
ROBINHOOD_PG_PORT:
|
|
595
|
+
default: 5470
|
|
596
|
+
container_port: 5470
|
|
597
|
+
ROBINHOOD_API_PORT:
|
|
598
|
+
default: 8070
|
|
599
|
+
container_port: 8070
|
|
600
|
+
ROBINHOOD_UI_PORT:
|
|
601
|
+
default: 8071
|
|
602
|
+
container_port: 8071
|
|
603
|
+
|
|
604
|
+
booking:
|
|
605
|
+
docker_compose: "dt_arena/envs/booking/docker-compose.yml"
|
|
606
|
+
reset_endpoints:
|
|
607
|
+
api:
|
|
608
|
+
url: "http://127.0.0.1:${BOOKING_API_PORT}/admin/reset"
|
|
609
|
+
method: POST
|
|
610
|
+
ports:
|
|
611
|
+
BOOKING_PG_PORT:
|
|
612
|
+
default: 5479
|
|
613
|
+
container_port: 5479
|
|
614
|
+
BOOKING_API_PORT:
|
|
615
|
+
default: 8059
|
|
616
|
+
container_port: 8059
|
|
617
|
+
|
|
618
|
+
doordash:
|
|
619
|
+
docker_compose: "dt_arena/envs/doordash/docker-compose.yml"
|
|
620
|
+
reset_endpoints:
|
|
621
|
+
api:
|
|
622
|
+
url: "http://127.0.0.1:${DOORDASH_API_PORT}/admin/reset"
|
|
623
|
+
method: POST
|
|
624
|
+
ports:
|
|
625
|
+
DOORDASH_PG_PORT:
|
|
626
|
+
default: 5482
|
|
627
|
+
container_port: 5482
|
|
628
|
+
DOORDASH_API_PORT:
|
|
629
|
+
default: 8062
|
|
630
|
+
container_port: 8062
|
|
631
|
+
|
|
632
|
+
expedia:
|
|
633
|
+
docker_compose: "dt_arena/envs/expedia/docker-compose.yml"
|
|
634
|
+
reset_endpoints:
|
|
635
|
+
api:
|
|
636
|
+
url: "http://127.0.0.1:${EXPEDIA_API_PORT}/admin/reset"
|
|
637
|
+
method: POST
|
|
638
|
+
ports:
|
|
639
|
+
EXPEDIA_PG_PORT:
|
|
640
|
+
default: 5478
|
|
641
|
+
container_port: 5478
|
|
642
|
+
EXPEDIA_API_PORT:
|
|
643
|
+
default: 8058
|
|
644
|
+
container_port: 8058
|
|
645
|
+
|
|
646
|
+
southwest:
|
|
647
|
+
docker_compose: "dt_arena/envs/southwest/docker-compose.yml"
|
|
648
|
+
reset_endpoints:
|
|
649
|
+
api:
|
|
650
|
+
url: "http://127.0.0.1:${SOUTHWEST_API_PORT}/admin/reset"
|
|
651
|
+
method: POST
|
|
652
|
+
ports:
|
|
653
|
+
SOUTHWEST_PG_PORT:
|
|
654
|
+
default: 5475
|
|
655
|
+
container_port: 5475
|
|
656
|
+
SOUTHWEST_API_PORT:
|
|
657
|
+
default: 8055
|
|
658
|
+
container_port: 8055
|
|
659
|
+
|
|
660
|
+
united:
|
|
661
|
+
docker_compose: "dt_arena/envs/united/docker-compose.yml"
|
|
662
|
+
reset_endpoints:
|
|
663
|
+
api:
|
|
664
|
+
url: "http://127.0.0.1:${UNITED_API_PORT}/admin/reset"
|
|
665
|
+
method: POST
|
|
666
|
+
ports:
|
|
667
|
+
UNITED_PG_PORT:
|
|
668
|
+
default: 5476
|
|
669
|
+
container_port: 5476
|
|
670
|
+
UNITED_API_PORT:
|
|
671
|
+
default: 8056
|
|
672
|
+
container_port: 8056
|
{decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/config/injection_mcp.yaml
RENAMED
|
@@ -103,6 +103,40 @@ servers:
|
|
|
103
103
|
transport: http
|
|
104
104
|
command: ["python3", "env_injection.py"]
|
|
105
105
|
|
|
106
|
+
# Chase Environment Injection MCP Server (red-teaming)
|
|
107
|
+
- name: chase-injection
|
|
108
|
+
target_environment: chase
|
|
109
|
+
description: Chase environment injection MCP server for red-teaming (inject Zelle requests/contacts, transactions, statements)
|
|
110
|
+
path: chase/env_injection.py
|
|
111
|
+
enabled: true
|
|
112
|
+
env:
|
|
113
|
+
CHASE_ENV_INJECTION_MCP_HOST: "localhost"
|
|
114
|
+
CHASE_ENV_INJECTION_MCP_PORT: "10318"
|
|
115
|
+
CHASE_PG_HOST: "127.0.0.1"
|
|
116
|
+
CHASE_PG_PORT: "${CHASE_PG_PORT}"
|
|
117
|
+
CHASE_PG_DB: "chase_sandbox"
|
|
118
|
+
CHASE_PG_USER: "sandbox"
|
|
119
|
+
CHASE_PG_PASSWORD: "sandbox"
|
|
120
|
+
transport: http
|
|
121
|
+
command: ["python3", "env_injection.py"]
|
|
122
|
+
|
|
123
|
+
# Robinhood Environment Injection MCP Server (red-teaming)
|
|
124
|
+
- name: robinhood-injection
|
|
125
|
+
target_environment: robinhood
|
|
126
|
+
description: Robinhood environment injection MCP server for red-teaming (inject orders, positions, watchlists, notifications)
|
|
127
|
+
path: robinhood/env_injection.py
|
|
128
|
+
enabled: true
|
|
129
|
+
env:
|
|
130
|
+
ROBINHOOD_ENV_INJECTION_MCP_HOST: "localhost"
|
|
131
|
+
ROBINHOOD_ENV_INJECTION_MCP_PORT: "10317"
|
|
132
|
+
ROBINHOOD_PG_HOST: "127.0.0.1"
|
|
133
|
+
ROBINHOOD_PG_PORT: "${ROBINHOOD_PG_PORT}"
|
|
134
|
+
ROBINHOOD_PG_DB: "robinhood_sandbox"
|
|
135
|
+
ROBINHOOD_PG_USER: "sandbox"
|
|
136
|
+
ROBINHOOD_PG_PASSWORD: "sandbox"
|
|
137
|
+
transport: http
|
|
138
|
+
command: ["python3", "env_injection.py"]
|
|
139
|
+
|
|
106
140
|
# Gmail Environment Injection MCP Server (red-teaming)
|
|
107
141
|
- name: gmail-injection
|
|
108
142
|
target_environment: gmail
|
|
@@ -2,7 +2,7 @@ version: "3.8"
|
|
|
2
2
|
|
|
3
3
|
services:
|
|
4
4
|
whatsapp-pg:
|
|
5
|
-
image:
|
|
5
|
+
image: decodingtrustagent/whatsapp:pg
|
|
6
6
|
network_mode: host
|
|
7
7
|
privileged: true
|
|
8
8
|
security_opt:
|
|
@@ -12,18 +12,16 @@ services:
|
|
|
12
12
|
POSTGRES_USER: sandbox
|
|
13
13
|
POSTGRES_PASSWORD: sandbox
|
|
14
14
|
PGPORT: ${WHATSAPP_PG_PORT:-5473}
|
|
15
|
-
volumes:
|
|
16
|
-
- ./init:/docker-entrypoint-initdb.d:ro
|
|
17
15
|
healthcheck:
|
|
18
|
-
test: ["CMD-SHELL", "
|
|
16
|
+
test: ["CMD-SHELL", "pg_isready -U sandbox -d whatsapp_sandbox"]
|
|
19
17
|
interval: 5s
|
|
20
18
|
timeout: 5s
|
|
21
|
-
retries:
|
|
22
|
-
start_period:
|
|
19
|
+
retries: 20
|
|
20
|
+
start_period: 30s
|
|
23
21
|
restart: unless-stopped
|
|
24
22
|
|
|
25
23
|
whatsapp-api:
|
|
26
|
-
image: decodingtrustagent/whatsapp:api-
|
|
24
|
+
image: decodingtrustagent/whatsapp:api-latest
|
|
27
25
|
network_mode: host
|
|
28
26
|
privileged: true
|
|
29
27
|
security_opt:
|
|
@@ -43,8 +41,6 @@ services:
|
|
|
43
41
|
WHATSAPP_PG_USER: sandbox
|
|
44
42
|
WHATSAPP_PG_PASSWORD: sandbox
|
|
45
43
|
WHATSAPP_API_PORT: ${WHATSAPP_API_PORT:-8039}
|
|
46
|
-
volumes:
|
|
47
|
-
- ./api:/app:ro
|
|
48
44
|
healthcheck:
|
|
49
45
|
test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://127.0.0.1:$${WHATSAPP_API_PORT:-8039}/health', timeout=5)\" || exit 1"]
|
|
50
46
|
interval: 5s
|
|
@@ -54,6 +50,8 @@ services:
|
|
|
54
50
|
restart: unless-stopped
|
|
55
51
|
|
|
56
52
|
whatsapp-ui:
|
|
53
|
+
security_opt:
|
|
54
|
+
- seccomp:unconfined
|
|
57
55
|
image: decodingtrustagent/whatsapp:ui-latest
|
|
58
56
|
network_mode: host
|
|
59
57
|
restart: unless-stopped
|
{decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/gmail/main.py
RENAMED
|
@@ -5,8 +5,14 @@ Preserves tool signature: get_gmail_content(limit:int)->str
|
|
|
5
5
|
Also exposes list_messages, get_message, delete_all_messages, find_message for direct tooling.
|
|
6
6
|
"""
|
|
7
7
|
import os
|
|
8
|
+
import re
|
|
8
9
|
import asyncio
|
|
10
|
+
import base64
|
|
9
11
|
import json
|
|
12
|
+
import mimetypes
|
|
13
|
+
import time
|
|
14
|
+
import collections
|
|
15
|
+
from urllib.parse import quote
|
|
10
16
|
from datetime import datetime
|
|
11
17
|
from typing import Any, Dict, List, Optional, Tuple
|
|
12
18
|
|
|
@@ -25,6 +31,46 @@ from email.utils import getaddresses
|
|
|
25
31
|
MAILPIT_BASE_URL = os.getenv("MAILPIT_BASE_URL", "http://localhost:8025")
|
|
26
32
|
# Use API Proxy for user-specific filtering
|
|
27
33
|
API_PROXY_URL = os.getenv("API_PROXY_URL", "http://localhost:8031")
|
|
34
|
+
# Base URL the *agent* can reach for download links (set to the public gateway
|
|
35
|
+
# in a remote deployment); falls back to the proxy URL the MCP itself uses.
|
|
36
|
+
GMAIL_PUBLIC_URL = os.getenv("GMAIL_PUBLIC_URL", API_PROXY_URL)
|
|
37
|
+
|
|
38
|
+
# Base URL at which the *agent* reaches THIS MCP server (the gateway/public
|
|
39
|
+
# address in a remote deployment). Attachment upload/download go through custom
|
|
40
|
+
# HTTP routes on this server (below) so the agent never needs the access token —
|
|
41
|
+
# the routes use the server-held token internally.
|
|
42
|
+
MCP_PUBLIC_URL = os.getenv("MCP_PUBLIC_URL", "http://127.0.0.1:8840").rstrip("/")
|
|
43
|
+
|
|
44
|
+
# Access control for THIS MCP (protocol + the attachment routes). When set, every
|
|
45
|
+
# client must present `Authorization: Bearer <MCP_AUTH_TOKEN>`. This is the gmail
|
|
46
|
+
# *agent's* credential to reach the MCP — distinct from the gmail access token,
|
|
47
|
+
# which always stays server-side. Leave unset only for local/demo use.
|
|
48
|
+
MCP_AUTH_TOKEN = os.getenv("MCP_AUTH_TOKEN", "")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _route_authorized(request) -> bool:
|
|
52
|
+
if not MCP_AUTH_TOKEN:
|
|
53
|
+
return True
|
|
54
|
+
h = request.headers.get("authorization", "")
|
|
55
|
+
tok = h[7:] if h.startswith("Bearer ") else h
|
|
56
|
+
return tok == MCP_AUTH_TOKEN
|
|
57
|
+
|
|
58
|
+
# Simple per-instance rate limit on uploads, so a misbehaving/compromised agent
|
|
59
|
+
# can't hammer the staging area. Tune with UPLOAD_RATE_PER_MIN.
|
|
60
|
+
_UPLOAD_RATE_PER_MIN = int(os.getenv("UPLOAD_RATE_PER_MIN", "30"))
|
|
61
|
+
_upload_times: "collections.deque" = collections.deque()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _upload_rate_ok() -> bool:
|
|
65
|
+
now = time.monotonic()
|
|
66
|
+
while _upload_times and now - _upload_times[0] > 60:
|
|
67
|
+
_upload_times.popleft()
|
|
68
|
+
if len(_upload_times) >= _UPLOAD_RATE_PER_MIN:
|
|
69
|
+
return False
|
|
70
|
+
_upload_times.append(now)
|
|
71
|
+
return True
|
|
72
|
+
|
|
73
|
+
|
|
28
74
|
MAILPIT_MESSAGES_API = f"{API_PROXY_URL}/api/v1/messages"
|
|
29
75
|
MAILPIT_MESSAGE_API = f"{API_PROXY_URL}/api/v1/message"
|
|
30
76
|
MAILPIT_SMTP_HOST = os.getenv("MAILPIT_SMTP_HOST", "localhost")
|
|
@@ -43,8 +89,70 @@ print(f"[MCP Server] MAILPIT_SMTP_HOST: {MAILPIT_SMTP_HOST}", file=sys.stderr)
|
|
|
43
89
|
print(f"[MCP Server] ==================", file=sys.stderr)
|
|
44
90
|
sys.stderr.flush()
|
|
45
91
|
|
|
46
|
-
# Create a FastMCP server
|
|
47
|
-
|
|
92
|
+
# Create a FastMCP server (token-gated when MCP_AUTH_TOKEN is set)
|
|
93
|
+
_mcp_auth = None
|
|
94
|
+
if MCP_AUTH_TOKEN:
|
|
95
|
+
from fastmcp.server.auth.providers.jwt import StaticTokenVerifier
|
|
96
|
+
_mcp_auth = StaticTokenVerifier({MCP_AUTH_TOKEN: {"client_id": "gmail-agent"}})
|
|
97
|
+
mcp = FastMCP("Gmail Client", auth=_mcp_auth)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@mcp.custom_route("/attachments/upload", methods=["POST"])
|
|
101
|
+
async def _attachment_upload_route(request):
|
|
102
|
+
"""Out-of-band file upload, hosted by the MCP server itself. The agent POSTs
|
|
103
|
+
the raw file bytes here (no token needed beyond reaching the MCP); the route
|
|
104
|
+
stages the file using the SERVER-held access token and returns an
|
|
105
|
+
attachment_id to pass to send_email. Rate-limited and size-capped."""
|
|
106
|
+
from starlette.responses import JSONResponse as _JSON
|
|
107
|
+
if not _route_authorized(request):
|
|
108
|
+
return _JSON({"error": "unauthorized"}, status_code=401)
|
|
109
|
+
if not _upload_rate_ok():
|
|
110
|
+
return _JSON({"error": "upload rate limit exceeded, slow down"}, status_code=429)
|
|
111
|
+
filename = request.query_params.get("filename", "file")
|
|
112
|
+
ctype = request.headers.get("content-type") or "application/octet-stream"
|
|
113
|
+
client = await get_http()
|
|
114
|
+
url = f"{API_PROXY_URL}/api/v1/attachments?filename={quote(filename)}"
|
|
115
|
+
headers = {"Authorization": f"Bearer {USER_ACCESS_TOKEN}", "Content-Type": ctype}
|
|
116
|
+
try:
|
|
117
|
+
r = await client.post(url, content=request.stream(), headers=headers, timeout=300.0)
|
|
118
|
+
except Exception as e:
|
|
119
|
+
return _JSON({"error": f"upstream upload failed: {e}"}, status_code=502)
|
|
120
|
+
if r.headers.get("content-type", "").startswith("application/json"):
|
|
121
|
+
return _JSON(r.json(), status_code=r.status_code)
|
|
122
|
+
return _JSON({"error": r.text[:200]}, status_code=r.status_code)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
@mcp.custom_route("/attachments/download", methods=["GET"])
|
|
126
|
+
async def _attachment_download_route(request):
|
|
127
|
+
"""Out-of-band file download, hosted by the MCP server. Streams a received
|
|
128
|
+
attachment back to the agent using the SERVER-held token; no token needed in
|
|
129
|
+
the URL. Query: ?msg=<message id>&part=<part id>."""
|
|
130
|
+
from starlette.responses import JSONResponse as _JSON, StreamingResponse as _Stream
|
|
131
|
+
if not _route_authorized(request):
|
|
132
|
+
return _JSON({"error": "unauthorized"}, status_code=401)
|
|
133
|
+
msg = request.query_params.get("msg")
|
|
134
|
+
part = request.query_params.get("part")
|
|
135
|
+
if not msg or not part:
|
|
136
|
+
return _JSON({"error": "msg and part query params are required"}, status_code=400)
|
|
137
|
+
client = await get_http()
|
|
138
|
+
url = f"{API_PROXY_URL}/api/v1/message/{quote(msg)}/part/{quote(part)}"
|
|
139
|
+
upstream = await client.send(
|
|
140
|
+
client.build_request("GET", url, headers={"Authorization": f"Bearer {USER_ACCESS_TOKEN}"}),
|
|
141
|
+
stream=True,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
async def _body():
|
|
145
|
+
try:
|
|
146
|
+
async for chunk in upstream.aiter_bytes(65536):
|
|
147
|
+
yield chunk
|
|
148
|
+
finally:
|
|
149
|
+
await upstream.aclose()
|
|
150
|
+
|
|
151
|
+
headers = {}
|
|
152
|
+
if upstream.headers.get("content-disposition"):
|
|
153
|
+
headers["Content-Disposition"] = upstream.headers["content-disposition"]
|
|
154
|
+
return _Stream(_body(), status_code=upstream.status_code,
|
|
155
|
+
media_type=upstream.headers.get("content-type", "application/octet-stream"), headers=headers)
|
|
48
156
|
|
|
49
157
|
_http_client: Optional[httpx.AsyncClient] = None
|
|
50
158
|
|
|
@@ -384,18 +492,21 @@ async def list_messages(limit: int = 50) -> str:
|
|
|
384
492
|
|
|
385
493
|
user_email_lower = user_email.lower()
|
|
386
494
|
msgs = await _fetch_messages(limit_scan=max(1, min(500, limit * 2)))
|
|
387
|
-
|
|
495
|
+
|
|
388
496
|
inbox_msgs = []
|
|
389
497
|
for m in msgs:
|
|
390
498
|
if len(inbox_msgs) >= limit:
|
|
391
499
|
break
|
|
392
|
-
#
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
500
|
+
# The proxy already scopes msgs to emails this user owns, so any owned
|
|
501
|
+
# message NOT sent by the user is a received (inbox) message. This
|
|
502
|
+
# covers To, Cc AND Bcc recipients — a Bcc-only recipient appears in
|
|
503
|
+
# none of the To/Cc fields (Bcc is stripped from the delivered headers)
|
|
504
|
+
# yet still received the mail.
|
|
505
|
+
from_addrs = _addresses_from_field(m.get("From") or m.get("from"))
|
|
506
|
+
is_sender = user_email_lower in [a.lower() for a in from_addrs]
|
|
507
|
+
if not is_sender:
|
|
397
508
|
inbox_msgs.append(m)
|
|
398
|
-
|
|
509
|
+
|
|
399
510
|
return json.dumps(inbox_msgs, ensure_ascii=False)
|
|
400
511
|
except Exception as e:
|
|
401
512
|
return json.dumps({"error": str(e)})
|
|
@@ -669,26 +780,116 @@ async def get_message_body(id: str, prefer: Optional[str] = "auto") -> str:
|
|
|
669
780
|
return json.dumps({"error": str(e)})
|
|
670
781
|
|
|
671
782
|
|
|
783
|
+
def _extract_attachments(detail: Dict[str, Any]) -> List[Dict[str, Any]]:
|
|
784
|
+
"""Normalize Mailpit's attachment metadata into a simple list."""
|
|
785
|
+
raw = detail.get("Attachments") or detail.get("attachments") or []
|
|
786
|
+
out = []
|
|
787
|
+
for a in raw:
|
|
788
|
+
out.append({
|
|
789
|
+
"part_id": a.get("PartID") or a.get("partID") or a.get("PartId") or a.get("part_id"),
|
|
790
|
+
"filename": a.get("FileName") or a.get("filename") or a.get("Filename"),
|
|
791
|
+
"content_type": a.get("ContentType") or a.get("content_type"),
|
|
792
|
+
"size": a.get("Size") or a.get("size"),
|
|
793
|
+
})
|
|
794
|
+
return out
|
|
795
|
+
|
|
796
|
+
|
|
672
797
|
@mcp.tool()
|
|
673
798
|
async def list_attachments(id: str) -> str:
|
|
674
799
|
"""List all attachments in a specific email.
|
|
675
|
-
|
|
800
|
+
|
|
676
801
|
Args:
|
|
677
802
|
id: The message ID
|
|
678
|
-
|
|
803
|
+
|
|
679
804
|
Returns:
|
|
680
|
-
JSON array of
|
|
805
|
+
JSON array of attachments: part_id, filename, content_type, size, and a
|
|
806
|
+
download_url. Fetch download_url out-of-band (e.g. curl) to get the file
|
|
807
|
+
without pulling its bytes through this tool; or use get_attachment().
|
|
681
808
|
"""
|
|
682
809
|
if not id:
|
|
683
810
|
return json.dumps({"error": "id is required"})
|
|
684
811
|
try:
|
|
685
812
|
detail = await _fetch_message_detail(id)
|
|
686
813
|
atts = _extract_attachments(detail)
|
|
814
|
+
for a in atts:
|
|
815
|
+
if a.get("part_id") is not None:
|
|
816
|
+
a["download_url"] = f"{MCP_PUBLIC_URL}/attachments/download?msg={quote(id)}&part={quote(str(a['part_id']))}"
|
|
687
817
|
return json.dumps(atts, ensure_ascii=False)
|
|
688
818
|
except Exception as e:
|
|
689
819
|
return json.dumps({"error": str(e)})
|
|
690
820
|
|
|
691
821
|
|
|
822
|
+
@mcp.tool()
|
|
823
|
+
async def get_attachment(id: str, part_id: str) -> str:
|
|
824
|
+
"""Download the content of an email attachment.
|
|
825
|
+
|
|
826
|
+
Args:
|
|
827
|
+
id: The message ID (from list_messages / search_messages)
|
|
828
|
+
part_id: The attachment's part id (the "part_id" from list_attachments)
|
|
829
|
+
|
|
830
|
+
Returns:
|
|
831
|
+
JSON with content_type, size, a download_url (a plain GET on this MCP
|
|
832
|
+
server, e.g. `curl "<download_url>"`, that streams the bytes — no token
|
|
833
|
+
needed), and — for small UTF-8 text — a "text" field with the decoded
|
|
834
|
+
content. Binary bytes are NOT inlined.
|
|
835
|
+
"""
|
|
836
|
+
if not id or not part_id:
|
|
837
|
+
return json.dumps({"error": "id and part_id are required"})
|
|
838
|
+
try:
|
|
839
|
+
client = await get_http()
|
|
840
|
+
resp = await client.get(
|
|
841
|
+
f"{API_PROXY_URL}/api/v1/message/{id}/part/{part_id}",
|
|
842
|
+
headers=_get_auth_headers(),
|
|
843
|
+
)
|
|
844
|
+
if resp.status_code == 404:
|
|
845
|
+
return json.dumps({"error": "attachment not found"})
|
|
846
|
+
resp.raise_for_status()
|
|
847
|
+
content = resp.content
|
|
848
|
+
out = {
|
|
849
|
+
"part_id": part_id,
|
|
850
|
+
"content_type": resp.headers.get("content-type", "application/octet-stream"),
|
|
851
|
+
"size": len(content),
|
|
852
|
+
"download_url": f"{MCP_PUBLIC_URL}/attachments/download?msg={quote(id)}&part={quote(str(part_id))}",
|
|
853
|
+
}
|
|
854
|
+
if len(content) <= 200_000:
|
|
855
|
+
try:
|
|
856
|
+
out["text"] = content.decode("utf-8")
|
|
857
|
+
except Exception:
|
|
858
|
+
pass
|
|
859
|
+
return json.dumps(out, ensure_ascii=False)
|
|
860
|
+
except Exception as e:
|
|
861
|
+
return json.dumps({"error": str(e)})
|
|
862
|
+
|
|
863
|
+
|
|
864
|
+
@mcp.tool()
|
|
865
|
+
async def get_attachment_upload_url(filename: str = "file") -> str:
|
|
866
|
+
"""Get a pre-authorized URL for uploading a local file to attach to an email.
|
|
867
|
+
|
|
868
|
+
Use this whenever you want to attach a file from your machine — it keeps the
|
|
869
|
+
file's bytes out of the tool call entirely. Three steps:
|
|
870
|
+
1. Call this with the file's name; it returns an `upload_url`.
|
|
871
|
+
2. POST the raw file bytes to that URL (it points at this MCP server, which
|
|
872
|
+
authorizes it for you — no token or extra headers needed), e.g.:
|
|
873
|
+
curl -X POST --data-binary @/path/to/file "<upload_url>"
|
|
874
|
+
The JSON response contains an `attachment_id`.
|
|
875
|
+
3. Call send_email(..., attachments=[{"attachment_id": "<that id>"}]).
|
|
876
|
+
|
|
877
|
+
Returns JSON with upload_url, method, body, a ready-to-run curl example, and
|
|
878
|
+
the next step.
|
|
879
|
+
"""
|
|
880
|
+
upload_url = f"{MCP_PUBLIC_URL}/attachments/upload?filename={quote(filename)}"
|
|
881
|
+
auth_hdr = ' -H "Authorization: Bearer <your MCP token>"' if MCP_AUTH_TOKEN else ''
|
|
882
|
+
return json.dumps({
|
|
883
|
+
"upload_url": upload_url,
|
|
884
|
+
"method": "POST",
|
|
885
|
+
"body": "the raw file bytes (NOT multipart, NOT base64)",
|
|
886
|
+
"auth": ("include the same Authorization header you use to reach this MCP"
|
|
887
|
+
if MCP_AUTH_TOKEN else "no auth header needed"),
|
|
888
|
+
"example": f'curl -X POST{auth_hdr} --data-binary @/path/to/{filename} "{upload_url}"',
|
|
889
|
+
"next_step": 'take attachment_id from the response, then send_email(attachments=[{"attachment_id": "..."}])',
|
|
890
|
+
}, ensure_ascii=False)
|
|
891
|
+
|
|
892
|
+
|
|
692
893
|
@mcp.tool()
|
|
693
894
|
async def send_reply(id: str,
|
|
694
895
|
body: Optional[str] = None,
|
|
@@ -879,7 +1080,8 @@ def _send_email_sync(to: Any,
|
|
|
879
1080
|
body: Optional[str],
|
|
880
1081
|
from_email: Optional[str],
|
|
881
1082
|
cc: Optional[Any],
|
|
882
|
-
bcc: Optional[Any]
|
|
1083
|
+
bcc: Optional[Any],
|
|
1084
|
+
attachments: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]:
|
|
883
1085
|
sender = from_email or "noreply@example.com"
|
|
884
1086
|
to_list = _normalize_recipients(to)
|
|
885
1087
|
cc_list = _normalize_recipients(cc)
|
|
@@ -896,6 +1098,22 @@ def _send_email_sync(to: Any,
|
|
|
896
1098
|
msg["Subject"] = subject or "Test Email"
|
|
897
1099
|
msg.set_content(body or "This is a test email from Mailpit MCP.")
|
|
898
1100
|
|
|
1101
|
+
# Attachments — the agent passes file CONTENT as base64 (the MCP is a remote
|
|
1102
|
+
# HTTP service and cannot read the agent's local filesystem).
|
|
1103
|
+
attached = []
|
|
1104
|
+
for att in (attachments or []):
|
|
1105
|
+
try:
|
|
1106
|
+
raw = base64.b64decode(att.get("data", ""))
|
|
1107
|
+
except Exception:
|
|
1108
|
+
continue
|
|
1109
|
+
ctype = att.get("content_type") or "application/octet-stream"
|
|
1110
|
+
maintype, _, subtype = ctype.partition("/")
|
|
1111
|
+
if not subtype:
|
|
1112
|
+
maintype, subtype = "application", "octet-stream"
|
|
1113
|
+
fname = att.get("filename") or "attachment"
|
|
1114
|
+
msg.add_attachment(raw, maintype=maintype, subtype=subtype, filename=fname)
|
|
1115
|
+
attached.append(fname)
|
|
1116
|
+
|
|
899
1117
|
recipients: List[str] = []
|
|
900
1118
|
recipients.extend(to_list)
|
|
901
1119
|
recipients.extend(cc_list)
|
|
@@ -903,7 +1121,49 @@ def _send_email_sync(to: Any,
|
|
|
903
1121
|
|
|
904
1122
|
with smtplib.SMTP(MAILPIT_SMTP_HOST, MAILPIT_SMTP_PORT, local_hostname="localhost") as smtp:
|
|
905
1123
|
smtp.send_message(msg, from_addr=sender, to_addrs=recipients)
|
|
906
|
-
return {"ok": True, "to": recipients, "from": sender, "subject": msg["Subject"]}
|
|
1124
|
+
return {"ok": True, "to": recipients, "from": sender, "subject": msg["Subject"], "attachments": attached}
|
|
1125
|
+
|
|
1126
|
+
|
|
1127
|
+
async def _resolve_attachments(attachments):
|
|
1128
|
+
"""Resolve each attachment spec to {filename, content_type, data(base64)}.
|
|
1129
|
+
|
|
1130
|
+
Accepts {data: base64}, {attachment_id}, {url}, or {path} (a path readable by
|
|
1131
|
+
THIS server). For attachment_id/url the bytes are fetched out-of-band so the
|
|
1132
|
+
agent never has to inline a large base64 blob in the tool call.
|
|
1133
|
+
"""
|
|
1134
|
+
out = []
|
|
1135
|
+
client = await get_http()
|
|
1136
|
+
for att in (attachments or []):
|
|
1137
|
+
if not isinstance(att, dict):
|
|
1138
|
+
continue
|
|
1139
|
+
filename = att.get("filename")
|
|
1140
|
+
content_type = att.get("content_type")
|
|
1141
|
+
data_b64 = None
|
|
1142
|
+
if att.get("data"):
|
|
1143
|
+
data_b64 = att["data"]
|
|
1144
|
+
elif att.get("attachment_id"):
|
|
1145
|
+
r = await client.get(f"{API_PROXY_URL}/api/v1/attachments/{att['attachment_id']}", headers=_get_auth_headers())
|
|
1146
|
+
r.raise_for_status()
|
|
1147
|
+
data_b64 = base64.b64encode(r.content).decode()
|
|
1148
|
+
content_type = content_type or r.headers.get("content-type")
|
|
1149
|
+
if not filename:
|
|
1150
|
+
m = re.search(r'filename="?([^"]+)"?', r.headers.get("content-disposition", ""))
|
|
1151
|
+
filename = m.group(1) if m else att["attachment_id"]
|
|
1152
|
+
elif att.get("url"):
|
|
1153
|
+
r = await client.get(att["url"], headers=_get_auth_headers())
|
|
1154
|
+
r.raise_for_status()
|
|
1155
|
+
data_b64 = base64.b64encode(r.content).decode()
|
|
1156
|
+
content_type = content_type or r.headers.get("content-type")
|
|
1157
|
+
filename = filename or att["url"].split("?")[0].rstrip("/").split("/")[-1]
|
|
1158
|
+
elif att.get("path"):
|
|
1159
|
+
with open(att["path"], "rb") as f:
|
|
1160
|
+
data_b64 = base64.b64encode(f.read()).decode()
|
|
1161
|
+
filename = filename or os.path.basename(att["path"])
|
|
1162
|
+
content_type = content_type or (mimetypes.guess_type(att["path"])[0] or "application/octet-stream")
|
|
1163
|
+
if data_b64 is None:
|
|
1164
|
+
continue
|
|
1165
|
+
out.append({"filename": filename or "attachment", "content_type": content_type or "application/octet-stream", "data": data_b64})
|
|
1166
|
+
return out
|
|
907
1167
|
|
|
908
1168
|
|
|
909
1169
|
@mcp.tool()
|
|
@@ -912,9 +1172,10 @@ async def send_email(to: Any,
|
|
|
912
1172
|
body: Optional[str] = None,
|
|
913
1173
|
from_email: Optional[str] = None,
|
|
914
1174
|
cc: Optional[Any] = None,
|
|
915
|
-
bcc: Optional[Any] = None
|
|
1175
|
+
bcc: Optional[Any] = None,
|
|
1176
|
+
attachments: Optional[List[Dict[str, Any]]] = None) -> str:
|
|
916
1177
|
"""Send a new email message.
|
|
917
|
-
|
|
1178
|
+
|
|
918
1179
|
Args:
|
|
919
1180
|
to: Recipient email address(es) - REQUIRED. Can be a single address or comma-separated list.
|
|
920
1181
|
subject: Email subject line
|
|
@@ -922,6 +1183,16 @@ async def send_email(to: Any,
|
|
|
922
1183
|
from_email: Sender email address (must match your authenticated email, auto-filled if not provided)
|
|
923
1184
|
cc: CC recipients (comma-separated or list)
|
|
924
1185
|
bcc: BCC recipients (comma-separated or list)
|
|
1186
|
+
attachments: Optional list of files to attach. Each item is ONE of:
|
|
1187
|
+
{"attachment_id": str} - PREFERRED for a local file: call
|
|
1188
|
+
get_attachment_upload_url(filename) first, upload the file to the
|
|
1189
|
+
returned URL (e.g. with curl), then pass the attachment_id here —
|
|
1190
|
+
nothing large goes through this tool call,
|
|
1191
|
+
{"url": str} - a URL the server fetches,
|
|
1192
|
+
{"path": str} - a path readable by THIS server,
|
|
1193
|
+
{"filename","content_type","data"(base64)} - inline (small files only).
|
|
1194
|
+
The server is remote and cannot read your local disk, so for a local
|
|
1195
|
+
file upload it first and pass {attachment_id}.
|
|
925
1196
|
|
|
926
1197
|
Returns:
|
|
927
1198
|
JSON object with send status including "ok", "to", "from", and "subject" fields
|
|
@@ -956,8 +1227,9 @@ async def send_email(to: Any,
|
|
|
956
1227
|
"error": "Authentication required: You must be authenticated to send emails"
|
|
957
1228
|
})
|
|
958
1229
|
|
|
1230
|
+
resolved = await _resolve_attachments(attachments)
|
|
959
1231
|
result = await asyncio.to_thread(
|
|
960
|
-
_send_email_sync, to, subject, body, from_email, cc, bcc
|
|
1232
|
+
_send_email_sync, to, subject, body, from_email, cc, bcc, resolved
|
|
961
1233
|
)
|
|
962
1234
|
return json.dumps(result, ensure_ascii=False)
|
|
963
1235
|
except Exception as e:
|