solace-agent-mesh 1.7.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 (447) 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/artifacts/filesystem_artifact_service.py +164 -0
  7. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
  8. solace_agent_mesh/agent/adk/callbacks.py +752 -127
  9. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +99 -7
  10. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
  11. solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
  12. solace_agent_mesh/agent/adk/models/lite_llm.py +34 -16
  13. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
  14. solace_agent_mesh/agent/adk/runner.py +66 -8
  15. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  16. solace_agent_mesh/agent/adk/services.py +41 -1
  17. solace_agent_mesh/agent/adk/setup.py +220 -32
  18. solace_agent_mesh/agent/adk/stream_parser.py +229 -40
  19. solace_agent_mesh/agent/protocol/event_handlers.py +219 -33
  20. solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
  21. solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
  22. solace_agent_mesh/agent/proxies/base/component.py +188 -22
  23. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
  24. solace_agent_mesh/agent/sac/app.py +37 -12
  25. solace_agent_mesh/agent/sac/component.py +322 -52
  26. solace_agent_mesh/agent/sac/patch_adk.py +8 -16
  27. solace_agent_mesh/agent/sac/task_execution_context.py +90 -0
  28. solace_agent_mesh/agent/tools/__init__.py +3 -0
  29. solace_agent_mesh/agent/tools/audio_tools.py +3 -3
  30. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +698 -24
  31. solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
  32. solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
  33. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  34. solace_agent_mesh/agent/tools/tool_config_types.py +54 -2
  35. solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
  36. solace_agent_mesh/agent/tools/web_tools.py +125 -17
  37. solace_agent_mesh/agent/utils/artifact_helpers.py +243 -5
  38. solace_agent_mesh/agent/utils/context_helpers.py +17 -0
  39. solace_agent_mesh/assets/docs/404.html +6 -6
  40. solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
  41. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  42. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  43. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  44. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  45. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  46. solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
  47. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
  56. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
  87. solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
  88. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
  89. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
  90. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
  91. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
  92. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +75 -75
  93. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  94. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
  95. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
  96. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
  97. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
  98. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
  99. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
  100. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  101. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
  102. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +98 -112
  103. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  104. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
  105. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  106. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -28
  107. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -29
  108. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
  109. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
  110. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  111. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +67 -53
  112. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -17
  113. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  114. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
  115. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +87 -87
  116. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
  117. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
  118. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
  119. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
  120. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
  121. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
  122. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
  123. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
  124. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
  125. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
  126. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
  127. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
  128. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
  129. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
  130. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  131. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +50 -23
  132. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +29 -24
  133. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +21 -21
  134. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
  135. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  136. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +96 -66
  137. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +181 -181
  138. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +75 -75
  139. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +27 -27
  140. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
  141. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -38
  142. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
  143. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
  144. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  145. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +135 -114
  146. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +37 -37
  147. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
  148. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
  149. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
  150. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
  151. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +112 -112
  152. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +28 -28
  153. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
  154. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
  155. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  156. solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
  157. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  158. solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
  159. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  160. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  161. solace_agent_mesh/cli/__init__.py +1 -1
  162. solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
  163. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
  164. solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
  165. solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
  166. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  167. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  168. solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
  169. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
  170. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  171. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
  172. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
  173. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  174. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
  175. solace_agent_mesh/cli/commands/run_cmd.py +64 -49
  176. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  177. solace_agent_mesh/cli/main.py +15 -0
  178. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-tcIFZLis.js → authCallback-KnKMP_vb.js} +1 -1
  179. solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
  180. solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
  181. solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
  182. solace_agent_mesh/client/webui/frontend/static/assets/{vendor-CINwxvwV.js → vendor-CGk8Suyh.js} +189 -94
  183. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  184. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  185. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  186. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  187. solace_agent_mesh/common/a2a/types.py +1 -1
  188. solace_agent_mesh/common/agent_registry.py +38 -11
  189. solace_agent_mesh/common/data_parts.py +124 -0
  190. solace_agent_mesh/common/error_handlers.py +83 -0
  191. solace_agent_mesh/common/exceptions.py +24 -0
  192. solace_agent_mesh/common/oauth/__init__.py +17 -0
  193. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  194. solace_agent_mesh/common/oauth/utils.py +50 -0
  195. solace_agent_mesh/common/rag_dto.py +156 -0
  196. solace_agent_mesh/common/sac/sam_component_base.py +73 -1
  197. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  198. solace_agent_mesh/common/utils/embeds/converter.py +1 -8
  199. solace_agent_mesh/common/utils/embeds/modifiers.py +2 -27
  200. solace_agent_mesh/common/utils/embeds/resolver.py +94 -25
  201. solace_agent_mesh/common/utils/embeds/types.py +1 -0
  202. solace_agent_mesh/common/utils/log_formatters.py +20 -0
  203. solace_agent_mesh/common/utils/mime_helpers.py +12 -5
  204. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  205. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  206. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  207. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  208. solace_agent_mesh/config_portal/backend/common.py +12 -0
  209. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
  210. solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
  211. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
  212. solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
  213. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
  214. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
  215. solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
  216. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  217. solace_agent_mesh/core_a2a/service.py +3 -2
  218. solace_agent_mesh/gateway/adapter/base.py +28 -1
  219. solace_agent_mesh/gateway/adapter/types.py +9 -0
  220. solace_agent_mesh/gateway/base/app.py +10 -0
  221. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  222. solace_agent_mesh/gateway/base/component.py +451 -10
  223. solace_agent_mesh/gateway/generic/component.py +274 -30
  224. solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
  225. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +2 -43
  226. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +2 -2
  227. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  228. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  229. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  230. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  231. solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
  232. solace_agent_mesh/gateway/http_sse/app.py +23 -6
  233. solace_agent_mesh/gateway/http_sse/component.py +158 -73
  234. solace_agent_mesh/gateway/http_sse/dependencies.py +50 -57
  235. solace_agent_mesh/gateway/http_sse/main.py +58 -482
  236. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  237. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +1 -1
  238. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +1 -1
  239. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +3 -2
  240. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
  241. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +2 -2
  242. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +2 -2
  243. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +5 -0
  244. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  245. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +1 -1
  246. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
  247. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +1 -1
  248. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +1 -1
  249. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +12 -107
  250. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
  251. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
  252. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +113 -7
  253. solace_agent_mesh/gateway/http_sse/routers/auth.py +69 -132
  254. solace_agent_mesh/gateway/http_sse/routers/config.py +235 -10
  255. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  256. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  257. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +1 -1
  258. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  259. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +1 -0
  260. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +3 -2
  261. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  262. solace_agent_mesh/gateway/http_sse/routers/feedback.py +2 -2
  263. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  264. solace_agent_mesh/gateway/http_sse/routers/projects.py +250 -24
  265. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
  266. solace_agent_mesh/gateway/http_sse/routers/sessions.py +14 -5
  267. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  268. solace_agent_mesh/gateway/http_sse/routers/sse.py +117 -4
  269. solace_agent_mesh/gateway/http_sse/routers/tasks.py +509 -149
  270. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  271. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  272. solace_agent_mesh/gateway/http_sse/routers/visualization.py +2 -1
  273. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  274. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  275. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  276. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  277. solace_agent_mesh/gateway/http_sse/services/project_service.py +539 -12
  278. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  279. solace_agent_mesh/gateway/http_sse/services/session_service.py +198 -21
  280. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
  281. solace_agent_mesh/gateway/http_sse/sse_manager.py +280 -169
  282. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  283. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
  284. solace_agent_mesh/services/__init__.py +0 -0
  285. solace_agent_mesh/services/platform/__init__.py +29 -0
  286. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  287. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  288. solace_agent_mesh/services/platform/alembic.ini +109 -0
  289. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  290. solace_agent_mesh/services/platform/api/dependencies.py +154 -0
  291. solace_agent_mesh/services/platform/api/main.py +314 -0
  292. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  293. solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
  294. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  295. solace_agent_mesh/services/platform/app.py +215 -0
  296. solace_agent_mesh/services/platform/component.py +777 -0
  297. solace_agent_mesh/shared/__init__.py +14 -0
  298. solace_agent_mesh/shared/api/__init__.py +42 -0
  299. solace_agent_mesh/shared/auth/__init__.py +26 -0
  300. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  301. solace_agent_mesh/shared/auth/middleware.py +347 -0
  302. solace_agent_mesh/shared/database/__init__.py +20 -0
  303. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  304. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  305. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  306. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  307. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +1 -1
  308. solace_agent_mesh/shared/utils/__init__.py +21 -0
  309. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  310. solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
  311. solace_agent_mesh/templates/platform.yaml +49 -0
  312. solace_agent_mesh/templates/plugin_readme_template.md +3 -25
  313. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  314. solace_agent_mesh/templates/proxy_template.yaml +62 -0
  315. solace_agent_mesh/templates/webui.yaml +148 -6
  316. solace_agent_mesh/tools/web_search/__init__.py +18 -0
  317. solace_agent_mesh/tools/web_search/base.py +84 -0
  318. solace_agent_mesh/tools/web_search/google_search.py +247 -0
  319. solace_agent_mesh/tools/web_search/models.py +99 -0
  320. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +29 -8
  321. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/RECORD +334 -313
  322. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
  323. solace_agent_mesh/agent/adk/adk_llm.txt +0 -226
  324. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  325. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  326. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -189
  327. solace_agent_mesh/agent/agent_llm.txt +0 -369
  328. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  329. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  330. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  331. solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +0 -190
  332. solace_agent_mesh/agent/proxies/base/base_llm.txt +0 -148
  333. solace_agent_mesh/agent/proxies/proxies_llm.txt +0 -283
  334. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  335. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  336. solace_agent_mesh/agent/testing/testing_llm.txt +0 -58
  337. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  338. solace_agent_mesh/agent/tools/tools_llm.txt +0 -276
  339. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -275
  340. solace_agent_mesh/agent/utils/utils_llm.txt +0 -152
  341. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  342. solace_agent_mesh/assets/docs/assets/js/05749d90.c70b2be9.js +0 -1
  343. solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +0 -1
  344. solace_agent_mesh/assets/docs/assets/js/15e40e79.36003774.js +0 -1
  345. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
  346. solace_agent_mesh/assets/docs/assets/js/240a0364.c39f8388.js +0 -1
  347. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  348. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  349. solace_agent_mesh/assets/docs/assets/js/3ac1795d.e4870a49.js +0 -1
  350. solace_agent_mesh/assets/docs/assets/js/3ff0015d.b63ee53a.js +0 -1
  351. solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +0 -1
  352. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
  353. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.45b32c2b.js +0 -1
  354. solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +0 -1
  355. solace_agent_mesh/assets/docs/assets/js/66d4869e.830d443f.js +0 -1
  356. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
  357. solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +0 -1
  358. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
  359. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
  360. solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
  361. solace_agent_mesh/assets/docs/assets/js/94e8668d.09ed9234.js +0 -1
  362. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
  363. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
  364. solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +0 -1
  365. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
  366. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.f902fad8.js +0 -1
  367. solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +0 -1
  368. solace_agent_mesh/assets/docs/assets/js/e04b235d.c9c50c7b.js +0 -1
  369. solace_agent_mesh/assets/docs/assets/js/e3d9abda.d11c67a7.js +0 -1
  370. solace_agent_mesh/assets/docs/assets/js/e6f9706b.045d0fa1.js +0 -1
  371. solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +0 -1
  372. solace_agent_mesh/assets/docs/assets/js/f284c35a.5099c51e.js +0 -1
  373. solace_agent_mesh/assets/docs/assets/js/main.f213fe0c.js +0 -2
  374. solace_agent_mesh/assets/docs/assets/js/runtime~main.d9606d6a.js +0 -1
  375. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +0 -47
  376. solace_agent_mesh/assets/docs/lunr-index-1762283454666.json +0 -1
  377. solace_agent_mesh/assets/docs/search-doc-1762283454666.json +0 -1
  378. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  379. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  380. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  381. solace_agent_mesh/client/webui/frontend/static/assets/client-CRYdKo2Q.js +0 -25
  382. solace_agent_mesh/client/webui/frontend/static/assets/main-CojeY_1w.css +0 -1
  383. solace_agent_mesh/client/webui/frontend/static/assets/main-ILja9MCG.js +0 -353
  384. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -175
  385. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  386. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -445
  387. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  388. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -330
  389. solace_agent_mesh/common/common_llm.txt +0 -230
  390. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  391. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  392. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  393. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  394. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  395. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  396. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  397. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -81
  398. solace_agent_mesh/common/services/services_llm.txt +0 -368
  399. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  400. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  401. solace_agent_mesh/common/utils/utils_llm.txt +0 -335
  402. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  403. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
  404. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
  405. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
  406. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
  407. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  408. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  409. solace_agent_mesh/gateway/base/base_llm.txt +0 -226
  410. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  411. solace_agent_mesh/gateway/gateway_llm.txt +0 -369
  412. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  413. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -345
  414. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_fulltext_search_indexes.py +0 -92
  415. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -161
  416. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  417. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  418. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  419. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -221
  420. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -257
  421. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -308
  422. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -450
  423. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -133
  424. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -123
  425. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -312
  426. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -303
  427. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  428. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -319
  429. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  430. solace_agent_mesh/llm.txt +0 -228
  431. solace_agent_mesh/llm_detail.txt +0 -2835
  432. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  433. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  434. solace_agent_mesh/templates/logging_config_template.ini +0 -45
  435. solace_agent_mesh/templates/templates_llm.txt +0 -147
  436. /solace_agent_mesh/assets/docs/assets/js/{main.f213fe0c.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
  437. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  438. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  439. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  440. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  441. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  442. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  443. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  444. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  445. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  446. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
  447. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
@@ -10,6 +10,7 @@ The base class is determined at import time based on enterprise package availabi
10
10
  """
11
11
 
12
12
  import logging
13
+ import time
13
14
  from typing import Any
14
15
 
15
16
  from google.adk.auth.credential_manager import CredentialManager
@@ -28,6 +29,7 @@ from ..utils.context_helpers import get_original_session_id
28
29
 
29
30
  log = logging.getLogger(__name__)
30
31
 
32
+
31
33
  def _get_base_mcp_toolset_class() -> tuple[type[MCPToolset], bool]:
32
34
  """
33
35
  Factory function to determine which base MCP toolset class to use for inheritance.
@@ -76,6 +78,62 @@ def _get_base_mcp_tool_class() -> tuple[type[MCPTool], bool]:
76
78
  _BaseMcpToolClass, _base_supports_tool_config = _get_base_mcp_tool_class()
77
79
 
78
80
 
81
+ def _log_mcp_tool_call(userId, agentId, tool_name, session_id):
82
+ """A short log message so that customers can track tool usage per user/agent"""
83
+ log.info(
84
+ "MCP Tool Call - UserID: %s, AgentID: %s, ToolName: %s, SessionID: %s",
85
+ userId,
86
+ agentId,
87
+ tool_name,
88
+ session_id,
89
+ extra={
90
+ "user_id": userId,
91
+ "agent_id": agentId,
92
+ "tool_name": tool_name,
93
+ "session_id": session_id,
94
+ },
95
+ )
96
+
97
+
98
+ def _log_mcp_tool_success(userId, agentId, tool_name, session_id, duration_ms):
99
+ """A short log message so that customers can track successful tool completion per user/agent"""
100
+ log.info(
101
+ "MCP Tool Success - UserID: %s, AgentID: %s, ToolName: %s, SessionID: %s, Duration: %.2fms",
102
+ userId,
103
+ agentId,
104
+ tool_name,
105
+ session_id,
106
+ duration_ms,
107
+ extra={
108
+ "user_id": userId,
109
+ "agent_id": agentId,
110
+ "tool_name": tool_name,
111
+ "session_id": session_id,
112
+ "duration_ms": duration_ms,
113
+ },
114
+ )
115
+
116
+
117
+ def _log_mcp_tool_failure(userId, agentId, tool_name, session_id, duration_ms, error):
118
+ """A short log message so that customers can track tool failures per user/agent"""
119
+ log.error(
120
+ "MCP Tool Failure - UserID: %s, AgentID: %s, ToolName: %s, SessionID: %s, Duration: %.2fms, Error: %s",
121
+ userId,
122
+ agentId,
123
+ tool_name,
124
+ session_id,
125
+ duration_ms,
126
+ str(error),
127
+ extra={
128
+ "user_id": userId,
129
+ "agent_id": agentId,
130
+ "tool_name": tool_name,
131
+ "session_id": session_id,
132
+ "duration_ms": duration_ms,
133
+ },
134
+ )
135
+
136
+
79
137
  class EmbedResolvingMCPTool(_BaseMcpToolClass):
80
138
  """
81
139
  Custom MCPTool that resolves embeds in parameters before calling the actual MCP tool.
@@ -112,7 +170,7 @@ class EmbedResolvingMCPTool(_BaseMcpToolClass):
112
170
  original_mcp_tool._mcp_tool, "auth_credential", None
113
171
  ),
114
172
  )
115
- self._original_mcp_tool = original_mcp_tool
173
+ self._original_mcp_tool: MCPTool = original_mcp_tool
116
174
  self._tool_config = tool_config or {}
117
175
 
118
176
  async def _resolve_embeds_recursively(
@@ -275,6 +333,38 @@ class EmbedResolvingMCPTool(_BaseMcpToolClass):
275
333
  )
276
334
  return data
277
335
 
336
+
337
+ async def _execute_tool_with_audit_logs(self, tool_call, tool_context):
338
+ _log_mcp_tool_call(
339
+ tool_context.session.user_id,
340
+ tool_context.agent_name,
341
+ self.name,
342
+ tool_context.session.id,
343
+ )
344
+ start_time = time.perf_counter()
345
+ try:
346
+ result = await tool_call()
347
+ duration_ms = (time.perf_counter() - start_time) * 1000
348
+ _log_mcp_tool_success(
349
+ tool_context.session.user_id,
350
+ tool_context.agent_name,
351
+ self.name,
352
+ tool_context.session.id,
353
+ duration_ms,
354
+ )
355
+ return result
356
+ except Exception as e:
357
+ duration_ms = (time.perf_counter() - start_time) * 1000
358
+ _log_mcp_tool_failure(
359
+ tool_context.session.user_id,
360
+ tool_context.agent_name,
361
+ self.name,
362
+ tool_context.session.id,
363
+ duration_ms,
364
+ e,
365
+ )
366
+ raise
367
+
278
368
  async def _run_async_impl(
279
369
  self, *, args, tool_context: ToolContext, credential
280
370
  ) -> Any:
@@ -285,7 +375,6 @@ class EmbedResolvingMCPTool(_BaseMcpToolClass):
285
375
 
286
376
  # Get context for embed resolution - pass the tool_context object directly
287
377
  context_for_embeds = tool_context
288
-
289
378
  if context_for_embeds:
290
379
  log.debug(
291
380
  "%s Starting recursive embed resolution for all parameters. Context type: %s",
@@ -321,13 +410,14 @@ class EmbedResolvingMCPTool(_BaseMcpToolClass):
321
410
  log_identifier,
322
411
  )
323
412
  resolved_args = args
324
-
325
413
  # Call the original MCP tool with resolved parameters
326
- return await self._original_mcp_tool._run_async_impl(
327
- args=resolved_args, tool_context=tool_context, credential=credential
414
+ return await self._execute_tool_with_audit_logs(
415
+ lambda: self._original_mcp_tool._run_async_impl(
416
+ args=resolved_args, tool_context=tool_context, credential=credential
417
+ ),
418
+ tool_context,
328
419
  )
329
420
 
330
-
331
421
  # Get the base toolset class to use for inheritance
332
422
  _BaseMcpToolsetClass, _base_toolset_supports_tool_config = _get_base_mcp_toolset_class()
333
423
 
@@ -343,6 +433,7 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
343
433
  self,
344
434
  connection_params,
345
435
  tool_filter=None,
436
+ tool_name_prefix=None,
346
437
  auth_scheme=None,
347
438
  auth_credential=None,
348
439
  auth_discovery=None,
@@ -357,6 +448,7 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
357
448
  super().__init__(
358
449
  connection_params=connection_params,
359
450
  tool_filter=tool_filter,
451
+ tool_name_prefix=tool_name_prefix,
360
452
  auth_scheme=auth_scheme,
361
453
  auth_credential=auth_credential,
362
454
  auth_discovery=auth_discovery,
@@ -367,6 +459,7 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
367
459
  super().__init__(
368
460
  connection_params=connection_params,
369
461
  tool_filter=tool_filter,
462
+ tool_name_prefix=tool_name_prefix,
370
463
  auth_scheme=auth_scheme,
371
464
  auth_credential=auth_credential,
372
465
  )
@@ -403,4 +496,3 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
403
496
 
404
497
  self._tool_cache = embed_resolving_tools
405
498
  return embed_resolving_tools
406
-
@@ -19,6 +19,7 @@ from .mcp_content_processor import MCPContentProcessor, MCPContentProcessorConfi
19
19
  from ...agent.utils.artifact_helpers import (
20
20
  save_artifact_with_metadata,
21
21
  DEFAULT_SCHEMA_MAX_KEYS,
22
+ DEFAULT_SCHEMA_INFERENCE_DEPTH,
22
23
  )
23
24
  from ...agent.utils.context_helpers import get_original_session_id
24
25
 
@@ -28,6 +29,41 @@ if TYPE_CHECKING:
28
29
  from ...agent.sac.component import SamAgentComponent
29
30
 
30
31
 
32
+ def _get_schema_config_from_tool_or_agent(
33
+ tool: BaseTool,
34
+ host_component: "SamAgentComponent",
35
+ config_key: str,
36
+ default_value: Any,
37
+ ) -> Any:
38
+ """
39
+ Get schema configuration from tool_config if available, otherwise fall back to agent config.
40
+
41
+ This allows per-tool override of schema settings like schema_inference_depth.
42
+
43
+ Args:
44
+ tool: The MCP tool instance (may have _tool_config attribute)
45
+ host_component: The agent component for fallback config
46
+ config_key: The configuration key to look up
47
+ default_value: Default value if not found in either location
48
+
49
+ Returns:
50
+ The configuration value from tool config, agent config, or default
51
+ """
52
+ # Check if tool has tool_config with this setting
53
+ tool_config = getattr(tool, "_tool_config", None)
54
+ if tool_config and isinstance(tool_config, dict):
55
+ if config_key in tool_config:
56
+ log.debug(
57
+ "Using per-tool config for %s: %s",
58
+ config_key,
59
+ tool_config[config_key],
60
+ )
61
+ return tool_config[config_key]
62
+
63
+ # Fall back to agent-level config
64
+ return host_component.get_config(config_key, default_value)
65
+
66
+
31
67
  class McpSaveStatus(str, Enum):
32
68
  """Enumeration for the status of an MCP save operation."""
33
69
 
@@ -164,7 +200,7 @@ async def save_mcp_response_as_artifact_intelligent(
164
200
  if hasattr(item, "uri"):
165
201
  item.uri = str(item.uri)
166
202
  result_dict = await _save_content_item_as_artifact(
167
- item, tool_context, host_component
203
+ item, tool, tool_context, host_component
168
204
  )
169
205
  if result_dict.get("status") in ["success", "partial_success"]:
170
206
  saved_artifacts.append(SavedArtifactInfo(**result_dict))
@@ -279,6 +315,7 @@ async def save_mcp_response_as_artifact_intelligent(
279
315
 
280
316
  async def _save_content_item_as_artifact(
281
317
  content_item,
318
+ tool: BaseTool,
282
319
  tool_context: ToolContext,
283
320
  host_component: "SamAgentComponent",
284
321
  ) -> Dict[str, Any]:
@@ -294,8 +331,12 @@ async def _save_content_item_as_artifact(
294
331
  app_name = host_component.agent_name
295
332
  user_id = tool_context._invocation_context.user_id
296
333
  session_id = get_original_session_id(tool_context._invocation_context)
297
- schema_max_keys = host_component.get_config(
298
- "schema_max_keys", DEFAULT_SCHEMA_MAX_KEYS
334
+ # Get schema config from tool_config (per-tool) or agent config (fallback)
335
+ schema_max_keys = _get_schema_config_from_tool_or_agent(
336
+ tool, host_component, "schema_max_keys", DEFAULT_SCHEMA_MAX_KEYS
337
+ )
338
+ schema_inference_depth = _get_schema_config_from_tool_or_agent(
339
+ tool, host_component, "schema_inference_depth", DEFAULT_SCHEMA_INFERENCE_DEPTH
299
340
  )
300
341
  artifact_timestamp = datetime.now(timezone.utc)
301
342
 
@@ -318,6 +359,7 @@ async def _save_content_item_as_artifact(
318
359
  metadata_dict=content_item.metadata,
319
360
  timestamp=artifact_timestamp,
320
361
  schema_max_keys=schema_max_keys,
362
+ schema_inference_depth=schema_inference_depth,
321
363
  tool_context=tool_context,
322
364
  )
323
365
 
@@ -376,8 +418,12 @@ async def _save_raw_mcp_response_fallback(
376
418
  app_name = host_component.agent_name
377
419
  user_id = tool_context._invocation_context.user_id
378
420
  session_id = get_original_session_id(tool_context._invocation_context)
379
- schema_max_keys = host_component.get_config(
380
- "schema_max_keys", DEFAULT_SCHEMA_MAX_KEYS
421
+ # Get schema config from tool_config (per-tool) or agent config (fallback)
422
+ schema_max_keys = _get_schema_config_from_tool_or_agent(
423
+ tool, host_component, "schema_max_keys", DEFAULT_SCHEMA_MAX_KEYS
424
+ )
425
+ schema_inference_depth = _get_schema_config_from_tool_or_agent(
426
+ tool, host_component, "schema_inference_depth", DEFAULT_SCHEMA_INFERENCE_DEPTH
381
427
  )
382
428
 
383
429
  save_result = await save_artifact_with_metadata(
@@ -391,6 +437,7 @@ async def _save_raw_mcp_response_fallback(
391
437
  metadata_dict=metadata_for_saving,
392
438
  timestamp=artifact_timestamp,
393
439
  schema_max_keys=schema_max_keys,
440
+ schema_inference_depth=schema_inference_depth,
394
441
  tool_context=tool_context,
395
442
  )
396
443
 
@@ -540,7 +540,7 @@ class MCPContentProcessor:
540
540
 
541
541
  format_mapping = {
542
542
  TextFormat.JSON: ("application/json", ".json"),
543
- TextFormat.YAML: ("application/x-yaml", ".yaml"),
543
+ TextFormat.YAML: ("application/yaml", ".yaml"),
544
544
  TextFormat.CSV: ("text/csv", ".csv"),
545
545
  TextFormat.MARKDOWN: ("text/markdown", ".md"),
546
546
  TextFormat.PLAIN: ("text/plain", ".txt"),
@@ -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
 
@@ -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")