solace-agent-mesh 1.6.1__py3-none-any.whl → 1.13.2__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 (481) hide show
  1. solace_agent_mesh/agent/adk/alembic/README +74 -0
  2. solace_agent_mesh/agent/adk/alembic/env.py +77 -0
  3. solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
  4. solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
  5. solace_agent_mesh/agent/adk/alembic.ini +112 -0
  6. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  7. solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
  8. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
  9. solace_agent_mesh/agent/adk/callbacks.py +852 -109
  10. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
  11. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
  12. solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
  13. solace_agent_mesh/agent/adk/models/lite_llm.py +77 -21
  14. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
  15. solace_agent_mesh/agent/adk/runner.py +85 -20
  16. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  17. solace_agent_mesh/agent/adk/services.py +94 -18
  18. solace_agent_mesh/agent/adk/setup.py +281 -65
  19. solace_agent_mesh/agent/adk/stream_parser.py +231 -37
  20. solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
  21. solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
  22. solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
  23. solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
  24. solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
  25. solace_agent_mesh/agent/proxies/base/app.py +3 -2
  26. solace_agent_mesh/agent/proxies/base/component.py +188 -22
  27. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
  28. solace_agent_mesh/agent/sac/app.py +91 -3
  29. solace_agent_mesh/agent/sac/component.py +591 -157
  30. solace_agent_mesh/agent/sac/patch_adk.py +8 -16
  31. solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
  32. solace_agent_mesh/agent/tools/__init__.py +3 -0
  33. solace_agent_mesh/agent/tools/audio_tools.py +3 -3
  34. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +710 -171
  35. solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
  36. solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
  37. solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
  38. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  39. solace_agent_mesh/agent/tools/tool_config_types.py +57 -2
  40. solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
  41. solace_agent_mesh/agent/tools/web_tools.py +125 -17
  42. solace_agent_mesh/agent/utils/artifact_helpers.py +248 -6
  43. solace_agent_mesh/agent/utils/context_helpers.py +17 -0
  44. solace_agent_mesh/assets/docs/404.html +6 -6
  45. solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
  46. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  51. solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
  52. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
  62. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
  104. solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
  105. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
  106. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
  107. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
  108. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
  109. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +82 -68
  110. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  111. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
  112. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
  113. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
  114. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
  115. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
  116. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
  117. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  118. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
  119. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
  120. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  121. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
  122. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  123. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -49
  124. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
  125. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
  126. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
  127. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  128. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +90 -0
  129. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
  130. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  131. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
  132. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +162 -171
  133. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
  134. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
  135. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
  136. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
  137. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
  138. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
  139. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
  140. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
  141. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
  142. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
  143. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
  144. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
  145. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
  146. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
  147. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +23 -19
  151. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
  152. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +112 -87
  154. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +87 -64
  156. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
  158. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
  159. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
  160. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
  161. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +311 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
  164. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
  165. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
  166. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
  167. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
  168. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
  169. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
  170. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
  171. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
  172. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  173. solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
  174. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  175. solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
  176. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  177. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  178. solace_agent_mesh/cli/__init__.py +1 -1
  179. solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
  180. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
  181. solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
  182. solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
  183. solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
  184. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  185. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  186. solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
  187. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
  188. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  189. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
  190. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
  191. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  192. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
  193. solace_agent_mesh/cli/commands/run_cmd.py +64 -49
  194. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  195. solace_agent_mesh/cli/main.py +15 -0
  196. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-BTf6dqwp.js → authCallback-KnKMP_vb.js} +1 -1
  197. solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
  198. solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
  199. solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
  200. solace_agent_mesh/client/webui/frontend/static/assets/vendor-CGk8Suyh.js +565 -0
  201. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  202. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  203. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  204. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  205. solace_agent_mesh/common/a2a/events.py +2 -1
  206. solace_agent_mesh/common/a2a/protocol.py +5 -0
  207. solace_agent_mesh/common/a2a/types.py +2 -1
  208. solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
  209. solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
  210. solace_agent_mesh/common/agent_registry.py +38 -11
  211. solace_agent_mesh/common/data_parts.py +144 -4
  212. solace_agent_mesh/common/error_handlers.py +83 -0
  213. solace_agent_mesh/common/exceptions.py +24 -0
  214. solace_agent_mesh/common/oauth/__init__.py +17 -0
  215. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  216. solace_agent_mesh/common/oauth/utils.py +50 -0
  217. solace_agent_mesh/common/rag_dto.py +156 -0
  218. solace_agent_mesh/common/sac/sam_component_base.py +97 -19
  219. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  220. solace_agent_mesh/common/services/employee_service.py +1 -1
  221. solace_agent_mesh/common/utils/embeds/constants.py +1 -0
  222. solace_agent_mesh/common/utils/embeds/converter.py +1 -8
  223. solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
  224. solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
  225. solace_agent_mesh/common/utils/embeds/types.py +9 -0
  226. solace_agent_mesh/common/utils/log_formatters.py +20 -0
  227. solace_agent_mesh/common/utils/mime_helpers.py +12 -5
  228. solace_agent_mesh/common/utils/pydantic_utils.py +90 -3
  229. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  230. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  231. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  232. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  233. solace_agent_mesh/config_portal/backend/common.py +12 -0
  234. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
  235. solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
  236. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
  237. solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
  238. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
  239. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
  240. solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
  241. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  242. solace_agent_mesh/core_a2a/service.py +3 -2
  243. solace_agent_mesh/gateway/adapter/__init__.py +1 -0
  244. solace_agent_mesh/gateway/adapter/base.py +170 -0
  245. solace_agent_mesh/gateway/adapter/types.py +230 -0
  246. solace_agent_mesh/gateway/base/app.py +39 -2
  247. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  248. solace_agent_mesh/gateway/base/component.py +1027 -151
  249. solace_agent_mesh/gateway/generic/__init__.py +1 -0
  250. solace_agent_mesh/gateway/generic/app.py +50 -0
  251. solace_agent_mesh/gateway/generic/component.py +894 -0
  252. solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
  253. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
  254. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
  255. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
  256. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
  257. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  258. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  259. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  260. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  261. solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
  262. solace_agent_mesh/gateway/http_sse/app.py +40 -11
  263. solace_agent_mesh/gateway/http_sse/component.py +285 -160
  264. solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
  265. solace_agent_mesh/gateway/http_sse/main.py +68 -450
  266. solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
  267. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  268. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
  269. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
  270. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +26 -3
  271. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
  272. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
  273. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
  274. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -0
  275. solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
  276. solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
  277. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  278. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +8 -2
  279. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
  280. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
  281. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
  282. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +177 -11
  283. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
  284. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
  285. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +256 -58
  286. solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
  287. solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
  288. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  289. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  290. solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
  291. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -1
  292. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  293. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
  294. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
  295. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  296. solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
  297. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  298. solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
  299. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
  300. solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
  301. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  302. solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
  303. solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
  304. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  305. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  306. solace_agent_mesh/gateway/http_sse/routers/visualization.py +92 -9
  307. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  308. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  309. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  310. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  311. solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
  312. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  313. solace_agent_mesh/gateway/http_sse/services/session_service.py +361 -12
  314. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
  315. solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
  316. solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
  317. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  318. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
  319. solace_agent_mesh/services/__init__.py +0 -0
  320. solace_agent_mesh/services/platform/__init__.py +29 -0
  321. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  322. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  323. solace_agent_mesh/services/platform/alembic.ini +109 -0
  324. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  325. solace_agent_mesh/services/platform/api/dependencies.py +154 -0
  326. solace_agent_mesh/services/platform/api/main.py +314 -0
  327. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  328. solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
  329. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  330. solace_agent_mesh/services/platform/app.py +215 -0
  331. solace_agent_mesh/services/platform/component.py +777 -0
  332. solace_agent_mesh/shared/__init__.py +14 -0
  333. solace_agent_mesh/shared/api/__init__.py +42 -0
  334. solace_agent_mesh/shared/auth/__init__.py +26 -0
  335. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  336. solace_agent_mesh/shared/auth/middleware.py +347 -0
  337. solace_agent_mesh/shared/database/__init__.py +20 -0
  338. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  339. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  340. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  341. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  342. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +19 -5
  343. solace_agent_mesh/shared/utils/__init__.py +21 -0
  344. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  345. solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
  346. solace_agent_mesh/templates/platform.yaml +49 -0
  347. solace_agent_mesh/templates/plugin_readme_template.md +3 -25
  348. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  349. solace_agent_mesh/templates/proxy_template.yaml +62 -0
  350. solace_agent_mesh/templates/webui.yaml +148 -6
  351. solace_agent_mesh/tools/web_search/__init__.py +18 -0
  352. solace_agent_mesh/tools/web_search/base.py +84 -0
  353. solace_agent_mesh/tools/web_search/google_search.py +247 -0
  354. solace_agent_mesh/tools/web_search/models.py +99 -0
  355. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
  356. solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
  357. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
  358. solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
  359. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  360. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  361. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -142
  362. solace_agent_mesh/agent/agent_llm.txt +0 -378
  363. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  364. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  365. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  366. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  367. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  368. solace_agent_mesh/agent/testing/testing_llm.txt +0 -57
  369. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  370. solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
  371. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
  372. solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
  373. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  374. solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
  375. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
  376. solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +0 -1
  377. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  378. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  379. solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
  380. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
  381. solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
  382. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
  383. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
  384. solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
  385. solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
  386. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
  387. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
  388. solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
  389. solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
  390. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
  391. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
  392. solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
  393. solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
  394. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
  395. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
  396. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +0 -1
  397. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
  398. solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
  399. solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
  400. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
  401. solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
  402. solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
  403. solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
  404. solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
  405. solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
  406. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
  407. solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
  408. solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
  409. solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
  410. solace_agent_mesh/assets/docs/search-doc-1761248203150.json +0 -1
  411. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  412. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  413. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  414. solace_agent_mesh/client/webui/frontend/static/assets/client-CaY59VuC.js +0 -25
  415. solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
  416. solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
  417. solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
  418. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
  419. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  420. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
  421. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  422. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
  423. solace_agent_mesh/common/common_llm.txt +0 -251
  424. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  425. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  426. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  427. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  428. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  429. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  430. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  431. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -80
  432. solace_agent_mesh/common/services/services_llm.txt +0 -363
  433. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  434. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  435. solace_agent_mesh/common/utils/utils_llm.txt +0 -336
  436. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  437. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
  438. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
  439. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
  440. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
  441. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  442. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  443. solace_agent_mesh/gateway/base/base_llm.txt +0 -224
  444. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  445. solace_agent_mesh/gateway/gateway_llm.txt +0 -373
  446. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  447. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
  448. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
  449. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  450. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  451. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  452. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -263
  453. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
  454. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
  455. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
  456. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
  457. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
  458. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
  459. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
  460. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  461. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
  462. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  463. solace_agent_mesh/llm.txt +0 -228
  464. solace_agent_mesh/llm_detail.txt +0 -2835
  465. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  466. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  467. solace_agent_mesh/templates/logging_config_template.ini +0 -45
  468. solace_agent_mesh/templates/templates_llm.txt +0 -147
  469. solace_agent_mesh-1.6.1.dist-info/RECORD +0 -525
  470. /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
  471. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  472. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  473. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  474. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  475. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  476. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  477. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  478. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  479. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  480. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
  481. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
@@ -6,12 +6,9 @@ It handles token acquisition, caching, and automatic refresh with proper error h
6
6
 
7
7
  import asyncio
8
8
  import logging
9
- import random
10
- import time
11
- from typing import Any, Dict, Optional
12
-
13
- import httpx
9
+ from typing import Optional
14
10
 
11
+ from solace_agent_mesh.common.oauth import OAuth2RetryClient, is_token_expired
15
12
  from solace_agent_mesh.common.utils.in_memory_cache import InMemoryCache
16
13
 
17
14
  logger = logging.getLogger(__name__)
@@ -72,17 +69,19 @@ class OAuth2ClientCredentialsTokenManager:
72
69
  self.scope = scope
73
70
  self.ca_cert_path = ca_cert_path
74
71
  self.refresh_buffer_seconds = refresh_buffer_seconds
75
- self.max_retries = max_retries
76
-
72
+
77
73
  # Thread-safe token access
78
74
  self._lock = asyncio.Lock()
79
-
75
+
80
76
  # Token cache using existing InMemoryCache singleton
81
77
  self._cache = InMemoryCache()
82
-
78
+
83
79
  # Cache key for this token manager instance
84
80
  self._cache_key = f"oauth_token_{hash((token_url, client_id))}"
85
-
81
+
82
+ # OAuth client with retry logic
83
+ self._oauth_client = OAuth2RetryClient(max_retries=max_retries)
84
+
86
85
  logger.info(
87
86
  "OAuth2ClientCredentialsTokenManager initialized for endpoint: %s",
88
87
  token_url
@@ -104,14 +103,24 @@ class OAuth2ClientCredentialsTokenManager:
104
103
  async with self._lock:
105
104
  # Check if we have a cached token
106
105
  cached_token_data = self._cache.get(self._cache_key)
107
-
108
- if cached_token_data and not self._is_token_expired(cached_token_data):
106
+
107
+ if cached_token_data and not is_token_expired(
108
+ cached_token_data["expires_at"], buffer_seconds=self.refresh_buffer_seconds
109
+ ):
109
110
  logger.debug("Using cached OAuth token")
110
111
  return cached_token_data["access_token"]
111
-
112
- # Fetch new token
112
+
113
+ # Fetch new token using common OAuth client
113
114
  logger.info("Fetching new OAuth token from %s", self.token_url)
114
- token_data = await self._fetch_token()
115
+ verify = self.ca_cert_path if self.ca_cert_path else True
116
+ token_data = await self._oauth_client.fetch_client_credentials_token(
117
+ token_url=self.token_url,
118
+ client_id=self.client_id,
119
+ client_secret=self.client_secret,
120
+ scope=self.scope,
121
+ verify=verify,
122
+ timeout=30.0,
123
+ )
115
124
 
116
125
  # Cache the token with TTL
117
126
  expires_in = token_data.get("expires_in", 3600) # Default 1 hour
@@ -121,125 +130,3 @@ class OAuth2ClientCredentialsTokenManager:
121
130
 
122
131
  logger.info("OAuth token cached with TTL: %d seconds", cache_ttl)
123
132
  return token_data["access_token"]
124
-
125
- def _is_token_expired(self, token_data: Dict[str, Any]) -> bool:
126
- """Check if a token is expired or near expiry.
127
-
128
- Args:
129
- token_data: Token data dictionary with 'expires_at' timestamp
130
-
131
- Returns:
132
- True if token is expired or near expiry, False otherwise
133
- """
134
- if "expires_at" not in token_data:
135
- return True
136
-
137
- current_time = time.time()
138
- expires_at = token_data["expires_at"]
139
-
140
- # Consider token expired if it expires within the buffer time
141
- return current_time >= (expires_at - self.refresh_buffer_seconds)
142
-
143
- async def _fetch_token(self) -> Dict[str, Any]:
144
- """Fetch a new OAuth 2.0 access token from the token endpoint.
145
-
146
- Implements retry logic with exponential backoff for transient failures.
147
-
148
- Returns:
149
- Token data dictionary containing access_token, expires_in, etc.
150
-
151
- Raises:
152
- httpx.HTTPError: If HTTP request fails after all retries
153
- ValueError: If response is invalid or missing required fields
154
- """
155
- # Prepare request payload
156
- payload = {
157
- "grant_type": "client_credentials",
158
- "client_id": self.client_id,
159
- "client_secret": self.client_secret,
160
- }
161
-
162
- if self.scope:
163
- payload["scope"] = self.scope
164
-
165
- # Configure HTTP client with SSL settings
166
- verify = True
167
- if self.ca_cert_path:
168
- verify = self.ca_cert_path
169
-
170
- headers = {
171
- "Content-Type": "application/x-www-form-urlencoded",
172
- "Accept": "application/json",
173
- }
174
-
175
- last_exception = None
176
-
177
- for attempt in range(self.max_retries + 1):
178
- try:
179
- async with httpx.AsyncClient(verify=verify) as client:
180
- response = await client.post(
181
- self.token_url,
182
- data=payload,
183
- headers=headers,
184
- timeout=30.0,
185
- )
186
- response.raise_for_status()
187
-
188
- token_data = response.json()
189
-
190
- # Validate response
191
- if "access_token" not in token_data:
192
- raise ValueError("Token response missing 'access_token' field")
193
-
194
- # Add expiration timestamp for cache management
195
- expires_in = token_data.get("expires_in", 3600)
196
- token_data["expires_at"] = time.time() + expires_in
197
-
198
- logger.info("Successfully fetched OAuth token, expires in %d seconds", expires_in)
199
- return token_data
200
-
201
- except httpx.HTTPStatusError as e:
202
- last_exception = e
203
- # Don't retry on 4xx errors (client errors)
204
- if 400 <= e.response.status_code < 500:
205
- logger.error(
206
- "OAuth token request failed with client error %d: %s",
207
- e.response.status_code,
208
- e.response.text
209
- )
210
- raise
211
-
212
- logger.warning(
213
- "OAuth token request failed with status %d (attempt %d/%d): %s",
214
- e.response.status_code,
215
- attempt + 1,
216
- self.max_retries + 1,
217
- e.response.text
218
- )
219
-
220
- except httpx.RequestError as e:
221
- last_exception = e
222
- logger.warning(
223
- "OAuth token request failed (attempt %d/%d): %s",
224
- attempt + 1,
225
- self.max_retries + 1,
226
- str(e)
227
- )
228
-
229
- except Exception as e:
230
- last_exception = e
231
- logger.error("Unexpected error during OAuth token fetch: %s", str(e))
232
- raise
233
-
234
- # Exponential backoff with jitter for retries
235
- if attempt < self.max_retries:
236
- delay = (2 ** attempt) + random.uniform(0, 1)
237
- logger.info("Retrying OAuth token request in %.2f seconds", delay)
238
- await asyncio.sleep(delay)
239
-
240
- # All retries exhausted
241
- logger.error("OAuth token request failed after %d attempts", self.max_retries + 1)
242
- if last_exception:
243
- raise last_exception
244
- else:
245
- raise RuntimeError("OAuth token request failed after all retries")
@@ -38,6 +38,7 @@ async def run_adk_async_task_thread_wrapper(
38
38
  adk_content: adk_types.Content,
39
39
  run_config: RunConfig,
40
40
  a2a_context: dict[str, Any],
41
+ append_context_event: bool = True,
41
42
  ):
42
43
  """
43
44
  Wrapper to run the async ADK task.
@@ -73,9 +74,8 @@ async def run_adk_async_task_thread_wrapper(
73
74
  logical_task_id,
74
75
  )
75
76
 
76
- if adk_session and component.session_service:
77
+ if adk_session and component.session_service and append_context_event:
77
78
  context_setting_invocation_id = logical_task_id
78
- original_message = a2a_context.pop("original_solace_message", None)
79
79
  try:
80
80
  context_setting_event = ADKEvent(
81
81
  invocation_id=context_setting_invocation_id,
@@ -107,15 +107,13 @@ async def run_adk_async_task_thread_wrapper(
107
107
  e_append,
108
108
  exc_info=True,
109
109
  )
110
- finally:
111
- if original_message:
112
- a2a_context["original_solace_message"] = original_message
113
110
  else:
114
- log.warning(
115
- "%s Could not inject a2a_context into ADK session state via event for task %s (session or session_service invalid). Tool scope filtering might not work.",
116
- component.log_identifier,
117
- logical_task_id,
118
- )
111
+ if append_context_event:
112
+ log.warning(
113
+ "%s Could not inject a2a_context into ADK session state via event for task %s (session or session_service invalid). Tool scope filtering might not work.",
114
+ component.log_identifier,
115
+ logical_task_id,
116
+ )
119
117
 
120
118
  is_paused = await run_adk_async_task(
121
119
  component,
@@ -126,6 +124,15 @@ async def run_adk_async_task_thread_wrapper(
126
124
  a2a_context,
127
125
  )
128
126
 
127
+ # Mark task as paused if it's waiting for peer response or user input
128
+ if task_context and is_paused:
129
+ task_context.set_paused(True)
130
+ log.debug(
131
+ "%s Task %s marked as paused, waiting for peer response or user input.",
132
+ component.log_identifier,
133
+ logical_task_id,
134
+ )
135
+
129
136
  log.debug(
130
137
  "%s ADK task %s awaited and completed (Paused: %s).",
131
138
  component.log_identifier,
@@ -194,13 +201,13 @@ async def run_adk_async_task_thread_wrapper(
194
201
  llm_limit_e,
195
202
  )
196
203
  except BadRequestError as e:
204
+ exception_to_finalize_with = e
197
205
  log.error(
198
- "%s Bad Request for task %s: %s.",
206
+ "%s Bad Request for task %s: %s. Scheduling finalization.",
199
207
  component.log_identifier,
200
208
  logical_task_id,
201
- e.message
209
+ e.message,
202
210
  )
203
- raise
204
211
  except Exception as e:
205
212
  exception_to_finalize_with = e
206
213
  log.exception(
@@ -254,7 +261,11 @@ async def run_adk_async_task(
254
261
  logical_task_id = a2a_context.get("logical_task_id", "unknown_task")
255
262
  event_loop_stored = False
256
263
  current_loop = asyncio.get_running_loop()
257
- 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] = []
258
269
 
259
270
  adk_event_generator = component.runner.run_async(
260
271
  user_id=adk_session.user_id,
@@ -309,7 +320,10 @@ async def run_adk_async_task(
309
320
  break
310
321
 
311
322
  if event.long_running_tool_ids:
312
- 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
+ )
313
327
 
314
328
  if not event_loop_stored and event.invocation_id:
315
329
  task_context.set_event_loop(current_loop)
@@ -335,8 +349,18 @@ async def run_adk_async_task(
335
349
  if event.content and event.content.parts:
336
350
  for part in event.content.parts:
337
351
  if part.function_response:
338
- if part.function_response.name.startswith("peer_"):
339
- 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
+ )
340
364
 
341
365
  except TaskCancelledError:
342
366
  raise
@@ -345,7 +369,7 @@ async def run_adk_async_task(
345
369
  "%s Bad Request for task %s: %s.",
346
370
  component.log_identifier,
347
371
  logical_task_id,
348
- e.message
372
+ e.message,
349
373
  )
350
374
  raise
351
375
  except Exception as e:
@@ -367,14 +391,55 @@ async def run_adk_async_task(
367
391
  f"Task {logical_task_id} was cancelled before finalization."
368
392
  )
369
393
 
370
- 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
+
371
415
  log.info(
372
- "%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).",
373
417
  component.log_identifier,
374
418
  logical_task_id,
419
+ len(pending_long_running_tools),
375
420
  )
376
421
  return True
377
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
+
378
443
  log.debug(
379
444
  "%s ADK run_async completed for task %s. Returning to wrapper for finalization.",
380
445
  component.log_identifier,
@@ -0,0 +1,88 @@
1
+ """
2
+ ADK Database Schema Migrations
3
+
4
+ Automatically runs Alembic migrations on agent startup to ensure
5
+ database schema compatibility with the installed ADK version.
6
+
7
+ This uses Google ADK's official migration approach via Alembic's
8
+ autogenerate feature to detect and apply schema changes.
9
+ """
10
+
11
+ import logging
12
+ import re
13
+ from pathlib import Path
14
+ from alembic.config import Config
15
+ from alembic import command
16
+
17
+ log = logging.getLogger(__name__)
18
+
19
+
20
+ def run_migrations(db_service, component):
21
+ """
22
+ Run Alembic database migrations programmatically.
23
+
24
+ Executes any pending migrations to ensure the database schema
25
+ matches ADK's model definitions. This is equivalent to running:
26
+ alembic upgrade head
27
+
28
+ Args:
29
+ db_service: DatabaseSessionService instance
30
+ component: Component that owns this service (for logging)
31
+
32
+ Raises:
33
+ RuntimeError: If migration fails
34
+ """
35
+
36
+ try:
37
+ # Get paths to alembic directory and config
38
+ module_dir = Path(__file__).parent
39
+ alembic_ini = module_dir / "alembic.ini"
40
+ alembic_dir = module_dir / "alembic"
41
+
42
+ # Verify files exist
43
+ if not alembic_ini.exists():
44
+ log.warning(
45
+ "%s alembic.ini not found at %s, skipping migration",
46
+ component.log_identifier,
47
+ alembic_ini
48
+ )
49
+ return
50
+
51
+ if not alembic_dir.exists():
52
+ log.warning(
53
+ "%s alembic/ directory not found at %s, skipping migration",
54
+ component.log_identifier,
55
+ alembic_dir
56
+ )
57
+ return
58
+
59
+ # Create Alembic config
60
+ alembic_cfg = Config(str(alembic_ini))
61
+ alembic_cfg.set_main_option("script_location", str(alembic_dir))
62
+
63
+ # IMPORTANT: Store the engine in config attributes so env.py can access it
64
+ # This avoids URL encoding issues entirely
65
+ alembic_cfg.attributes['connection'] = db_service.db_engine
66
+
67
+ log.info(
68
+ "%s Running Alembic migrations for ADK schema compatibility...",
69
+ component.log_identifier
70
+ )
71
+
72
+ # Run migrations (equivalent to: alembic upgrade head)
73
+ # Run migrations (env.py will use the engine from attributes)
74
+ command.upgrade(alembic_cfg, "head")
75
+
76
+ log.info(
77
+ "%s Database schema migration complete",
78
+ component.log_identifier
79
+ )
80
+
81
+ except Exception as e:
82
+ log.error(
83
+ "%s Database migration failed: %s",
84
+ component.log_identifier,
85
+ e
86
+ )
87
+ raise RuntimeError(f"ADK database migration failed: {e}") from e
88
+
@@ -5,30 +5,36 @@ Initializes ADK Services based on configuration.
5
5
  import logging
6
6
  import os
7
7
  import re
8
- from typing import Dict, Optional, List, Any
9
- from typing_extensions import override
10
-
11
- from google.genai import types as adk_types
8
+ from typing import Any, Dict, List, Optional
12
9
 
13
-
14
- from google.adk.sessions import (
15
- BaseSessionService,
16
- InMemorySessionService,
17
- DatabaseSessionService,
18
- VertexAiSessionService,
19
- )
20
10
  from google.adk.artifacts import (
21
11
  BaseArtifactService,
22
- InMemoryArtifactService,
23
12
  GcsArtifactService,
13
+ InMemoryArtifactService,
14
+ )
15
+ from google.adk.artifacts.base_artifact_service import ArtifactVersion
16
+ from google.adk.auth.credential_service.base_credential_service import (
17
+ BaseCredentialService,
18
+ )
19
+ from google.adk.auth.credential_service.in_memory_credential_service import (
20
+ InMemoryCredentialService,
24
21
  )
25
22
  from google.adk.memory import (
26
23
  BaseMemoryService,
27
24
  InMemoryMemoryService,
28
25
  VertexAiRagMemoryService,
29
26
  )
27
+ from google.adk.sessions import (
28
+ BaseSessionService,
29
+ DatabaseSessionService,
30
+ InMemorySessionService,
31
+ VertexAiSessionService,
32
+ )
33
+ from google.genai import types as adk_types
34
+ from typing_extensions import override
30
35
 
31
36
  from .artifacts.filesystem_artifact_service import FilesystemArtifactService
37
+ from .schema_migration import run_migrations
32
38
 
33
39
  log = logging.getLogger(__name__)
34
40
 
@@ -152,6 +158,42 @@ class ScopedArtifactServiceWrapper(BaseArtifactService):
152
158
  filename=filename,
153
159
  )
154
160
 
161
+ @override
162
+ async def list_artifact_versions(
163
+ self,
164
+ *,
165
+ app_name: str,
166
+ user_id: str,
167
+ filename: str,
168
+ session_id: str,
169
+ ) -> List[ArtifactVersion]:
170
+ scoped_app_name = self._get_scoped_app_name(app_name)
171
+ return await self.wrapped_service.list_artifact_versions(
172
+ app_name=scoped_app_name,
173
+ user_id=user_id,
174
+ filename=filename,
175
+ session_id=session_id,
176
+ )
177
+
178
+ @override
179
+ async def get_artifact_version(
180
+ self,
181
+ *,
182
+ app_name: str,
183
+ user_id: str,
184
+ filename: str,
185
+ session_id: str,
186
+ version: Optional[int] = None,
187
+ ) -> Optional[ArtifactVersion]:
188
+ scoped_app_name = self._get_scoped_app_name(app_name)
189
+ return await self.wrapped_service.get_artifact_version(
190
+ app_name=scoped_app_name,
191
+ user_id=user_id,
192
+ filename=filename,
193
+ session_id=session_id,
194
+ version=version,
195
+ )
196
+
155
197
 
156
198
  def _sanitize_for_path(identifier: str) -> str:
157
199
  """Sanitizes a string to be safe for use as a directory name."""
@@ -170,9 +212,9 @@ def initialize_session_service(component) -> BaseSessionService:
170
212
  config = component.get_config("session_service", {})
171
213
 
172
214
  # Handle both dict and SessionServiceConfig object
173
- if hasattr(config, 'type'):
215
+ if hasattr(config, "type"):
174
216
  service_type = config.type.lower()
175
- db_url = getattr(config, 'database_url', None)
217
+ db_url = getattr(config, "database_url", None)
176
218
  else:
177
219
  service_type = config.get("type", "memory").lower()
178
220
  db_url = config.get("database_url")
@@ -191,7 +233,9 @@ def initialize_session_service(component) -> BaseSessionService:
191
233
  f"{component.log_identifier} 'database_url' is required for sql session service."
192
234
  )
193
235
  try:
194
- return DatabaseSessionService(db_url=db_url)
236
+ db_service = DatabaseSessionService(db_url=db_url)
237
+ run_migrations(db_service, component)
238
+ return db_service
195
239
  except ImportError:
196
240
  log.error(
197
241
  "%s SQLAlchemy not installed. Please install 'google-adk[database]' or 'sqlalchemy'.",
@@ -280,7 +324,6 @@ def initialize_artifact_service(component) -> BaseArtifactService:
280
324
  "aws_secret_access_key",
281
325
  "aws_session_token",
282
326
  "region_name",
283
- "endpoint_url",
284
327
  "config",
285
328
  ]
286
329
 
@@ -296,8 +339,9 @@ def initialize_artifact_service(component) -> BaseArtifactService:
296
339
  s3_config[key] = config[key]
297
340
 
298
341
  # Set credentials from environment variables as a fallback.
299
- if "endpoint_url" not in s3_config:
300
- s3_config["endpoint_url"] = os.environ.get("S3_ENDPOINT_URL")
342
+ endpoint_url = config.get("endpoint_url") or os.environ.get("S3_ENDPOINT_URL") or "https://s3.amazonaws.com"
343
+ s3_config["endpoint_url"] = endpoint_url
344
+
301
345
  if "aws_access_key_id" not in s3_config:
302
346
  env_access_key = os.environ.get("AWS_ACCESS_KEY_ID")
303
347
  if env_access_key is not None:
@@ -390,3 +434,35 @@ def initialize_memory_service(component) -> BaseMemoryService:
390
434
  raise ValueError(
391
435
  f"{component.log_identifier} Unsupported memory service type: {service_type}"
392
436
  )
437
+
438
+
439
+ def initialize_credential_service(component) -> BaseCredentialService | None:
440
+ """Initializes the ADK Credential Service based on configuration."""
441
+ config = component.get_config("credential_service", None)
442
+
443
+ # If no credential service is configured, return None
444
+ if config is None:
445
+ log.info(
446
+ "%s No credential service configured, skipping initialization",
447
+ component.log_identifier,
448
+ )
449
+ return None
450
+
451
+ # Handle both dict and CredentialServiceConfig object
452
+ if hasattr(config, "type"):
453
+ service_type = config.type.lower()
454
+ else:
455
+ service_type = config.get("type", "memory").lower()
456
+
457
+ log.info(
458
+ "%s Initializing Credential Service of type: %s",
459
+ component.log_identifier,
460
+ service_type,
461
+ )
462
+
463
+ if service_type == "memory":
464
+ return InMemoryCredentialService()
465
+ else:
466
+ raise ValueError(
467
+ f"{component.log_identifier} Unsupported credential service type: {service_type}"
468
+ )