solace-agent-mesh 1.6.3__py3-none-any.whl → 1.7.1__py3-none-any.whl

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.

Potentially problematic release.


This version of solace-agent-mesh might be problematic. Click here for more details.

Files changed (244) hide show
  1. solace_agent_mesh/agent/adk/adk_llm.txt +12 -18
  2. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +1 -1
  3. solace_agent_mesh/agent/adk/callbacks.py +138 -20
  4. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +2 -0
  5. solace_agent_mesh/agent/adk/models/lite_llm.py +38 -5
  6. solace_agent_mesh/agent/adk/models/models_llm.txt +82 -35
  7. solace_agent_mesh/agent/adk/runner.py +9 -0
  8. solace_agent_mesh/agent/adk/stream_parser.py +6 -1
  9. solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
  10. solace_agent_mesh/agent/agent_llm.txt +61 -70
  11. solace_agent_mesh/agent/protocol/event_handlers.py +29 -1
  12. solace_agent_mesh/agent/protocol/protocol_llm.txt +1 -1
  13. solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +190 -0
  14. solace_agent_mesh/agent/proxies/base/base_llm.txt +148 -0
  15. solace_agent_mesh/agent/proxies/proxies_llm.txt +283 -0
  16. solace_agent_mesh/agent/sac/app.py +22 -0
  17. solace_agent_mesh/agent/sac/component.py +76 -40
  18. solace_agent_mesh/agent/sac/sac_llm.txt +1 -1
  19. solace_agent_mesh/agent/sac/task_execution_context.py +21 -0
  20. solace_agent_mesh/agent/testing/testing_llm.txt +2 -1
  21. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +13 -148
  22. solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
  23. solace_agent_mesh/agent/tools/tools_llm.txt +93 -80
  24. solace_agent_mesh/agent/tools/tools_llm_detail.txt +3 -2
  25. solace_agent_mesh/agent/utils/artifact_helpers.py +4 -0
  26. solace_agent_mesh/agent/utils/utils_llm.txt +16 -2
  27. solace_agent_mesh/assets/docs/404.html +3 -3
  28. solace_agent_mesh/assets/docs/assets/js/05749d90.c70b2be9.js +1 -0
  29. solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +1 -0
  30. solace_agent_mesh/assets/docs/assets/js/15e40e79.36003774.js +1 -0
  31. solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
  32. solace_agent_mesh/assets/docs/assets/js/3ac1795d.e4870a49.js +1 -0
  33. solace_agent_mesh/assets/docs/assets/js/3ff0015d.b63ee53a.js +1 -0
  34. solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +1 -0
  35. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.45b32c2b.js +1 -0
  36. solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
  37. solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +1 -0
  38. solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
  39. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
  40. solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
  41. solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +1 -0
  42. solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
  43. solace_agent_mesh/assets/docs/assets/js/94e8668d.09ed9234.js +1 -0
  44. solace_agent_mesh/assets/docs/assets/js/{ab9708a8.3e6dd091.js → ab9708a8.245ae0ef.js} +1 -1
  45. solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
  46. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.f902fad8.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/e04b235d.c9c50c7b.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/e3d9abda.d11c67a7.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/{e6f9706b.e74a984d.js → e6f9706b.045d0fa1.js} +1 -1
  55. solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/f284c35a.5099c51e.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/main.f213fe0c.js +2 -0
  59. solace_agent_mesh/assets/docs/assets/js/runtime~main.d9606d6a.js +1 -0
  60. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +4 -4
  61. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +4 -4
  62. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +4 -4
  63. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +4 -4
  64. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +18 -4
  65. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +4 -4
  66. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +4 -4
  67. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +5 -5
  68. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +4 -4
  69. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +4 -4
  70. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +4 -4
  71. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +196 -0
  72. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +4 -4
  73. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +5 -5
  74. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +6 -7
  75. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +4 -4
  76. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +47 -0
  77. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +4 -4
  78. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +4 -4
  79. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +4 -4
  80. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +160 -169
  81. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +4 -4
  82. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +4 -4
  83. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +4 -4
  84. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +4 -4
  85. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +4 -4
  86. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +4 -4
  87. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +5 -5
  88. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +4 -4
  89. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +4 -4
  90. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +4 -4
  91. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +4 -4
  92. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +4 -4
  93. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +4 -4
  94. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +4 -4
  95. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +59 -0
  96. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +62 -0
  97. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +10 -6
  98. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +4 -4
  99. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +4 -4
  100. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
  101. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +27 -4
  102. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
  103. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +4 -4
  104. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +5 -4
  105. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +3 -3
  106. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +3 -3
  107. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +290 -0
  108. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +9 -9
  109. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +4 -4
  110. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +4 -4
  111. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +4 -4
  112. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +4 -4
  113. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
  114. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
  115. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +3 -3
  116. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +3 -3
  117. solace_agent_mesh/assets/docs/lunr-index-1762283454666.json +1 -0
  118. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  119. solace_agent_mesh/assets/docs/search-doc-1762283454666.json +1 -0
  120. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  121. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  122. solace_agent_mesh/cli/__init__.py +1 -1
  123. solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
  124. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +1 -1
  125. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-D4_RMYRh.js → authCallback-tcIFZLis.js} +1 -1
  126. solace_agent_mesh/client/webui/frontend/static/assets/{client-UZ3qU6Bq.js → client-CRYdKo2Q.js} +3 -3
  127. solace_agent_mesh/client/webui/frontend/static/assets/main-CojeY_1w.css +1 -0
  128. solace_agent_mesh/client/webui/frontend/static/assets/main-ILja9MCG.js +353 -0
  129. solace_agent_mesh/client/webui/frontend/static/assets/vendor-CINwxvwV.js +470 -0
  130. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  131. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  132. solace_agent_mesh/common/a2a/a2a_llm.txt +13 -20
  133. solace_agent_mesh/common/a2a/protocol.py +5 -0
  134. solace_agent_mesh/common/a2a/types.py +1 -0
  135. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +49 -11
  136. solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
  137. solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
  138. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +26 -9
  139. solace_agent_mesh/common/common_llm.txt +13 -34
  140. solace_agent_mesh/common/data_parts.py +20 -4
  141. solace_agent_mesh/common/middleware/middleware_llm.txt +1 -1
  142. solace_agent_mesh/common/sac/sac_llm.txt +1 -1
  143. solace_agent_mesh/common/sam_events/sam_events_llm.txt +1 -1
  144. solace_agent_mesh/common/services/employee_service.py +1 -1
  145. solace_agent_mesh/common/services/providers/providers_llm.txt +3 -2
  146. solace_agent_mesh/common/services/services_llm.txt +9 -4
  147. solace_agent_mesh/common/utils/embeds/constants.py +1 -0
  148. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +1 -1
  149. solace_agent_mesh/common/utils/embeds/modifiers.py +2 -1
  150. solace_agent_mesh/common/utils/embeds/resolver.py +58 -6
  151. solace_agent_mesh/common/utils/embeds/types.py +8 -0
  152. solace_agent_mesh/common/utils/utils_llm.txt +5 -6
  153. solace_agent_mesh/core_a2a/core_a2a_llm.txt +1 -1
  154. solace_agent_mesh/gateway/adapter/__init__.py +1 -0
  155. solace_agent_mesh/gateway/adapter/base.py +143 -0
  156. solace_agent_mesh/gateway/adapter/types.py +221 -0
  157. solace_agent_mesh/gateway/base/app.py +29 -2
  158. solace_agent_mesh/gateway/base/base_llm.txt +10 -8
  159. solace_agent_mesh/gateway/base/component.py +573 -142
  160. solace_agent_mesh/gateway/gateway_llm.txt +55 -59
  161. solace_agent_mesh/gateway/generic/__init__.py +1 -0
  162. solace_agent_mesh/gateway/generic/app.py +50 -0
  163. solace_agent_mesh/gateway/generic/component.py +650 -0
  164. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +99 -49
  165. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_fulltext_search_indexes.py +92 -0
  166. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
  167. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +150 -0
  168. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
  169. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
  170. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +26 -20
  171. solace_agent_mesh/gateway/http_sse/app.py +0 -14
  172. solace_agent_mesh/gateway/http_sse/component.py +17 -56
  173. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +1 -1
  174. solace_agent_mesh/gateway/http_sse/dependencies.py +21 -3
  175. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +8 -8
  176. solace_agent_mesh/gateway/http_sse/main.py +23 -5
  177. solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
  178. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +56 -98
  179. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
  180. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
  181. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +23 -1
  182. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
  183. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +112 -4
  184. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +9 -1
  185. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +51 -60
  186. solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
  187. solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
  188. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +7 -1
  189. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
  190. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
  191. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +125 -157
  192. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +269 -8
  193. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +143 -51
  194. solace_agent_mesh/gateway/http_sse/routers/config.py +69 -0
  195. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +198 -94
  196. solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
  197. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +68 -18
  198. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +13 -0
  199. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +30 -0
  200. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +51 -35
  201. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +2 -0
  202. solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
  203. solace_agent_mesh/gateway/http_sse/routers/projects.py +542 -0
  204. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +9 -11
  205. solace_agent_mesh/gateway/http_sse/routers/sessions.py +154 -3
  206. solace_agent_mesh/gateway/http_sse/routers/tasks.py +296 -4
  207. solace_agent_mesh/gateway/http_sse/services/project_service.py +403 -0
  208. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +16 -10
  209. solace_agent_mesh/gateway/http_sse/services/session_service.py +178 -6
  210. solace_agent_mesh/gateway/http_sse/shared/exception_handlers.py +2 -3
  211. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +48 -14
  212. solace_agent_mesh/solace_agent_mesh_llm.txt +1 -1
  213. {solace_agent_mesh-1.6.3.dist-info → solace_agent_mesh-1.7.1.dist-info}/METADATA +3 -5
  214. {solace_agent_mesh-1.6.3.dist-info → solace_agent_mesh-1.7.1.dist-info}/RECORD +218 -175
  215. solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
  216. solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
  217. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
  218. solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
  219. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
  220. solace_agent_mesh/assets/docs/assets/js/631738c7.7c4594c9.js +0 -1
  221. solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
  222. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
  223. solace_agent_mesh/assets/docs/assets/js/71da7b71.ddbdfbe2.js +0 -1
  224. solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
  225. solace_agent_mesh/assets/docs/assets/js/94e8668d.3b883666.js +0 -1
  226. solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
  227. solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
  228. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
  229. solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
  230. solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
  231. solace_agent_mesh/assets/docs/assets/js/e92d0134.4f395c6b.js +0 -1
  232. solace_agent_mesh/assets/docs/assets/js/f284c35a.720d2ef2.js +0 -1
  233. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
  234. solace_agent_mesh/assets/docs/assets/js/main.ed05b14d.js +0 -2
  235. solace_agent_mesh/assets/docs/assets/js/runtime~main.a8a75e0b.js +0 -1
  236. solace_agent_mesh/assets/docs/lunr-index-1761744323675.json +0 -1
  237. solace_agent_mesh/assets/docs/search-doc-1761744323675.json +0 -1
  238. solace_agent_mesh/client/webui/frontend/static/assets/main--3yJYl7S.css +0 -1
  239. solace_agent_mesh/client/webui/frontend/static/assets/main-DojKHS49.js +0 -342
  240. solace_agent_mesh/client/webui/frontend/static/assets/vendor-DSqhjwq_.js +0 -405
  241. /solace_agent_mesh/assets/docs/assets/js/{main.ed05b14d.js.LICENSE.txt → main.f213fe0c.js.LICENSE.txt} +0 -0
  242. {solace_agent_mesh-1.6.3.dist-info → solace_agent_mesh-1.7.1.dist-info}/WHEEL +0 -0
  243. {solace_agent_mesh-1.6.3.dist-info → solace_agent_mesh-1.7.1.dist-info}/entry_points.txt +0 -0
  244. {solace_agent_mesh-1.6.3.dist-info → solace_agent_mesh-1.7.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,283 @@
1
+ # DEVELOPER GUIDE: proxies
2
+
3
+ ## Quick Summary
4
+ The `proxies` directory provides a framework for creating proxy applications that enable the Solace Agent Mesh to communicate with downstream agents using various protocols. It consists of protocol-agnostic base classes in the `base/` subdirectory that handle common functionality like message routing, agent discovery, and task management, plus concrete implementations like `a2a/` for A2A-over-HTTPS protocol support.
5
+
6
+ ## Files and Subdirectories Overview
7
+ - **Direct files:**
8
+ - `__init__.py` - Empty package initialization file
9
+ - **Subdirectories:**
10
+ - `base/` - Abstract base classes for proxy applications and components with common functionality
11
+ - `a2a/` - Concrete implementation for proxying A2A-over-HTTPS agents with authentication support
12
+
13
+ ## Developer API Reference
14
+
15
+ ### Direct Files
16
+
17
+ #### __init__.py
18
+ **Purpose:** Package initialization (empty file)
19
+ **Import:** `from solace_agent_mesh.agent.proxies import *`
20
+
21
+ No public API - this is an empty initialization file.
22
+
23
+ ### Subdirectory APIs
24
+
25
+ #### base/
26
+ **Purpose:** Provides abstract base classes and configuration models for building proxy applications
27
+ **Key Exports:** BaseProxyApp, BaseProxyComponent, BaseProxyAppConfig, ProxyTaskContext
28
+ **Import Examples:**
29
+ ```python
30
+ from solace_agent_mesh.agent.proxies.base.app import BaseProxyApp
31
+ from solace_agent_mesh.agent.proxies.base.component import BaseProxyComponent
32
+ from solace_agent_mesh.agent.proxies.base.config import BaseProxyAppConfig, ProxiedAgentConfig
33
+ from solace_agent_mesh.agent.proxies.base.proxy_task_context import ProxyTaskContext
34
+ ```
35
+
36
+ #### a2a/
37
+ **Purpose:** Concrete implementation for proxying A2A-over-HTTPS agents with OAuth 2.0 and static authentication
38
+ **Key Exports:** A2AProxyApp, A2AProxyComponent, A2AProxyAppConfig, OAuth2TokenCache
39
+ **Import Examples:**
40
+ ```python
41
+ from solace_agent_mesh.agent.proxies.a2a.app import A2AProxyApp
42
+ from solace_agent_mesh.agent.proxies.a2a.component import A2AProxyComponent
43
+ from solace_agent_mesh.agent.proxies.a2a.config import A2AProxyAppConfig, AuthenticationConfig
44
+ from solace_agent_mesh.agent.proxies.a2a.oauth_token_cache import OAuth2TokenCache
45
+ ```
46
+
47
+ ## Complete Usage Guide
48
+
49
+ ### 1. Creating a Custom Proxy Implementation
50
+
51
+ To create a new proxy for a different protocol, extend the base classes:
52
+
53
+ ```python
54
+ from solace_agent_mesh.agent.proxies.base.app import BaseProxyApp
55
+ from solace_agent_mesh.agent.proxies.base.component import BaseProxyComponent
56
+ from solace_agent_mesh.agent.proxies.base.config import BaseProxyAppConfig
57
+ from a2a.types import AgentCard, A2ARequest
58
+ from typing import Optional
59
+
60
+ # Custom configuration (extend BaseProxyAppConfig)
61
+ class MyProxyAppConfig(BaseProxyAppConfig):
62
+ custom_setting: str = "default_value"
63
+
64
+ # Custom component implementation
65
+ class MyProxyComponent(BaseProxyComponent):
66
+ async def _fetch_agent_card(self, agent_config: dict) -> Optional[AgentCard]:
67
+ # Implement protocol-specific agent discovery
68
+ url = agent_config.get("url")
69
+ # Make HTTP request to get agent capabilities
70
+ # Return AgentCard with agent information
71
+ pass
72
+
73
+ async def _forward_request(self, task_context, request: A2ARequest, agent_name: str):
74
+ # Implement protocol-specific request forwarding
75
+ # Forward request to downstream agent
76
+ # Handle response and publish back to Solace
77
+ pass
78
+
79
+ # Custom app class
80
+ class MyProxyApp(BaseProxyApp):
81
+ def _get_component_class(self):
82
+ return MyProxyComponent
83
+ ```
84
+
85
+ ### 2. Using the A2A Proxy Implementation
86
+
87
+ The most common use case is using the built-in A2A proxy:
88
+
89
+ ```python
90
+ from solace_agent_mesh.agent.proxies.a2a.app import A2AProxyApp
91
+ from solace_agent_mesh.agent.proxies.a2a.config import A2AProxyAppConfig, AuthenticationConfig
92
+
93
+ # Configuration with OAuth 2.0 authentication
94
+ app_info = {
95
+ "app_config": {
96
+ "namespace": "myorg/production",
97
+ "proxied_agents": [
98
+ {
99
+ "name": "external-agent",
100
+ "url": "https://external-agent.example.com",
101
+ "request_timeout_seconds": 120,
102
+ "authentication": {
103
+ "type": "oauth2_client_credentials",
104
+ "token_url": "https://auth.example.com/oauth/token",
105
+ "client_id": "my-client-id",
106
+ "client_secret": "my-client-secret",
107
+ "scope": "agent:read agent:write",
108
+ "token_cache_duration_seconds": 3300
109
+ }
110
+ },
111
+ {
112
+ "name": "api-key-agent",
113
+ "url": "https://api-agent.example.com",
114
+ "authentication": {
115
+ "type": "static_bearer",
116
+ "token": "my-api-key"
117
+ }
118
+ }
119
+ ],
120
+ "artifact_service": {
121
+ "type": "gcs",
122
+ "bucket_name": "my-artifacts-bucket",
123
+ "artifact_scope": "namespace"
124
+ },
125
+ "discovery_interval_seconds": 30,
126
+ "default_request_timeout_seconds": 300
127
+ }
128
+ }
129
+
130
+ # Create and run the proxy app
131
+ app = A2AProxyApp(app_info)
132
+ # App automatically handles Solace subscriptions and agent discovery
133
+ ```
134
+
135
+ ### 3. Working with Authentication
136
+
137
+ The A2A proxy supports multiple authentication methods:
138
+
139
+ ```python
140
+ from solace_agent_mesh.agent.proxies.a2a.config import AuthenticationConfig
141
+
142
+ # OAuth 2.0 Client Credentials
143
+ oauth_auth = AuthenticationConfig(
144
+ type="oauth2_client_credentials",
145
+ token_url="https://auth.provider.com/token",
146
+ client_id="client123",
147
+ client_secret="secret456",
148
+ scope="read write",
149
+ token_cache_duration_seconds=3300 # Cache for 55 minutes
150
+ )
151
+
152
+ # Static Bearer Token
153
+ bearer_auth = AuthenticationConfig(
154
+ type="static_bearer",
155
+ token="Bearer abc123xyz"
156
+ )
157
+
158
+ # Static API Key
159
+ apikey_auth = AuthenticationConfig(
160
+ type="static_apikey",
161
+ token="api-key-value"
162
+ )
163
+ ```
164
+
165
+ ### 4. Managing OAuth Token Cache
166
+
167
+ For OAuth 2.0 authentication, tokens are automatically cached:
168
+
169
+ ```python
170
+ from solace_agent_mesh.agent.proxies.a2a.oauth_token_cache import OAuth2TokenCache
171
+ from solace_agent_mesh.agent.proxies.a2a.component import A2AProxyComponent
172
+
173
+ # Access the component to manage cache
174
+ component = A2AProxyComponent(proxied_agents_config=config)
175
+
176
+ # Clear all cached tokens (useful for testing or credential rotation)
177
+ component.clear_client_cache()
178
+
179
+ # Direct cache usage (advanced)
180
+ cache = OAuth2TokenCache()
181
+ await cache.set("agent-name", "access_token", 3600)
182
+ token = await cache.get("agent-name")
183
+ await cache.invalidate("agent-name")
184
+ ```
185
+
186
+ ### 5. Task Context and Lifecycle Management
187
+
188
+ The proxy framework automatically manages task contexts:
189
+
190
+ ```python
191
+ from solace_agent_mesh.agent.proxies.base.proxy_task_context import ProxyTaskContext
192
+
193
+ # Task contexts are created automatically when requests arrive
194
+ # They contain A2A protocol information and task state
195
+ task_context = ProxyTaskContext(
196
+ task_id="unique-task-id",
197
+ a2a_context={
198
+ "jsonrpc_request_id": "req-123",
199
+ "logical_task_id": "task-456",
200
+ "session_id": "session-789",
201
+ "user_id": "user123",
202
+ "status_topic": "status/myorg/production/external-agent",
203
+ "reply_to_topic": "reply/myorg/production/external-agent",
204
+ "is_streaming": False
205
+ }
206
+ )
207
+
208
+ # Access task information in custom components
209
+ print(f"Handling task: {task_context.task_id}")
210
+ print(f"User: {task_context.a2a_context['user_id']}")
211
+ ```
212
+
213
+ ### 6. Configuration Validation
214
+
215
+ All proxy configurations use Pydantic for validation:
216
+
217
+ ```python
218
+ from solace_agent_mesh.agent.proxies.a2a.config import A2AProxyAppConfig
219
+ from pydantic import ValidationError
220
+
221
+ try:
222
+ config = A2AProxyAppConfig.model_validate({
223
+ "namespace": "myorg/dev",
224
+ "proxied_agents": [
225
+ {
226
+ "name": "test-agent",
227
+ "url": "https://agent.example.com",
228
+ "authentication": {
229
+ "type": "oauth2_client_credentials",
230
+ "token_url": "https://auth.example.com/token",
231
+ "client_id": "client123"
232
+ # Missing client_secret - will cause validation error
233
+ }
234
+ }
235
+ ]
236
+ })
237
+ except ValidationError as e:
238
+ print(f"Configuration error: {e}")
239
+ ```
240
+
241
+ ### 7. Integration Patterns
242
+
243
+ Common patterns for integrating proxies into larger applications:
244
+
245
+ ```python
246
+ # Pattern 1: Direct instantiation
247
+ from solace_agent_mesh.agent.proxies.a2a.app import A2AProxyApp
248
+
249
+ app = A2AProxyApp(app_info)
250
+ # App handles its own lifecycle
251
+
252
+ # Pattern 2: Component access for advanced control
253
+ from solace_agent_mesh.agent.proxies.a2a.component import A2AProxyComponent
254
+
255
+ component = A2AProxyComponent(
256
+ proxied_agents_config=config["proxied_agents"],
257
+ namespace=config["namespace"],
258
+ # ... other broker settings
259
+ )
260
+
261
+ # Manual lifecycle management
262
+ await component.run()
263
+ # ... application logic
264
+ await component.cleanup()
265
+
266
+ # Pattern 3: Custom proxy with base classes
267
+ class CustomProtocolProxy(BaseProxyComponent):
268
+ def __init__(self, **kwargs):
269
+ super().__init__(**kwargs)
270
+ self.custom_clients = {}
271
+
272
+ async def _fetch_agent_card(self, agent_config):
273
+ # Custom discovery logic
274
+ pass
275
+
276
+ async def _forward_request(self, task_context, request, agent_name):
277
+ # Custom forwarding logic
278
+ pass
279
+ ```
280
+
281
+ This comprehensive guide covers all the main use cases for the proxies directory, from using the built-in A2A proxy to creating custom proxy implementations for new protocols.
282
+
283
+ # content_hash: 2f19070457fccc3f5c8f680f44788fb63495f9ea3b3da7d71ddb5a52f8f5b0f6
@@ -551,3 +551,25 @@ class SamAgentApp(App):
551
551
 
552
552
  super().__init__(app_info, **kwargs)
553
553
  log.debug("%s Agent initialization complete.", agent_name)
554
+
555
+ def get_component(self, component_name: str = None) -> "SamAgentComponent":
556
+ """
557
+ Retrieves the running SamAgentComponent instance from the app's flow.
558
+
559
+ Args:
560
+ component_name: Optional component name (for compatibility, but ignored since there's only one component)
561
+
562
+ Returns:
563
+ The SamAgentComponent instance or None if not found
564
+ """
565
+ if self.flows and self.flows[0].component_groups:
566
+ for group in self.flows[0].component_groups:
567
+ for component_wrapper in group:
568
+ component = (
569
+ component_wrapper.component
570
+ if hasattr(component_wrapper, "component")
571
+ else component_wrapper
572
+ )
573
+ if isinstance(component, SamAgentComponent):
574
+ return component
575
+ return None
@@ -129,7 +129,7 @@ class SamAgentComponent(SamComponentBase):
129
129
  super().__init__(info, **kwargs)
130
130
  self.agent_name = self.get_config("agent_name")
131
131
  log.info("%s Initializing agent: %s (A2A ADK Host Component)...", self.log_identifier, self.agent_name)
132
-
132
+
133
133
  # Initialize the agent registry for health tracking
134
134
  self.agent_registry = AgentRegistry()
135
135
  try:
@@ -437,9 +437,11 @@ class SamAgentComponent(SamComponentBase):
437
437
  "%s Agent card publishing interval not configured or invalid, card will not be published periodically.",
438
438
  self.log_identifier,
439
439
  )
440
-
440
+
441
441
  # Set up health check timer if enabled
442
- health_check_interval_seconds = self.agent_discovery_config.get("health_check_interval_seconds", HEALTH_CHECK_INTERVAL_SECONDS)
442
+ health_check_interval_seconds = self.agent_discovery_config.get(
443
+ "health_check_interval_seconds", HEALTH_CHECK_INTERVAL_SECONDS
444
+ )
443
445
  if health_check_interval_seconds > 0:
444
446
  log.info(
445
447
  "%s Scheduling agent health check every %d seconds.",
@@ -457,7 +459,7 @@ class SamAgentComponent(SamComponentBase):
457
459
  "%s Agent health check interval not configured or invalid, health checks will not run periodically.",
458
460
  self.log_identifier,
459
461
  )
460
-
462
+
461
463
  log.info(
462
464
  "%s Initialized agent: %s",
463
465
  self.log_identifier,
@@ -497,6 +499,16 @@ class SamAgentComponent(SamComponentBase):
497
499
  event = Event(EventType.MESSAGE, message)
498
500
  await process_event(self, event)
499
501
 
502
+ def handle_timer_event(self, timer_data: Dict[str, Any]):
503
+ """Handles timer events for agent card publishing and health checks."""
504
+ log.debug("%s Received timer event: %s", self.log_identifier, timer_data)
505
+ timer_id = timer_data.get("timer_id")
506
+
507
+ if timer_id == self._card_publish_timer_id:
508
+ publish_agent_card(self)
509
+ elif timer_id == self.HEALTH_CHECK_TIMER_ID:
510
+ self._check_agent_health()
511
+
500
512
  async def handle_cache_expiry_event(self, cache_data: Dict[str, Any]):
501
513
  """
502
514
  Handles cache expiry events for peer timeouts by calling the atomic claim helper.
@@ -743,6 +755,14 @@ class SamAgentComponent(SamComponentBase):
743
755
  paused_invocation_id = correlation_data.get("invocation_id")
744
756
  log_retrigger = f"{self.log_identifier}[RetriggerManager:{logical_task_id}]"
745
757
 
758
+ # Clear paused state - task is resuming now
759
+ task_context.set_paused(False)
760
+ log.debug(
761
+ "%s Task %s resuming from paused state with peer responses.",
762
+ log_retrigger,
763
+ logical_task_id,
764
+ )
765
+
746
766
  try:
747
767
  effective_session_id = original_task_context.get("effective_session_id")
748
768
  user_id = original_task_context.get("user_id")
@@ -1872,7 +1892,7 @@ class SamAgentComponent(SamComponentBase):
1872
1892
  log_id,
1873
1893
  len(signals_found),
1874
1894
  )
1875
- for _signal_index, signal_data_tuple in signals_found:
1895
+ for _signal_index, signal_data_tuple, _placeholder in signals_found:
1876
1896
  if (
1877
1897
  isinstance(signal_data_tuple, tuple)
1878
1898
  and len(signal_data_tuple) == 3
@@ -1888,6 +1908,7 @@ class SamAgentComponent(SamComponentBase):
1888
1908
  await self._publish_agent_status_signal_update(
1889
1909
  status_text, a2a_context
1890
1910
  )
1911
+ resolved_text = resolved_text.replace(_placeholder, "")
1891
1912
 
1892
1913
  return resolved_text, unprocessed_tail
1893
1914
 
@@ -3308,79 +3329,93 @@ class SamAgentComponent(SamComponentBase):
3308
3329
  For now, using the agent name, but could be made more robust (e.g., hostname + agent name).
3309
3330
  """
3310
3331
  return self.agent_name
3311
-
3332
+
3312
3333
  def _check_agent_health(self):
3313
3334
  """
3314
3335
  Checks the health of peer agents and de-registers unresponsive ones.
3315
3336
  This is called periodically by the health check timer.
3316
3337
  Uses TTL-based expiration to determine if an agent is unresponsive.
3317
3338
  """
3318
-
3339
+
3319
3340
  log.debug("%s Performing agent health check...", self.log_identifier)
3320
-
3321
- ttl_seconds = self.agent_discovery_config.get("health_check_ttl_seconds", HEALTH_CHECK_TTL_SECONDS)
3322
- health_check_interval = self.agent_discovery_config.get("health_check_interval_seconds", HEALTH_CHECK_INTERVAL_SECONDS)
3323
-
3341
+
3342
+ ttl_seconds = self.agent_discovery_config.get(
3343
+ "health_check_ttl_seconds", HEALTH_CHECK_TTL_SECONDS
3344
+ )
3345
+ health_check_interval = self.agent_discovery_config.get(
3346
+ "health_check_interval_seconds", HEALTH_CHECK_INTERVAL_SECONDS
3347
+ )
3348
+
3324
3349
  log.debug(
3325
3350
  "%s Health check configuration: interval=%d seconds, TTL=%d seconds",
3326
3351
  self.log_identifier,
3327
3352
  health_check_interval,
3328
- ttl_seconds
3353
+ ttl_seconds,
3329
3354
  )
3330
3355
 
3331
3356
  # Validate configuration values
3332
- if ttl_seconds <= 0 or health_check_interval <= 0 or ttl_seconds < health_check_interval:
3357
+ if (
3358
+ ttl_seconds <= 0
3359
+ or health_check_interval <= 0
3360
+ or ttl_seconds < health_check_interval
3361
+ ):
3333
3362
  log.error(
3334
3363
  "%s agent_health_check_ttl_seconds (%d) and agent_health_check_interval_seconds (%d) must be positive and TTL must be greater than interval.",
3335
3364
  self.log_identifier,
3336
3365
  ttl_seconds,
3337
- health_check_interval
3366
+ health_check_interval,
3367
+ )
3368
+ raise ValueError(
3369
+ f"Invalid health check configuration. agent_health_check_ttl_seconds ({ttl_seconds}) and agent_health_check_interval_seconds ({health_check_interval}) must be positive and TTL must be greater than interval."
3338
3370
  )
3339
- raise ValueError(f"Invalid health check configuration. agent_health_check_ttl_seconds ({ttl_seconds}) and agent_health_check_interval_seconds ({health_check_interval}) must be positive and TTL must be greater than interval.")
3340
-
3371
+
3341
3372
  # Get all agent names from the registry
3342
3373
  agent_names = self.agent_registry.get_agent_names()
3343
3374
  total_agents = len(agent_names)
3344
3375
  agents_to_deregister = []
3345
-
3346
- log.debug("%s Checking health of %d peer agents", self.log_identifier, total_agents)
3347
-
3376
+
3377
+ log.debug(
3378
+ "%s Checking health of %d peer agents", self.log_identifier, total_agents
3379
+ )
3380
+
3348
3381
  for agent_name in agent_names:
3349
3382
  # Skip our own agent
3350
3383
  if agent_name == self.agent_name:
3351
3384
  continue
3352
-
3385
+
3353
3386
  # Check if the agent's TTL has expired
3354
- is_expired, time_since_last_seen = self.agent_registry.check_ttl_expired(agent_name, ttl_seconds)
3355
-
3387
+ is_expired, time_since_last_seen = self.agent_registry.check_ttl_expired(
3388
+ agent_name, ttl_seconds
3389
+ )
3390
+
3356
3391
  if is_expired:
3357
3392
  log.warning(
3358
3393
  "%s Agent '%s' TTL has expired. De-registering. Time since last seen: %d seconds (TTL: %d seconds)",
3359
3394
  self.log_identifier,
3360
3395
  agent_name,
3361
3396
  time_since_last_seen,
3362
- ttl_seconds
3397
+ ttl_seconds,
3363
3398
  )
3364
3399
  agents_to_deregister.append(agent_name)
3365
-
3400
+
3366
3401
  # De-register unresponsive agents
3367
3402
  for agent_name in agents_to_deregister:
3368
3403
  self._deregister_agent(agent_name)
3369
-
3404
+
3370
3405
  log.debug(
3371
3406
  "%s Agent health check completed. Total agents: %d, De-registered: %d",
3372
3407
  self.log_identifier,
3373
3408
  total_agents,
3374
- len(agents_to_deregister)
3409
+ len(agents_to_deregister),
3375
3410
  )
3376
-
3411
+
3377
3412
  def _deregister_agent(self, agent_name: str):
3378
3413
  """
3379
3414
  De-registers an agent from the registry and publishes a de-registration event.
3380
3415
  """
3381
3416
  # Remove from registry
3382
3417
  registry_removed = self.agent_registry.remove_agent(agent_name)
3383
-
3418
+
3384
3419
  # Always remove from peer_agents regardless of registry result
3385
3420
  peer_removed = False
3386
3421
  if agent_name in self.peer_agents:
@@ -3389,18 +3424,18 @@ class SamAgentComponent(SamComponentBase):
3389
3424
  log.info(
3390
3425
  "%s Removed agent '%s' from peer_agents dictionary",
3391
3426
  self.log_identifier,
3392
- agent_name
3427
+ agent_name,
3393
3428
  )
3394
-
3429
+
3395
3430
  # Publish de-registration event if agent was in either data structure
3396
3431
  if registry_removed or peer_removed:
3397
3432
  try:
3398
3433
  # Create a de-registration event topic
3399
3434
  namespace = self.get_config("namespace")
3400
3435
  deregistration_topic = f"{namespace}/a2a/events/agent/deregistered"
3401
-
3436
+
3402
3437
  current_time = time.time()
3403
-
3438
+
3404
3439
  # Create the payload
3405
3440
  deregistration_payload = {
3406
3441
  "event_type": "agent.deregistered",
@@ -3408,28 +3443,27 @@ class SamAgentComponent(SamComponentBase):
3408
3443
  "reason": "health_check_failure",
3409
3444
  "metadata": {
3410
3445
  "timestamp": current_time,
3411
- "deregistered_by": self.agent_name
3412
- }
3446
+ "deregistered_by": self.agent_name,
3447
+ },
3413
3448
  }
3414
-
3449
+
3415
3450
  # Publish the event
3416
3451
  self.publish_a2a_message(
3417
- payload=deregistration_payload,
3418
- topic=deregistration_topic
3452
+ payload=deregistration_payload, topic=deregistration_topic
3419
3453
  )
3420
-
3454
+
3421
3455
  log.info(
3422
3456
  "%s Published de-registration event for agent '%s' to topic '%s'",
3423
3457
  self.log_identifier,
3424
3458
  agent_name,
3425
- deregistration_topic
3459
+ deregistration_topic,
3426
3460
  )
3427
3461
  except Exception as e:
3428
3462
  log.error(
3429
3463
  "%s Failed to publish de-registration event for agent '%s': %s",
3430
3464
  self.log_identifier,
3431
3465
  agent_name,
3432
- e
3466
+ e,
3433
3467
  )
3434
3468
 
3435
3469
  async def _resolve_early_embeds_and_handle_signals(
@@ -3485,6 +3519,7 @@ class SamAgentComponent(SamComponentBase):
3485
3519
 
3486
3520
  try:
3487
3521
  from ...common.utils.embeds.constants import EARLY_EMBED_TYPES
3522
+ from ...common.utils.embeds.types import ResolutionMode
3488
3523
  from ...common.utils.embeds.resolver import (
3489
3524
  evaluate_embed,
3490
3525
  resolve_embeds_in_string,
@@ -3496,6 +3531,7 @@ class SamAgentComponent(SamComponentBase):
3496
3531
  context=context_for_embeds,
3497
3532
  resolver_func=evaluate_embed,
3498
3533
  types_to_resolve=EARLY_EMBED_TYPES,
3534
+ resolution_mode=ResolutionMode.TOOL_PARAMETER,
3499
3535
  log_identifier=method_context_log_identifier,
3500
3536
  config=resolver_config,
3501
3537
  )
@@ -186,4 +186,4 @@ usage = task_context.get_token_usage_summary()
186
186
  print(f"Total tokens used: {usage['total_tokens']}")
187
187
  ```
188
188
 
189
- # content_hash: 27b0000d250131d578d28ab8c4d06c2e2084d888b47102e9b3b133adbc61a169
189
+ # content_hash: c80bf39278c35fcb73e1df4421b631aabbdb4ba330e8be028fb8a29e097c3fad
@@ -36,6 +36,7 @@ class TaskExecutionContext:
36
36
  self.artifact_signals_to_return: List[Dict[str, Any]] = []
37
37
  self.event_loop: Optional[asyncio.AbstractEventLoop] = None
38
38
  self.lock: threading.Lock = threading.Lock()
39
+ self.is_paused: bool = False # Track if task is paused waiting for peer/auth
39
40
 
40
41
  # Token usage tracking
41
42
  self.total_input_tokens: int = 0
@@ -59,6 +60,26 @@ class TaskExecutionContext:
59
60
  """Checks if the cancellation event has been set."""
60
61
  return self.cancellation_event.is_set()
61
62
 
63
+ def set_paused(self, paused: bool) -> None:
64
+ """
65
+ Marks the task as paused (waiting for peer response or user input).
66
+
67
+ Args:
68
+ paused: True if task is paused, False if resuming.
69
+ """
70
+ with self.lock:
71
+ self.is_paused = paused
72
+
73
+ def get_is_paused(self) -> bool:
74
+ """
75
+ Checks if the task is currently paused.
76
+
77
+ Returns:
78
+ True if task is paused (waiting for peer/auth), False otherwise.
79
+ """
80
+ with self.lock:
81
+ return self.is_paused
82
+
62
83
  def append_to_streaming_buffer(self, text: str) -> None:
63
84
  """Appends a chunk of text to the main streaming buffer."""
64
85
  with self.lock:
@@ -5,6 +5,7 @@ The `testing` directory provides utilities for testing the A2A (Agent-to-Agent)
5
5
  - `__init__.py` - Package initialization file marking the directory as a Python module
6
6
  - `debug_utils.py` - Debugging utilities including pretty-printing for A2A event history
7
7
  - `testing_llm.txt` - Documentation file (not a code module)
8
+ - `testing_llm_detail.txt` - Concatenated documentation file (not a code module)
8
9
 
9
10
  ## Developer API Reference
10
11
 
@@ -54,4 +55,4 @@ pretty_print_event_history(event_history, max_string_length=100)
54
55
  pretty_print_event_history([])
55
56
  ```
56
57
 
57
- # content_hash: 890ba89aa47c5be30f5ec9cdbb4a05e9ee3bd022e56a56fcc4feea72aac653e8
58
+ # content_hash: 09db923206be2f0cd02c12cb97cf50f7b6364773fae328dd0570e69067cc1971