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.
Files changed (401) hide show
  1. {decodingtrust_agent_sdk-0.2.3/decodingtrust_agent_sdk.egg-info → decodingtrust_agent_sdk-0.2.6}/PKG-INFO +1 -1
  2. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/src/agent.py +18 -1
  3. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6/decodingtrust_agent_sdk.egg-info}/PKG-INFO +1 -1
  4. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/decodingtrust_agent_sdk.egg-info/SOURCES.txt +4 -0
  5. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/config/env.yaml +104 -0
  6. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/config/injection_mcp.yaml +34 -0
  7. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/whatsapp/docker-compose-hub.yml +7 -9
  8. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/gmail/main.py +289 -17
  9. decodingtrust_agent_sdk-0.2.6/dt_arena/utils/chase/helpers.py +84 -0
  10. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/cs_env_client.py +42 -22
  11. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/helpers.py +7 -1
  12. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/bulk_destructive.py +10 -4
  13. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/cross_customer.py +29 -6
  14. decodingtrust_agent_sdk-0.2.6/dt_arena/utils/robinhood/helpers.py +98 -0
  15. decodingtrust_agent_sdk-0.2.6/dt_arena/utils/whatsapp/__init__.py +0 -0
  16. decodingtrust_agent_sdk-0.2.6/dt_arena/utils/windows/__init__.py +0 -0
  17. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/eval/evaluation.py +48 -17
  18. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/pyproject.toml +1 -1
  19. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/LICENSE +0 -0
  20. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/MANIFEST.in +0 -0
  21. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/README.md +0 -0
  22. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/__init__.py +0 -0
  23. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/__init__.py +0 -0
  24. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/example.py +0 -0
  25. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/src/__init__.py +0 -0
  26. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/src/mcp_proxy.py +0 -0
  27. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/claudesdk/src/utils.py +0 -0
  28. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/googleadk/__init__.py +0 -0
  29. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/googleadk/example.py +0 -0
  30. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/googleadk/src/__init__.py +0 -0
  31. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/googleadk/src/agent.py +0 -0
  32. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/googleadk/src/mcp_wrapper.py +0 -0
  33. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/googleadk/src/utils.py +0 -0
  34. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/__init__.py +0 -0
  35. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/example.py +0 -0
  36. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/src/__init__.py +0 -0
  37. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/src/agent.py +0 -0
  38. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/src/hermes_runner.py +0 -0
  39. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/src/mcp_proxy.py +0 -0
  40. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/hermes/src/utils.py +0 -0
  41. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/langchain/__init__.py +0 -0
  42. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/langchain/example.py +0 -0
  43. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/langchain/src/__init__.py +0 -0
  44. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/langchain/src/agent.py +0 -0
  45. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/langchain/src/utils.py +0 -0
  46. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/__init__.py +0 -0
  47. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/example.py +0 -0
  48. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/src/__init__.py +0 -0
  49. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/src/agent.py +0 -0
  50. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/src/agent_wrapper.py +0 -0
  51. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/src/mcp_wrapper.py +0 -0
  52. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openaisdk/src/utils.py +0 -0
  53. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/__init__.py +0 -0
  54. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/example.py +0 -0
  55. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/__init__.py +0 -0
  56. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/agent.py +0 -0
  57. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/helpers/__init__.py +0 -0
  58. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/helpers/auth_helpers.py +0 -0
  59. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/mcp_proxy.py +0 -0
  60. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/plugin_generator.py +0 -0
  61. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/openclaw/src/utils.py +0 -0
  62. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/__init__.py +0 -0
  63. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/example.py +0 -0
  64. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/prompts/react_agent.py +0 -0
  65. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/__init__.py +0 -0
  66. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/agent.py +0 -0
  67. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/agent_wrapper.py +0 -0
  68. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/async_helper.py +0 -0
  69. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/mcp_react_agent.py +0 -0
  70. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/native_agent.py +0 -0
  71. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/pocketflow/src/nodes.py +0 -0
  72. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/strands/__init__.py +0 -0
  73. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/strands/example.py +0 -0
  74. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/strands/src/__init__.py +0 -0
  75. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/strands/src/agent.py +0 -0
  76. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/agent/strands/src/utils.py +0 -0
  77. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/__init__.py +0 -0
  78. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/browser/benign.jsonl +0 -0
  79. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/browser/direct.jsonl +0 -0
  80. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/browser/indirect.jsonl +0 -0
  81. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/code/benign.jsonl +0 -0
  82. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/code/direct.jsonl +0 -0
  83. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/code/indirect.jsonl +0 -0
  84. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/crm/benign.jsonl +0 -0
  85. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/crm/direct.jsonl +0 -0
  86. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/crm/indirect.jsonl +0 -0
  87. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/customer-service/benign.jsonl +0 -0
  88. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/customer-service/direct.jsonl +0 -0
  89. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/customer-service/indirect.jsonl +0 -0
  90. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/finance/benign.jsonl +0 -0
  91. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/finance/direct.jsonl +0 -0
  92. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/finance/indirect.jsonl +0 -0
  93. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/legal/benign.jsonl +0 -0
  94. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/legal/direct.jsonl +0 -0
  95. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/legal/indirect.jsonl +0 -0
  96. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/macos/benign.jsonl +0 -0
  97. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/macos/direct.jsonl +0 -0
  98. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/macos/indirect.jsonl +0 -0
  99. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/medical/benign.jsonl +0 -0
  100. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/medical/direct.jsonl +0 -0
  101. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/medical/indirect.jsonl +0 -0
  102. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/os-filesystem/benign.jsonl +0 -0
  103. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/os-filesystem/direct.jsonl +0 -0
  104. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/os-filesystem/indirect.jsonl +0 -0
  105. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/research/benign.jsonl +0 -0
  106. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/research/direct.jsonl +0 -0
  107. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/research/indirect.jsonl +0 -0
  108. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/telecom/benign.jsonl +0 -0
  109. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/telecom/direct.jsonl +0 -0
  110. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/telecom/indirect.jsonl +0 -0
  111. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/travel/benign.jsonl +0 -0
  112. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/travel/direct.jsonl +0 -0
  113. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/travel/indirect.jsonl +0 -0
  114. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/windows/benign.jsonl +0 -0
  115. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/windows/direct.jsonl +0 -0
  116. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/windows/indirect.jsonl +0 -0
  117. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/workflow/benign.jsonl +0 -0
  118. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/workflow/direct.jsonl +0 -0
  119. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/benchmark/workflow/indirect.jsonl +0 -0
  120. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/cli/__init__.py +0 -0
  121. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/cli/main.py +0 -0
  122. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/cli/scaffold.py +0 -0
  123. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/decodingtrust_agent_sdk.egg-info/dependency_links.txt +0 -0
  124. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/decodingtrust_agent_sdk.egg-info/entry_points.txt +0 -0
  125. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/decodingtrust_agent_sdk.egg-info/requires.txt +0 -0
  126. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/decodingtrust_agent_sdk.egg-info/top_level.txt +0 -0
  127. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/a2a_agents/generic/__init__.py +0 -0
  128. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/a2a_agents/generic/agent.py +0 -0
  129. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/config/mcp.yaml +0 -0
  130. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/arxiv/docker-compose-hub.yml +0 -0
  131. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/arxiv/docker-compose.yml +0 -0
  132. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/atlassian/docker/docker-compose.dev.yml +0 -0
  133. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/atlassian/docker/docker-compose.yml +0 -0
  134. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/atlassian/docker-compose-hub.yml +0 -0
  135. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/atlassian/docker-compose.yml +0 -0
  136. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/bigquery/docker-compose.yml +0 -0
  137. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/booking/docker-compose.yml +0 -0
  138. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/calendar/docker-compose-hub.yml +0 -0
  139. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/calendar/docker-compose.yml +0 -0
  140. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/custom-website/docker-compose.yml +0 -0
  141. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/customer_service/docker-compose.yml +0 -0
  142. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/databricks/docker-compose-hub.yml +0 -0
  143. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/databricks/docker-compose.yml +0 -0
  144. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/ecommerce/docker-compose.yml +0 -0
  145. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/ers/docker-compose.yml +0 -0
  146. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/ers/hrms/docker/docker-compose.yml +0 -0
  147. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/finance/docker-compose.yml +0 -0
  148. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/github/docker/docker-compose-hub.yml +0 -0
  149. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/github/docker/docker-compose.yml +0 -0
  150. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/gmail/docker-compose-hub.yml +0 -0
  151. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/gmail/docker-compose.yml +0 -0
  152. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/google-form/docker-compose-hub.yml +0 -0
  153. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/google-form/docker-compose.yml +0 -0
  154. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/googledocs/docker-compose-hub.yml +0 -0
  155. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/googledocs/docker-compose.yml +0 -0
  156. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/hospital/docker-compose-hub.yml +0 -0
  157. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/hospital/docker-compose.yml +0 -0
  158. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/legal/docker-compose.yml +0 -0
  159. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/linkedin/docker-compose.yml +0 -0
  160. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/macos/docker-compose.yml +0 -0
  161. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/os-filesystem/docker-compose-hub.yml +0 -0
  162. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/os-filesystem/docker-compose.yml +0 -0
  163. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/paypal/docker-compose-hub.yml +0 -0
  164. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/paypal/docker-compose.yml +0 -0
  165. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/research/docker-compose-hub.yml +0 -0
  166. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/research/docker-compose.yml +0 -0
  167. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/salesforce_crm/docker-compose-hub.yaml +0 -0
  168. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/salesforce_crm/docker-compose.yaml +0 -0
  169. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/slack/docker-compose-hub.yml +0 -0
  170. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/slack/docker-compose.yml +0 -0
  171. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/snowflake/docker-compose-hub.yml +0 -0
  172. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/snowflake/docker-compose.yml +0 -0
  173. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/telecom/docker-compose-hub.yml +0 -0
  174. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/telecom/docker-compose.yml +0 -0
  175. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/telegram/docker-compose-hub.yml +0 -0
  176. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/telegram/docker-compose.yml +0 -0
  177. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/terminal/docker-compose-hub.yml +0 -0
  178. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/terminal/docker-compose.yml +0 -0
  179. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/travel/docker-compose-hub.yml +0 -0
  180. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/travel/docker-compose.yml +0 -0
  181. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/whatsapp/docker-compose.yml +0 -0
  182. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/windows/docker-compose.yml +0 -0
  183. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/zoom/docker-compose-hub.yml +0 -0
  184. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/envs/zoom/docker-compose.yml +0 -0
  185. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/atlassian/env_injection.py +0 -0
  186. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/calendar/env_injection.py +0 -0
  187. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/custom_website/env_injection.py +0 -0
  188. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/customer_service/env_injection.py +0 -0
  189. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/databricks/env_injection.py +0 -0
  190. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/ecommerce/env_injection.py +0 -0
  191. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/finance/env_injection.py +0 -0
  192. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/github/env_injection.py +0 -0
  193. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/gmail/env_injection.py +0 -0
  194. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/google_form/env_injection.py +0 -0
  195. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/googledocs/env_injection.py +0 -0
  196. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/hospital/env_injection.py +0 -0
  197. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/legal/env_injection.py +0 -0
  198. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/macos/env_injection.py +0 -0
  199. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/os-filesystem/env_injection.py +0 -0
  200. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/paypal/env_injection.py +0 -0
  201. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/research/env_injection.py +0 -0
  202. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/salesforce/env_injection.py +0 -0
  203. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/slack/env_injection.py +0 -0
  204. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/snowflake/env_injection.py +0 -0
  205. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/telecom/env_injection.py +0 -0
  206. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/telegram/env_injection.py +0 -0
  207. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/terminal/env_injection.py +0 -0
  208. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/travel/env_injection.py +0 -0
  209. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/whatsapp/env_injection.py +0 -0
  210. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/windows/env_injection.py +0 -0
  211. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/injection_mcp_server/zoom/env_injection.py +0 -0
  212. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/atlassian/main.py +0 -0
  213. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/atlassian/test_server.py +0 -0
  214. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/bigquery/main.py +0 -0
  215. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/booking/main.py +0 -0
  216. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/browser/main.py +0 -0
  217. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/calendar/example_multi_user.py +0 -0
  218. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/calendar/main.py +0 -0
  219. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/calendar/test_mcp.py +0 -0
  220. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/customer_service/main.py +0 -0
  221. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/databricks/main.py +0 -0
  222. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/databricks/probe.py +0 -0
  223. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/ers/main.py +0 -0
  224. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/__init__.py +0 -0
  225. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/core/__init__.py +0 -0
  226. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/core/data_loader.py +0 -0
  227. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/core/portfolio.py +0 -0
  228. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/evaluation/__init__.py +0 -0
  229. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/evaluation/evaluator.py +0 -0
  230. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/evaluation/logger.py +0 -0
  231. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/__init__.py +0 -0
  232. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/config.py +0 -0
  233. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/content.py +0 -0
  234. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/html.py +0 -0
  235. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/locations.py +0 -0
  236. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/methods.py +0 -0
  237. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/injection/presets.py +0 -0
  238. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/main.py +0 -0
  239. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/run_mcp.py +0 -0
  240. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/run_web.py +0 -0
  241. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/__init__.py +0 -0
  242. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/extractor.py +0 -0
  243. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/extractor_minimal.py +0 -0
  244. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/extractor_simple.py +0 -0
  245. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/injection_mcp.py +0 -0
  246. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/mcp.py +0 -0
  247. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/tools/__init__.py +0 -0
  248. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/tools/account.py +0 -0
  249. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/tools/browsing.py +0 -0
  250. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/tools/social.py +0 -0
  251. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/tools/trading.py +0 -0
  252. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/tools/utility.py +0 -0
  253. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/server/web.py +0 -0
  254. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/benchmark/__init__.py +0 -0
  255. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/benchmark/attack_pool.py +0 -0
  256. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/benchmark/attack_runner.py +0 -0
  257. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/benchmark/finra_requirements.py +0 -0
  258. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/benchmark/finra_tasks.py +0 -0
  259. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/tasks/benchmark/malicious_tasks.py +0 -0
  260. {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
  261. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/finance/test_mcp_tools.py +0 -0
  262. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/github/main.py +0 -0
  263. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/google_form/main.py +0 -0
  264. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/googledocs/main.py +0 -0
  265. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/hospital/mcp_server.py +0 -0
  266. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/__init__.py +0 -0
  267. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/core/__init__.py +0 -0
  268. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/core/courtlistener_store.py +0 -0
  269. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/core/data_loader.py +0 -0
  270. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/core/document_store.py +0 -0
  271. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/core/matter_manager.py +0 -0
  272. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/main.py +0 -0
  273. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/scripts/collect_data.py +0 -0
  274. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/server/__init__.py +0 -0
  275. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/legal/server/mcp.py +0 -0
  276. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/macos/client_test.py +0 -0
  277. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/macos/mcp_server.py +0 -0
  278. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/os-filesystem/main.py +0 -0
  279. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/paypal/main.py +0 -0
  280. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/research/main.py +0 -0
  281. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/salesforce/main.py +0 -0
  282. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/slack/main.py +0 -0
  283. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/snowflake/main.py +0 -0
  284. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/snowflake/probe.py +0 -0
  285. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/telecom/mcp_client.py +0 -0
  286. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/telecom/mcp_server.py +0 -0
  287. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/telegram/main.py +0 -0
  288. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/terminal/main.py +0 -0
  289. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/travel/client_test.py +0 -0
  290. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/travel/mcp_server.py +0 -0
  291. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/whatsapp/main.py +0 -0
  292. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/windows/client_test.py +0 -0
  293. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/windows/mcp_server.py +0 -0
  294. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/mcp_server/zoom/main.py +0 -0
  295. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/__init__.py +0 -0
  296. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/hooks/__init__.py +0 -0
  297. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/hooks/audit_log.py +0 -0
  298. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/hooks/hooks.json +0 -0
  299. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/run_benign.py +0 -0
  300. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/__init__.py +0 -0
  301. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/agent.py +0 -0
  302. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/attacks.py +0 -0
  303. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/environment.py +0 -0
  304. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/hooks.py +0 -0
  305. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/judge.py +0 -0
  306. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/red_teaming_trajectory.py +0 -0
  307. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/task.py +0 -0
  308. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/src/types/trajectory.py +0 -0
  309. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/__init__.py +0 -0
  310. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/atlassian/__init__.py +0 -0
  311. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/atlassian/helpers.py +0 -0
  312. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/bigquery/__init__.py +0 -0
  313. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/bigquery/helpers.py +0 -0
  314. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/calendar/__init__.py +0 -0
  315. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/calendar/helpers.py +0 -0
  316. {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/finance → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/chase}/__init__.py +0 -0
  317. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/__init__.py +0 -0
  318. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/__init__.py +0 -0
  319. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/abusive_comms.py +0 -0
  320. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/email_exfiltration.py +0 -0
  321. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/financial_fraud.py +0 -0
  322. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/llm_utils.py +0 -0
  323. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/pii_disclosure.py +0 -0
  324. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/policy_misrep.py +0 -0
  325. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/customer_service/judges/text_utils.py +0 -0
  326. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/databricks/__init__.py +0 -0
  327. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/databricks/helpers.py +0 -0
  328. {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/legal → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/finance}/__init__.py +0 -0
  329. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/finance/helpers.py +0 -0
  330. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/github/__init__.py +0 -0
  331. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/github/helpers.py +0 -0
  332. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/gmail/__init__.py +0 -0
  333. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/gmail/helpers.py +0 -0
  334. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/google_form/__init__.py +0 -0
  335. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/google_form/helpers.py +0 -0
  336. {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/macos → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/legal}/__init__.py +0 -0
  337. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/legal/helpers.py +0 -0
  338. {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/research → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/macos}/__init__.py +0 -0
  339. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/macos/env_setup.py +0 -0
  340. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/macos/helpers.py +0 -0
  341. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/os_filesystem/__init__.py +0 -0
  342. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/os_filesystem/helpers.py +0 -0
  343. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/paypal/__init__.py +0 -0
  344. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/paypal/helpers.py +0 -0
  345. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/port_allocator.py +0 -0
  346. {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/telegram → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/research}/__init__.py +0 -0
  347. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/research/helpers.py +0 -0
  348. {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/terminal → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/robinhood}/__init__.py +0 -0
  349. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/salesforce/__init__.py +0 -0
  350. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/salesforce/helpers.py +0 -0
  351. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/slack/__init__.py +0 -0
  352. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/slack/helpers.py +0 -0
  353. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/snowflake/__init__.py +0 -0
  354. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/snowflake/helpers.py +0 -0
  355. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/telecom/__init__.py +0 -0
  356. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/telecom/helpers.py +0 -0
  357. {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/travel → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/telegram}/__init__.py +0 -0
  358. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/telegram/helpers.py +0 -0
  359. {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/whatsapp → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/terminal}/__init__.py +0 -0
  360. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/terminal/helpers.py +0 -0
  361. {decodingtrust_agent_sdk-0.2.3/dt_arena/utils/windows → decodingtrust_agent_sdk-0.2.6/dt_arena/utils/travel}/__init__.py +0 -0
  362. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/travel/env_client.py +0 -0
  363. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/travel/llm_judge.py +0 -0
  364. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/travel/prompts.py +0 -0
  365. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/utils/__init__.py +0 -0
  366. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/whatsapp/helpers.py +0 -0
  367. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/windows/env_reset.py +0 -0
  368. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/windows/env_setup.py +0 -0
  369. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/windows/exfil_helpers.py +0 -0
  370. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/windows/helpers.py +0 -0
  371. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/zoom/__init__.py +0 -0
  372. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/dt_arena/utils/zoom/helpers.py +0 -0
  373. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/eval/__init__.py +0 -0
  374. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/eval/_ui.py +0 -0
  375. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/eval/task_runner.py +0 -0
  376. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/setup.cfg +0 -0
  377. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/__init__.py +0 -0
  378. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/a2a_helpers.py +0 -0
  379. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/agent_helpers.py +0 -0
  380. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/agent_wrapper.py +0 -0
  381. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/compose_utils.py +0 -0
  382. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/config.py +0 -0
  383. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/env_helpers.py +0 -0
  384. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/eval_stats.py +0 -0
  385. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/injection_a2a_helpers.py +0 -0
  386. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/injection_helpers.py +0 -0
  387. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/injection_mcp_helpers.py +0 -0
  388. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/judge_helpers.py +0 -0
  389. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/judge_utils.py +0 -0
  390. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/llm.py +0 -0
  391. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/logging.py +0 -0
  392. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/mcp_helpers.py +0 -0
  393. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/mcp_manager.py +0 -0
  394. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/memory_guard.py +0 -0
  395. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/red_teaming_sandbox.py +0 -0
  396. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/reset_helpers.py +0 -0
  397. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/resource_manager.py +0 -0
  398. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/skill_helpers.py +0 -0
  399. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/task_executor.py +0 -0
  400. {decodingtrust_agent_sdk-0.2.3 → decodingtrust_agent_sdk-0.2.6}/utils/task_helpers.py +0 -0
  401. {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
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
@@ -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
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
@@ -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: postgres:14
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", "psql -U sandbox -d whatsapp_sandbox -c 'SELECT 1 FROM users LIMIT 1' > /dev/null 2>&1 || exit 1"]
16
+ test: ["CMD-SHELL", "pg_isready -U sandbox -d whatsapp_sandbox"]
19
17
  interval: 5s
20
18
  timeout: 5s
21
- retries: 30
22
- start_period: 60s
19
+ retries: 20
20
+ start_period: 30s
23
21
  restart: unless-stopped
24
22
 
25
23
  whatsapp-api:
26
- image: decodingtrustagent/whatsapp:api-local
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
@@ -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
- mcp = FastMCP("Gmail Client")
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
- # Check if user is in To or Cc
393
- to_addrs = _addresses_from_field(m.get("To") or m.get("to"))
394
- cc_addrs = _addresses_from_field(m.get("Cc") or m.get("cc"))
395
- all_recipients = [a.lower() for a in to_addrs + cc_addrs]
396
- if user_email_lower in all_recipients:
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 attachment objects with filename, content type, and size information
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]) -> Dict[str, 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) -> str:
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: