solace-agent-mesh 1.11.2__py3-none-any.whl → 1.12.0__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.
Files changed (308) hide show
  1. solace_agent_mesh/agent/adk/callbacks.py +177 -10
  2. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +3 -0
  3. solace_agent_mesh/agent/adk/models/lite_llm.py +34 -16
  4. solace_agent_mesh/agent/adk/runner.py +66 -8
  5. solace_agent_mesh/agent/adk/setup.py +61 -26
  6. solace_agent_mesh/agent/protocol/event_handlers.py +48 -0
  7. solace_agent_mesh/agent/proxies/a2a/component.py +27 -0
  8. solace_agent_mesh/agent/sac/component.py +84 -2
  9. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +41 -22
  10. solace_agent_mesh/agent/tools/peer_agent_tool.py +19 -12
  11. solace_agent_mesh/agent/tools/tool_config_types.py +21 -1
  12. solace_agent_mesh/agent/utils/artifact_helpers.py +54 -0
  13. solace_agent_mesh/assets/docs/404.html +3 -3
  14. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  15. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  16. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  17. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  18. solace_agent_mesh/assets/docs/assets/js/{3ac1795d.28b7c67b.js → 3ac1795d.dc006e20.js} +1 -1
  19. solace_agent_mesh/assets/docs/assets/js/3ff0015d.f08618fb.js +1 -0
  20. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  21. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  22. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  23. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  24. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  25. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  26. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  27. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  28. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  29. solace_agent_mesh/assets/docs/assets/js/81a99df0.95be65d4.js +1 -0
  30. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  31. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  32. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  33. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  34. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  35. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  36. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  37. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  38. solace_agent_mesh/assets/docs/assets/js/f284c35a.08fab659.js +1 -0
  39. solace_agent_mesh/assets/docs/assets/js/main.b241af3e.js +2 -0
  40. solace_agent_mesh/assets/docs/assets/js/runtime~main.4ca7d2e2.js +1 -0
  41. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +4 -4
  42. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +4 -4
  43. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +4 -4
  44. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +4 -4
  45. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +4 -4
  46. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  47. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +14 -12
  48. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +30 -9
  49. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +4 -4
  50. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +6 -4
  51. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +4 -4
  52. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  53. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +4 -4
  54. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +4 -4
  55. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +4 -4
  56. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +4 -4
  57. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +4 -4
  58. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +4 -4
  59. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +5 -5
  60. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +4 -4
  61. solace_agent_mesh/assets/docs/docs/documentation/deploying/{kubernetes-deployment → kubernetes}/index.html +6 -6
  62. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  63. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +11 -6
  64. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +4 -4
  65. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +4 -4
  66. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +4 -4
  67. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +4 -4
  68. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +23 -5
  69. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +4 -4
  70. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +4 -4
  71. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +4 -4
  72. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +4 -4
  73. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +4 -4
  74. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +4 -4
  75. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +4 -4
  76. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +17 -8
  77. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +4 -4
  78. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +4 -4
  79. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +4 -4
  80. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +4 -4
  81. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +4 -4
  82. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +4 -4
  83. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +5 -5
  84. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +4 -4
  85. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +4 -4
  86. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +4 -4
  87. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +4 -4
  88. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +4 -4
  89. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +4 -4
  90. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +4 -4
  91. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +4 -4
  92. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +4 -4
  93. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +6 -5
  94. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +4 -4
  95. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +4 -4
  96. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  97. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +25 -4
  98. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +4 -4
  99. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +4 -4
  100. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +4 -4
  101. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +4 -4
  102. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +4 -4
  103. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +4 -4
  104. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +4 -4
  105. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +4 -4
  106. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +4 -4
  107. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  108. solace_agent_mesh/assets/docs/lunr-index-1767712284328.json +1 -0
  109. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  110. solace_agent_mesh/assets/docs/search-doc-1767712284328.json +1 -0
  111. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  112. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  113. solace_agent_mesh/cli/__init__.py +1 -1
  114. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  115. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  116. solace_agent_mesh/cli/commands/init_cmd/env_step.py +29 -2
  117. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  118. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  119. solace_agent_mesh/cli/main.py +2 -0
  120. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-Dj3JtK42.js → authCallback-8Nihi8rv.js} +1 -1
  121. solace_agent_mesh/client/webui/frontend/static/assets/{client-ZKk9kEJ5.js → client-DYtZN8p-.js} +1 -1
  122. solace_agent_mesh/client/webui/frontend/static/assets/main-BYGUHQMk.js +435 -0
  123. solace_agent_mesh/client/webui/frontend/static/assets/main-D2CSH1bp.css +1 -0
  124. solace_agent_mesh/client/webui/frontend/static/assets/{vendor-BNV4kZN0.js → vendor-XBWAmrun.js} +106 -101
  125. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  126. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  127. solace_agent_mesh/client/webui/frontend/static/ui-version.json +1 -1
  128. solace_agent_mesh/common/a2a/types.py +1 -1
  129. solace_agent_mesh/common/agent_registry.py +38 -11
  130. solace_agent_mesh/common/data_parts.py +28 -0
  131. solace_agent_mesh/common/error_handlers.py +83 -0
  132. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  133. solace_agent_mesh/config_portal/backend/common.py +2 -0
  134. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ZV-jX48T.js +103 -0
  135. solace_agent_mesh/config_portal/frontend/static/client/assets/{manifest-ba77705e.js → manifest-ce5bc5da.js} +1 -1
  136. solace_agent_mesh/config_portal/frontend/static/client/index.html +1 -1
  137. solace_agent_mesh/core_a2a/service.py +3 -2
  138. solace_agent_mesh/gateway/adapter/base.py +28 -1
  139. solace_agent_mesh/gateway/adapter/types.py +9 -0
  140. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  141. solace_agent_mesh/gateway/base/component.py +68 -1
  142. solace_agent_mesh/gateway/generic/component.py +195 -30
  143. solace_agent_mesh/gateway/http_sse/app.py +23 -6
  144. solace_agent_mesh/gateway/http_sse/component.py +9 -61
  145. solace_agent_mesh/gateway/http_sse/dependencies.py +9 -51
  146. solace_agent_mesh/gateway/http_sse/main.py +28 -418
  147. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  148. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +1 -1
  149. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +1 -1
  150. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +2 -2
  151. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +2 -2
  152. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +2 -2
  153. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +1 -1
  154. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +1 -1
  155. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +1 -1
  156. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +1 -1
  157. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +4 -4
  158. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +2 -2
  159. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +16 -15
  160. solace_agent_mesh/gateway/http_sse/routers/auth.py +61 -132
  161. solace_agent_mesh/gateway/http_sse/routers/config.py +12 -8
  162. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +1 -1
  163. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  164. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +2 -2
  165. solace_agent_mesh/gateway/http_sse/routers/feedback.py +2 -2
  166. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  167. solace_agent_mesh/gateway/http_sse/routers/projects.py +2 -1
  168. solace_agent_mesh/gateway/http_sse/routers/prompts.py +2 -1
  169. solace_agent_mesh/gateway/http_sse/routers/sessions.py +3 -3
  170. solace_agent_mesh/gateway/http_sse/routers/speech.py +1 -1
  171. solace_agent_mesh/gateway/http_sse/routers/tasks.py +3 -2
  172. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  173. solace_agent_mesh/gateway/http_sse/routers/visualization.py +2 -1
  174. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +1 -1
  175. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  176. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  177. solace_agent_mesh/gateway/http_sse/services/session_service.py +4 -4
  178. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +1 -1
  179. solace_agent_mesh/services/platform/__init__.py +23 -12
  180. solace_agent_mesh/services/platform/api/dependencies.py +23 -16
  181. solace_agent_mesh/services/platform/api/main.py +118 -43
  182. solace_agent_mesh/services/platform/api/routers/__init__.py +12 -3
  183. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  184. solace_agent_mesh/services/platform/app.py +101 -7
  185. solace_agent_mesh/services/platform/component.py +552 -33
  186. solace_agent_mesh/shared/__init__.py +14 -0
  187. solace_agent_mesh/shared/api/__init__.py +42 -0
  188. solace_agent_mesh/shared/auth/__init__.py +26 -0
  189. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  190. solace_agent_mesh/shared/auth/middleware.py +291 -0
  191. solace_agent_mesh/shared/database/__init__.py +20 -0
  192. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  193. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  194. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  195. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  196. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +1 -1
  197. solace_agent_mesh/shared/utils/__init__.py +21 -0
  198. solace_agent_mesh/templates/platform.yaml +49 -0
  199. solace_agent_mesh/templates/webui.yaml +12 -3
  200. {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/METADATA +2 -1
  201. {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/RECORD +214 -258
  202. solace_agent_mesh/agent/adk/adk_llm.txt +0 -226
  203. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  204. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  205. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -189
  206. solace_agent_mesh/agent/agent_llm.txt +0 -369
  207. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  208. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  209. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  210. solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +0 -190
  211. solace_agent_mesh/agent/proxies/base/base_llm.txt +0 -148
  212. solace_agent_mesh/agent/proxies/proxies_llm.txt +0 -283
  213. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  214. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  215. solace_agent_mesh/agent/testing/testing_llm.txt +0 -58
  216. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  217. solace_agent_mesh/agent/tools/tools_llm.txt +0 -276
  218. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -275
  219. solace_agent_mesh/agent/utils/utils_llm.txt +0 -152
  220. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  221. solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +0 -1
  222. solace_agent_mesh/assets/docs/assets/js/240a0364.9ad94d1b.js +0 -1
  223. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  224. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  225. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2ddc75c0.js +0 -1
  226. solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +0 -1
  227. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.90a87880.js +0 -1
  228. solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +0 -1
  229. solace_agent_mesh/assets/docs/assets/js/66d4869e.b77431fc.js +0 -1
  230. solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +0 -1
  231. solace_agent_mesh/assets/docs/assets/js/81a99df0.2484b8d9.js +0 -1
  232. solace_agent_mesh/assets/docs/assets/js/9bb13469.b2333011.js +0 -1
  233. solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +0 -1
  234. solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +0 -1
  235. solace_agent_mesh/assets/docs/assets/js/e04b235d.52cb25ed.js +0 -1
  236. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.b1068f9b.js +0 -1
  237. solace_agent_mesh/assets/docs/assets/js/e6f9706b.4488e34c.js +0 -1
  238. solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +0 -1
  239. solace_agent_mesh/assets/docs/assets/js/f284c35a.250993bf.js +0 -1
  240. solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js +0 -2
  241. solace_agent_mesh/assets/docs/assets/js/runtime~main.9e0813a2.js +0 -1
  242. solace_agent_mesh/assets/docs/lunr-index-1765810064709.json +0 -1
  243. solace_agent_mesh/assets/docs/search-doc-1765810064709.json +0 -1
  244. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  245. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  246. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  247. solace_agent_mesh/client/webui/frontend/static/assets/main-BcUaNZ-Q.css +0 -1
  248. solace_agent_mesh/client/webui/frontend/static/assets/main-vjch4RYc.js +0 -435
  249. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -175
  250. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  251. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -445
  252. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  253. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -330
  254. solace_agent_mesh/common/common_llm.txt +0 -230
  255. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  256. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  257. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  258. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  259. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  260. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  261. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  262. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -81
  263. solace_agent_mesh/common/services/services_llm.txt +0 -368
  264. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  265. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  266. solace_agent_mesh/common/utils/utils_llm.txt +0 -335
  267. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  268. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DiOiAjzL.js +0 -103
  269. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  270. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  271. solace_agent_mesh/gateway/base/base_llm.txt +0 -226
  272. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  273. solace_agent_mesh/gateway/gateway_llm.txt +0 -369
  274. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  275. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -345
  276. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -161
  277. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  278. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  279. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  280. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -221
  281. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -257
  282. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -308
  283. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -450
  284. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -133
  285. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -123
  286. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -312
  287. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -303
  288. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  289. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -319
  290. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  291. solace_agent_mesh/llm.txt +0 -228
  292. solace_agent_mesh/llm_detail.txt +0 -2835
  293. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  294. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  295. solace_agent_mesh/templates/templates_llm.txt +0 -147
  296. /solace_agent_mesh/assets/docs/assets/js/{main.7acf7ace.js.LICENSE.txt → main.b241af3e.js.LICENSE.txt} +0 -0
  297. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  298. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  299. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  300. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  301. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  302. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  303. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  304. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  305. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  306. {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/WHEEL +0 -0
  307. {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/entry_points.txt +0 -0
  308. {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/licenses/LICENSE +0 -0
@@ -33,6 +33,7 @@ from ...agent.utils.context_helpers import (
33
33
  get_session_from_callback_context,
34
34
  )
35
35
  from ..tools.tool_definition import BuiltinTool
36
+ from ..tools.peer_agent_tool import PEER_TOOL_PREFIX
36
37
 
37
38
  from ...common.utils.embeds import (
38
39
  EMBED_DELIMITER_OPEN,
@@ -47,6 +48,7 @@ from ...common.utils.embeds.types import ResolutionMode
47
48
  from ...common.utils.embeds.modifiers import MODIFIER_IMPLEMENTATIONS
48
49
 
49
50
  from ...common import a2a
51
+ from ...common.a2a.types import ArtifactInfo
50
52
  from ...common.data_parts import (
51
53
  AgentProgressUpdateData,
52
54
  ArtifactCreationProgressData,
@@ -141,12 +143,17 @@ async def _resolve_early_embeds_in_chunk(
141
143
  # Build resolution context from callback_context (pattern from EmbedResolvingMCPToolset)
142
144
  invocation_context = callback_context._invocation_context
143
145
  if not invocation_context:
144
- log.warning("%s No invocation context available for embed resolution", log_identifier)
146
+ log.warning(
147
+ "%s No invocation context available for embed resolution",
148
+ log_identifier,
149
+ )
145
150
  return chunk
146
151
 
147
152
  session_context = invocation_context.session
148
153
  if not session_context:
149
- log.warning("%s No session context available for embed resolution", log_identifier)
154
+ log.warning(
155
+ "%s No session context available for embed resolution", log_identifier
156
+ )
150
157
  return chunk
151
158
 
152
159
  resolution_context = {
@@ -183,7 +190,9 @@ async def _resolve_early_embeds_in_chunk(
183
190
  return resolved_text
184
191
 
185
192
  except Exception as e:
186
- log.error("%s Error resolving embeds in chunk: %s", log_identifier, e, exc_info=True)
193
+ log.error(
194
+ "%s Error resolving embeds in chunk: %s", log_identifier, e, exc_info=True
195
+ )
187
196
  return chunk # Return original chunk on error
188
197
 
189
198
 
@@ -208,7 +217,9 @@ async def process_artifact_blocks_callback(
208
217
  session.state[parser_state_key] = parser
209
218
  session.state["completed_artifact_blocks_list"] = []
210
219
  session.state["completed_template_blocks_list"] = []
211
- session.state["artifact_chars_sent"] = 0 # Reset character tracking for new turn
220
+ session.state["artifact_chars_sent"] = (
221
+ 0 # Reset character tracking for new turn
222
+ )
212
223
 
213
224
  stream_chunks_were_processed = callback_context.state.get(
214
225
  A2A_LLM_STREAM_CHUNKS_PROCESSED_KEY, False
@@ -317,7 +328,9 @@ async def process_artifact_blocks_callback(
317
328
 
318
329
  # Track the cumulative character count of what we've sent
319
330
  # We need character count (not bytes) to slice correctly later
320
- previous_char_count = session.state.get("artifact_chars_sent", 0)
331
+ previous_char_count = session.state.get(
332
+ "artifact_chars_sent", 0
333
+ )
321
334
  new_char_count = previous_char_count + len(event.chunk)
322
335
  session.state["artifact_chars_sent"] = new_char_count
323
336
 
@@ -439,7 +452,9 @@ async def process_artifact_blocks_callback(
439
452
  if a2a_context:
440
453
  # Check if there's unsent content (content after last progress event)
441
454
  total_bytes = len(event.content.encode("utf-8"))
442
- chars_already_sent = session.state.get("artifact_chars_sent", 0)
455
+ chars_already_sent = session.state.get(
456
+ "artifact_chars_sent", 0
457
+ )
443
458
 
444
459
  if chars_already_sent < len(event.content):
445
460
  # There's unsent content - send it as a final progress update
@@ -475,7 +490,6 @@ async def process_artifact_blocks_callback(
475
490
  mime_type=params.get("mime_type"),
476
491
  version=version_for_tool,
477
492
  )
478
-
479
493
  await _publish_data_part_status_update(
480
494
  host_component, a2a_context, progress_data
481
495
  )
@@ -499,6 +513,9 @@ async def process_artifact_blocks_callback(
499
513
  "filename": filename,
500
514
  "version": version_for_tool,
501
515
  "status": status_for_tool,
516
+ "description": params.get("description"),
517
+ "mime_type": params.get("mime_type"),
518
+ "bytes_transferred": len(event.content),
502
519
  "original_text": original_text,
503
520
  }
504
521
  )
@@ -651,8 +668,12 @@ async def process_artifact_blocks_callback(
651
668
  len(completed_blocks_list),
652
669
  )
653
670
 
671
+ # Get a2a_context for sending signals
672
+ a2a_context = callback_context.state.get("a2a_context")
673
+
654
674
  tool_call_parts = []
655
675
  for block_info in completed_blocks_list:
676
+ function_call_id = f"host-notify-{uuid.uuid4()}"
656
677
  notify_tool_call = adk_types.FunctionCall(
657
678
  name="_notify_artifact_save",
658
679
  args={
@@ -660,10 +681,40 @@ async def process_artifact_blocks_callback(
660
681
  "version": block_info["version"],
661
682
  "status": block_info["status"],
662
683
  },
663
- id=f"host-notify-{uuid.uuid4()}",
684
+ id=function_call_id,
664
685
  )
665
686
  tool_call_parts.append(adk_types.Part(function_call=notify_tool_call))
666
687
 
688
+ # Send artifact saved notification now that we have the function_call_id
689
+ # This ensures the signal and tool call arrive together
690
+ if block_info["status"] == "success" and a2a_context:
691
+ try:
692
+ artifact_info = ArtifactInfo(
693
+ filename=block_info["filename"],
694
+ version=block_info["version"],
695
+ mime_type=block_info.get("mime_type") or "application/octet-stream",
696
+ size=block_info.get("bytes_transferred", 0),
697
+ description=block_info.get("description"),
698
+ version_count=None, # Count not available in save context
699
+ )
700
+ await host_component.notify_artifact_saved(
701
+ artifact_info=artifact_info,
702
+ a2a_context=a2a_context,
703
+ function_call_id=function_call_id,
704
+ )
705
+ log.debug(
706
+ "%s Published artifact saved notification for fenced block: %s (function_call_id=%s)",
707
+ log_identifier,
708
+ block_info["filename"],
709
+ function_call_id,
710
+ )
711
+ except Exception as signal_err:
712
+ log.warning(
713
+ "%s Failed to publish artifact saved notification: %s",
714
+ log_identifier,
715
+ signal_err,
716
+ )
717
+
667
718
  existing_parts = llm_response.content.parts if llm_response.content else []
668
719
  final_existing_parts = existing_parts
669
720
 
@@ -1124,6 +1175,11 @@ Example - CSV Table:
1124
1175
  {{% for row in data_rows %}}| {{% for cell in row %}}{{{{ cell }}}} | {{% endfor %}}{{% endfor %}}
1125
1176
  {close_delim}
1126
1177
 
1178
+ **IMPORTANT - Pipe Characters in Markdown Tables:**
1179
+ Text data may contain "|" characters which will break markdown table rendering by pushing data into wrong columns. For text fields that might contain pipes, use the `replace` filter to escape them:
1180
+ `{{{{ item.summary | replace: "|", "&#124;" }}}}`
1181
+ Only apply this to text fields that might contain pipes - numerical columns don't need it.
1182
+
1127
1183
  Negative Examples
1128
1184
  Use {{ issues.size }} instead of {{ issues|length }}
1129
1185
  Use {{ forloop.index }} instead of {{ loop.index }} (Liquid uses forloop not loop)
@@ -1209,6 +1265,21 @@ def _generate_examples_instruction() -> str:
1209
1265
  + f"""{close_delim}
1210
1266
 
1211
1267
  Example 4:
1268
+ - User: "Show me the Jira issues as a table"
1269
+ <note>There is a JSON artifact jira_issues.json with items containing key, summary, status, type, assignee, updated fields</note>
1270
+ - OrchestratorAgent:
1271
+ {embed_open_delim}status_update:Rendering Jira issues table...{embed_close_delim}
1272
+ {open_delim}template_liquid: data="jira_issues.json" limit="10"
1273
+ """
1274
+ + """| Key | Summary | Status | Type | Assignee | Updated |
1275
+ |-----|---------|--------|------|----------|---------|
1276
+ {% for item in items %}| [{{ item.key }}](https://jira.example.com/browse/{{ item.key }}) | {{ item.summary | replace: "|", "&#124;" }} | {{ item.status }} | {{ item.type }} | {{ item.assignee }} | {{ item.updated }} |
1277
+ {% endfor %}"""
1278
+ + f"""
1279
+ {close_delim}
1280
+ <note>The replace filter on item.summary escapes any pipe characters that would break the markdown table. Only apply to text fields that might contain pipes.</note>
1281
+
1282
+ Example 5:
1212
1283
  - User: "Search the database for all orders from last month"
1213
1284
  - OrchestratorAgent:
1214
1285
  {embed_open_delim}status_update:Querying order database...{embed_close_delim}
@@ -1216,7 +1287,7 @@ def _generate_examples_instruction() -> str:
1216
1287
  [After getting results:]
1217
1288
  Found 247 orders from last month totaling $45,231.
1218
1289
 
1219
- Example 5:
1290
+ Example 6:
1220
1291
  - User: "Create an HTML with the chart image you just generated with the customer data."
1221
1292
  - OrchestratorAgent:
1222
1293
  {embed_open_delim}status_update:Generating HTML report with chart...{embed_close_delim}
@@ -1284,7 +1355,30 @@ Examples:
1284
1355
  - `The result of 23.5 * 4.2 is {open_delim}math:23.5 * 4.2 | .2f{close_delim}` (Embeds calculated result with 2 decimal places)
1285
1356
 
1286
1357
  The following embeds are resolved *late* (by the gateway before final display):
1287
- - `{open_delim}artifact_return:filename[:version]{close_delim}`: This is the primary way to return an artifact to the user. It attaches the specified artifact to the message. The embed itself is removed from the text. Use this instead of describing a file and expecting the user to download it. Note: artifact_return is not necessary if the artifact was just created by you in this same response, since newly created artifacts are automatically attached to your message.
1358
+ - `{open_delim}artifact_return:filename[:version]{close_delim}`: Attaches an artifact to your message so the user receives the file. The embed itself is removed from the text.
1359
+
1360
+ **CRITICAL - Returning Artifacts to Users:**
1361
+ Only artifacts created with the `{open_delim}save_artifact:...{close_delim}` fenced block syntax are automatically sent to the user.
1362
+
1363
+ **You MUST use artifact_return for:**
1364
+ - Artifacts created by tools (e.g., image generation, chart creation, file conversion)
1365
+ - Artifacts created by other agents you called
1366
+ - Artifacts from MCP servers
1367
+
1368
+ **When deciding whether to return an artifact:**
1369
+ - Return artifacts the user explicitly requested or that answer their question
1370
+ - Return final outputs (charts, reports, images, documents)
1371
+ - Do NOT return intermediate/temporary artifacts (e.g., temp files, internal data)
1372
+
1373
+ **Example - Tool creates an image:**
1374
+ User: "Create a chart of sales data"
1375
+ [You call a charting tool that creates sales_chart.png]
1376
+ Your response: "Here's the sales chart. {open_delim}artifact_return:sales_chart.png{close_delim}"
1377
+
1378
+ **Example - Agent creates a report:**
1379
+ User: "Generate a quarterly report"
1380
+ [You call ReportAgent which creates quarterly_report.pdf]
1381
+ Your response: "The quarterly report is ready. {open_delim}artifact_return:quarterly_report.pdf{close_delim}"
1288
1382
  """
1289
1383
 
1290
1384
  artifact_content_instruction = f"""
@@ -2316,3 +2410,76 @@ def auto_continue_on_max_tokens_callback(
2316
2410
  )
2317
2411
 
2318
2412
  return hijacked_response
2413
+
2414
+
2415
+ def preregister_long_running_tools_callback(
2416
+ callback_context: CallbackContext,
2417
+ llm_response: LlmResponse,
2418
+ host_component: "SamAgentComponent",
2419
+ ) -> Optional[LlmResponse]:
2420
+ """
2421
+ ADK after_model_callback to pre-register all long-running tool calls
2422
+ before any tool execution begins. This prevents race conditions where
2423
+ one tool completes before another has registered.
2424
+
2425
+ The race condition occurs because tools are executed via asyncio.gather
2426
+ (non-deterministic order) and each tool calls register_parallel_call_sent()
2427
+ inside its run_async(). If Tool A completes before Tool B even registers,
2428
+ the system thinks all calls are done (completed=1, total=1).
2429
+
2430
+ By pre-registering all long-running tools in this callback (which runs
2431
+ BEFORE tool execution), we ensure the total count is set correctly upfront.
2432
+ """
2433
+ log_identifier = "[Callback:PreregisterLongRunning]"
2434
+
2435
+ # Only process non-partial responses with function calls
2436
+ if llm_response.partial:
2437
+ return None
2438
+
2439
+ if not llm_response.content or not llm_response.content.parts:
2440
+ return None
2441
+
2442
+ # Find all long-running tool calls (identified by peer_ prefix)
2443
+ long_running_calls = []
2444
+ for part in llm_response.content.parts:
2445
+ if part.function_call:
2446
+ tool_name = part.function_call.name
2447
+ if tool_name.startswith(PEER_TOOL_PREFIX):
2448
+ long_running_calls.append(part.function_call)
2449
+
2450
+ if not long_running_calls:
2451
+ return None
2452
+
2453
+ # Get task context
2454
+ a2a_context = callback_context.state.get("a2a_context")
2455
+ if not a2a_context:
2456
+ log.warning("%s No a2a_context, cannot pre-register tools", log_identifier)
2457
+ return None
2458
+
2459
+ logical_task_id = a2a_context.get("logical_task_id")
2460
+ invocation_id = callback_context._invocation_context.invocation_id
2461
+
2462
+ with host_component.active_tasks_lock:
2463
+ task_context = host_component.active_tasks.get(logical_task_id)
2464
+
2465
+ if not task_context:
2466
+ log.warning(
2467
+ "%s TaskContext not found for %s, cannot pre-register",
2468
+ log_identifier,
2469
+ logical_task_id,
2470
+ )
2471
+ return None
2472
+
2473
+ # Pre-register ALL long-running calls atomically
2474
+ for fc in long_running_calls:
2475
+ task_context.register_parallel_call_sent(invocation_id)
2476
+
2477
+ log.info(
2478
+ "%s Pre-registered %d long-running tool call(s) for invocation %s (task %s)",
2479
+ log_identifier,
2480
+ len(long_running_calls),
2481
+ invocation_id,
2482
+ logical_task_id,
2483
+ )
2484
+
2485
+ return None # Don't alter the response
@@ -343,6 +343,7 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
343
343
  self,
344
344
  connection_params,
345
345
  tool_filter=None,
346
+ tool_name_prefix=None,
346
347
  auth_scheme=None,
347
348
  auth_credential=None,
348
349
  auth_discovery=None,
@@ -357,6 +358,7 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
357
358
  super().__init__(
358
359
  connection_params=connection_params,
359
360
  tool_filter=tool_filter,
361
+ tool_name_prefix=tool_name_prefix,
360
362
  auth_scheme=auth_scheme,
361
363
  auth_credential=auth_credential,
362
364
  auth_discovery=auth_discovery,
@@ -367,6 +369,7 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
367
369
  super().__init__(
368
370
  connection_params=connection_params,
369
371
  tool_filter=tool_filter,
372
+ tool_name_prefix=tool_name_prefix,
370
373
  auth_scheme=auth_scheme,
371
374
  auth_credential=auth_credential,
372
375
  )
@@ -328,26 +328,41 @@ def _schema_to_dict(schema: types.Schema) -> dict:
328
328
  """
329
329
 
330
330
  schema_dict = schema.model_dump(exclude_none=True)
331
+
332
+ # Convert top-level type from enum to lowercase string
331
333
  if "type" in schema_dict:
332
- schema_dict["type"] = schema_dict["type"].lower()
334
+ if isinstance(schema_dict["type"], types.Type):
335
+ schema_dict["type"] = schema_dict["type"].value.lower()
336
+ else:
337
+ schema_dict["type"] = str(schema_dict["type"]).lower()
338
+
339
+ # Recursively handle items (for array types)
333
340
  if "items" in schema_dict:
334
- if isinstance(schema_dict["items"], dict):
341
+ # Check if we have the original Schema object for items
342
+ if isinstance(schema.items, types.Schema):
343
+ # Recursively convert the Schema object - this ensures nested Type enums are converted
344
+ schema_dict["items"] = _schema_to_dict(schema.items)
345
+ elif isinstance(schema_dict["items"], dict):
346
+ # If items is already a dict, validate and recurse
335
347
  schema_dict["items"] = _schema_to_dict(
336
348
  types.Schema.model_validate(schema_dict["items"])
337
349
  )
338
- elif isinstance(schema_dict["items"]["type"], types.Type):
339
- schema_dict["items"]["type"] = TYPE_LABELS[
340
- schema_dict["items"]["type"].value
341
- ]
350
+
351
+ # Recursively handle properties (for object types)
342
352
  if "properties" in schema_dict:
343
353
  properties = {}
344
354
  for key, value in schema_dict["properties"].items():
345
355
  if isinstance(value, types.Schema):
356
+ # If it's a Schema object, recursively convert it
346
357
  properties[key] = _schema_to_dict(value)
358
+ elif isinstance(value, dict):
359
+ # If it's already a dict, validate and recurse to handle nested Type enums
360
+ properties[key] = _schema_to_dict(
361
+ types.Schema.model_validate(value)
362
+ )
347
363
  else:
364
+ # For other types, just copy as-is
348
365
  properties[key] = value
349
- if "type" in properties[key]:
350
- properties[key]["type"] = properties[key]["type"].lower()
351
366
  schema_dict["properties"] = properties
352
367
  return schema_dict
353
368
 
@@ -366,20 +381,23 @@ def _function_declaration_to_tool_param(
366
381
 
367
382
  assert function_declaration.name
368
383
 
369
- properties = {}
370
- if function_declaration.parameters and function_declaration.parameters.properties:
371
- for key, value in function_declaration.parameters.properties.items():
372
- properties[key] = _schema_to_dict(value)
384
+ # Convert the entire parameters schema to ensure all fields (type, properties, required, etc.)
385
+ # are properly converted, including nested Type enums
386
+ # If no parameters provided, default to empty object schema (required by OpenAI)
387
+ if function_declaration.parameters:
388
+ parameters = _schema_to_dict(function_declaration.parameters)
389
+ else:
390
+ parameters = {
391
+ "type": "object",
392
+ "properties": {},
393
+ }
373
394
 
374
395
  return {
375
396
  "type": "function",
376
397
  "function": {
377
398
  "name": function_declaration.name,
378
399
  "description": function_declaration.description or "",
379
- "parameters": {
380
- "type": "object",
381
- "properties": properties,
382
- },
400
+ "parameters": parameters,
383
401
  },
384
402
  }
385
403
 
@@ -201,13 +201,13 @@ async def run_adk_async_task_thread_wrapper(
201
201
  llm_limit_e,
202
202
  )
203
203
  except BadRequestError as e:
204
+ exception_to_finalize_with = e
204
205
  log.error(
205
- "%s Bad Request for task %s: %s.",
206
+ "%s Bad Request for task %s: %s. Scheduling finalization.",
206
207
  component.log_identifier,
207
208
  logical_task_id,
208
209
  e.message,
209
210
  )
210
- raise
211
211
  except Exception as e:
212
212
  exception_to_finalize_with = e
213
213
  log.exception(
@@ -261,7 +261,11 @@ async def run_adk_async_task(
261
261
  logical_task_id = a2a_context.get("logical_task_id", "unknown_task")
262
262
  event_loop_stored = False
263
263
  current_loop = asyncio.get_running_loop()
264
- is_paused = False
264
+ # Track pending long-running tools by their function_call IDs
265
+ # This replaces the simple boolean is_paused to properly handle sync returns
266
+ pending_long_running_tools: set[str] = set()
267
+ # Collect synchronous responses from long-running tools for potential re-run
268
+ sync_tool_responses: list[adk_types.Part] = []
265
269
 
266
270
  adk_event_generator = component.runner.run_async(
267
271
  user_id=adk_session.user_id,
@@ -316,7 +320,10 @@ async def run_adk_async_task(
316
320
  break
317
321
 
318
322
  if event.long_running_tool_ids:
319
- is_paused = True
323
+ # Track which long-running tool calls are pending (waiting for async response)
324
+ pending_long_running_tools = pending_long_running_tools.union(
325
+ event.long_running_tool_ids
326
+ )
320
327
 
321
328
  if not event_loop_stored and event.invocation_id:
322
329
  task_context.set_event_loop(current_loop)
@@ -342,8 +349,18 @@ async def run_adk_async_task(
342
349
  if event.content and event.content.parts:
343
350
  for part in event.content.parts:
344
351
  if part.function_response:
345
- if part.function_response.name.startswith("peer_"):
346
- pass
352
+ # Check if this is a sync response from a long-running tool
353
+ # (i.e., the tool returned immediately instead of async)
354
+ response_id = part.function_response.id
355
+ if response_id and response_id in pending_long_running_tools:
356
+ pending_long_running_tools.discard(response_id)
357
+ sync_tool_responses.append(part)
358
+ log.info(
359
+ "%s Long-running tool %s (id=%s) returned synchronously.",
360
+ component.log_identifier,
361
+ part.function_response.name,
362
+ response_id,
363
+ )
347
364
 
348
365
  except TaskCancelledError:
349
366
  raise
@@ -374,14 +391,55 @@ async def run_adk_async_task(
374
391
  f"Task {logical_task_id} was cancelled before finalization."
375
392
  )
376
393
 
377
- if is_paused:
394
+ invocation_id = a2a_context.get("invocation_id")
395
+
396
+ # Check if we still have pending long-running tools (waiting for async responses)
397
+ if pending_long_running_tools:
398
+ # Store any sync responses using the SAME format as event_handlers.py
399
+ # This ensures they're combined with async responses when _retrigger is called
400
+ if sync_tool_responses:
401
+ for part in sync_tool_responses:
402
+ result = {
403
+ "adk_function_call_id": part.function_response.id,
404
+ "peer_tool_name": part.function_response.name,
405
+ "payload": part.function_response.response, # Already a dict from ADK
406
+ }
407
+ task_context.record_parallel_result(result, invocation_id)
408
+ log.info(
409
+ "%s Stored %d sync tool response(s) for later combination. Waiting for: %s",
410
+ component.log_identifier,
411
+ len(sync_tool_responses),
412
+ pending_long_running_tools,
413
+ )
414
+
378
415
  log.info(
379
- "%s ADK run completed by invoking a long-running tool. Task %s will remain open, awaiting peer response.",
416
+ "%s Task %s paused, waiting for %d async tool response(s).",
380
417
  component.log_identifier,
381
418
  logical_task_id,
419
+ len(pending_long_running_tools),
382
420
  )
383
421
  return True
384
422
 
423
+ # All tools returned synchronously - re-run ADK with their responses
424
+ # The ADK already created the Part objects, so we use them directly (no duplication)
425
+ if sync_tool_responses:
426
+ log.info(
427
+ "%s All %d long-running tool(s) returned synchronously for task %s. Re-running ADK.",
428
+ component.log_identifier,
429
+ len(sync_tool_responses),
430
+ logical_task_id,
431
+ )
432
+ # Use the Part objects directly from the ADK (already properly formatted)
433
+ tool_response_content = adk_types.Content(role="tool", parts=sync_tool_responses)
434
+ return await run_adk_async_task(
435
+ component=component,
436
+ task_context=task_context,
437
+ adk_session=adk_session,
438
+ adk_content=tool_response_content,
439
+ run_config=run_config,
440
+ a2a_context=a2a_context,
441
+ )
442
+
385
443
  log.debug(
386
444
  "%s ADK run_async completed for task %s. Returning to wrapper for finalization.",
387
445
  component.log_identifier,