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
@@ -27,6 +27,13 @@ from ...agent.utils.artifact_helpers import (
27
27
  load_artifact_content_or_metadata,
28
28
  )
29
29
  from ...common.a2a.types import ArtifactInfo
30
+ from ...common.utils.mime_helpers import is_text_based_mime_type
31
+ from ...common.utils.embeds import (
32
+ LATE_EMBED_TYPES,
33
+ evaluate_embed,
34
+ resolve_embeds_recursively_in_string,
35
+ )
36
+ from ...common.utils.embeds.types import ResolutionMode
30
37
  from ..adapter.base import GatewayAdapter
31
38
  from ..adapter.types import (
32
39
  GatewayContext,
@@ -40,6 +47,15 @@ from ..adapter.types import (
40
47
  )
41
48
  from ..base.component import BaseGatewayComponent
42
49
 
50
+ # Try to import enterprise auth handler
51
+ try:
52
+ from solace_agent_mesh_enterprise.gateway.auth import SAMOAuth2Handler
53
+ ENTERPRISE_AUTH_AVAILABLE = True
54
+ except ImportError:
55
+ ENTERPRISE_AUTH_AVAILABLE = False
56
+ SAMOAuth2Handler = None
57
+
58
+
43
59
  log = logging.getLogger(__name__)
44
60
 
45
61
  info = {
@@ -90,7 +106,7 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
90
106
  resolve_artifact_uris_in_gateway=resolve_uris,
91
107
  supports_inline_artifact_resolution=True,
92
108
  filter_tool_data_parts=False,
93
- **kwargs
109
+ **kwargs,
94
110
  )
95
111
  log.info("%s Initializing Generic Gateway Component...", self.log_identifier)
96
112
 
@@ -125,48 +141,181 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
125
141
  self.artifact_service = self.shared_artifact_service
126
142
  # `gateway_id`, `namespace`, `config` are available from base classes.
127
143
 
128
- # --- GatewayContext Implementation ---
144
+ # --- Setup Authentication ---
145
+ self._setup_auth()
129
146
 
130
- async def handle_external_input(
131
- self, external_input: Any, endpoint_context: Optional[Dict[str, Any]] = None
132
- ) -> str:
147
+ # --- Register Agent Registry Callbacks ---
148
+ # Wire up callbacks so the adapter is notified of agent changes
149
+ self.agent_registry.set_on_agent_added_callback(self._on_agent_added)
150
+ self.agent_registry.set_on_agent_removed_callback(self._on_agent_removed)
151
+ log.info(
152
+ "%s Agent registry callbacks registered for dynamic adapter updates.",
153
+ self.log_identifier,
154
+ )
155
+
156
+ def _setup_auth(self) -> None:
133
157
  """
134
- Processes an external input event through the full gateway flow.
135
- Orchestrates auth, task preparation, and A2A submission.
158
+ Setup authentication handler if enabled in config.
159
+
160
+ Uses enterprise SAMOAuth2Handler if available and auth is enabled.
161
+ Falls back gracefully if enterprise module is not installed.
162
+
163
+ Note: This method is called twice:
164
+ 1. During BaseGatewayComponent.__init__() (adapter_config not yet available)
165
+ 2. After adapter_config is set in GenericGatewayComponent.__init__()
136
166
  """
137
- log_id_prefix = f"{self.log_identifier}[HandleInput]"
167
+ # Early exit if adapter_config not yet set
168
+ if not hasattr(self, 'adapter_config'):
169
+ log.debug("%s _setup_auth() called before adapter_config set, skipping", self.log_identifier)
170
+ return
171
+
172
+ log.debug("%s adapter_config type: %s", self.log_identifier, type(self.adapter_config))
173
+
174
+ # Check enable_auth from adapter_config (not app_config)
175
+ # Handle both Pydantic models (use getattr) and plain dicts (use .get())
176
+ if isinstance(self.adapter_config, dict):
177
+ enable_auth = self.adapter_config.get('enable_auth', False)
178
+ log.debug("%s adapter_config is dict, keys: %s", self.log_identifier, list(self.adapter_config.keys()))
179
+ else:
180
+ # Pydantic model or other object
181
+ enable_auth = getattr(self.adapter_config, 'enable_auth', False)
182
+ log.debug("%s adapter_config is Pydantic model, enable_auth=%s", self.log_identifier, enable_auth)
183
+
184
+ log.info("%s Authentication check: enable_auth=%s (from adapter_config)", self.log_identifier, enable_auth)
185
+
186
+ if not enable_auth:
187
+ log.debug("%s Authentication disabled in config", self.log_identifier)
188
+ return
189
+
190
+ if not ENTERPRISE_AUTH_AVAILABLE:
191
+ log.warning(
192
+ "%s Authentication enabled but enterprise module not available. "
193
+ "Install solace-agent-mesh-enterprise to enable OAuth2 authentication.",
194
+ self.log_identifier
195
+ )
196
+ return
197
+
198
+ try:
199
+ # Build config dict for SAMOAuth2Handler from adapter_config
200
+ # Handler expects: oauth_proxy_url, external_auth_service_url, external_auth_provider, callback_url
201
+ auth_config = {}
202
+
203
+ # Try to get config from adapter_config (Pydantic model or dict)
204
+ if hasattr(self.adapter_config, '__dict__'):
205
+ # Pydantic model
206
+ auth_config = self.adapter_config.__dict__.copy()
207
+ elif isinstance(self.adapter_config, dict):
208
+ # Plain dict
209
+ auth_config = self.adapter_config.copy()
210
+
211
+ # Ensure callback_url is set (construct from host/port if not provided)
212
+ if 'callback_url' not in auth_config and 'callback_uri' not in auth_config:
213
+ # Try to construct from host and port
214
+ host = auth_config.get('host', 'localhost')
215
+ port = auth_config.get('port', 8080)
216
+ auth_config['callback_url'] = f"http://{host}:{port}/oauth/callback"
217
+ log.debug("%s Constructed callback_url: %s", self.log_identifier, auth_config['callback_url'])
218
+
219
+ # Initialize enterprise OAuth2 handler
220
+ self.auth_handler = SAMOAuth2Handler(auth_config)
221
+ log.info("%s OAuth2 authentication enabled via enterprise module", self.log_identifier)
222
+ except Exception as e:
223
+ log.error("%s Failed to initialize OAuth2 authentication: %s", self.log_identifier, e, exc_info=True)
224
+ self.auth_handler = None
225
+
226
+ def _on_agent_added(self, agent_card: Any) -> None:
227
+ """Called when a new agent is added to the registry."""
228
+ if self.adapter:
229
+ log.info(
230
+ "%s Registering new agent: %s",
231
+ self.log_identifier,
232
+ agent_card.name,
233
+ )
234
+ # Schedule the async call in the component's event loop
235
+ asyncio.run_coroutine_threadsafe(
236
+ self.adapter.handle_agent_registered(agent_card), self.get_async_loop()
237
+ )
238
+
239
+ def _on_agent_removed(self, agent_name: str) -> None:
240
+ """Called when an agent is removed from the registry."""
241
+ log.info(
242
+ "%s Deregistering agent: %s",
243
+ self.log_identifier,
244
+ agent_name,
245
+ )
246
+
247
+ if self.adapter:
248
+ # Schedule the async call in the component's event loop
249
+ asyncio.run_coroutine_threadsafe(
250
+ self.adapter.handle_agent_deregistered(agent_name), self.get_async_loop()
251
+ )
252
+
253
+ async def get_user_identity(
254
+ self, external_input: Any, endpoint_context: Optional[Dict[str, Any]] = None
255
+ ) -> Optional[Dict[str, Any]]:
256
+ """
257
+ Extracts the user identity from the external input via the adapter.
258
+
259
+ Returns:
260
+ A dictionary representing the user identity, or None if not available.
261
+ """
262
+ log_id_prefix = f"{self.log_identifier}[GetUserIdentity]"
138
263
  user_identity = None
264
+ # 1. Authentication & Enrichment
265
+ # Try enterprise authentication first, fallback to adapter-based auth
139
266
  try:
140
- # 1. Authentication & Enrichment
267
+ from solace_agent_mesh_enterprise.gateway.auth import authenticate_request
268
+
269
+ auth_claims = await authenticate_request(
270
+ adapter=self.adapter,
271
+ external_input=external_input,
272
+ endpoint_context=endpoint_context,
273
+ )
274
+ log.debug("%s Using enterprise authentication", log_id_prefix)
275
+ except ImportError:
276
+ # Enterprise package not available, use adapter-based auth
277
+ log.debug("%s Enterprise package not available, using adapter auth", log_id_prefix)
141
278
  auth_claims = await self.adapter.extract_auth_claims(
142
279
  external_input, endpoint_context
143
280
  )
144
281
 
145
- # The final user_identity is a dictionary, not the Pydantic model.
146
- # It's built from claims and potentially enriched by an identity service.
147
- if auth_claims:
148
- if self.identity_service:
149
- # Pass the rich claims object to the identity service
150
- enriched_profile = await self.identity_service.get_user_profile(
151
- auth_claims
152
- )
153
- if enriched_profile:
154
- # Merge claims and profile, with profile taking precedence
155
- user_identity = {
156
- **auth_claims.model_dump(),
157
- **enriched_profile,
158
- }
159
- else:
160
- user_identity = auth_claims.model_dump()
282
+ # The final user_identity is a dictionary, not the Pydantic model.
283
+ # It's built from claims and potentially enriched by an identity service.
284
+ if auth_claims:
285
+ if self.identity_service:
286
+ # Pass the rich claims object to the identity service
287
+ enriched_profile = await self.identity_service.get_user_profile(
288
+ auth_claims
289
+ )
290
+ if enriched_profile:
291
+ # Merge claims and profile, with profile taking precedence
292
+ user_identity = {
293
+ **auth_claims.model_dump(),
294
+ **enriched_profile,
295
+ }
161
296
  else:
162
- # No identity service, just use the claims from the adapter
163
297
  user_identity = auth_claims.model_dump()
164
298
  else:
165
- # Fallback to default identity if no claims are extracted
166
- default_identity = self.get_config("default_user_identity")
167
- if default_identity:
168
- user_identity = {"id": default_identity, "name": default_identity}
299
+ # No identity service, just use the claims from the adapter
300
+ user_identity = auth_claims.model_dump()
301
+ else:
302
+ # Fallback to default identity if no claims are extracted
303
+ default_identity = self.get_config("default_user_identity")
304
+ if default_identity:
305
+ user_identity = {"id": default_identity, "name": default_identity}
306
+ return user_identity
169
307
 
308
+ async def handle_external_input(
309
+ self, external_input: Any, endpoint_context: Optional[Dict[str, Any]] = None
310
+ ) -> str:
311
+ """
312
+ Processes an external input event through the full gateway flow.
313
+ Orchestrates auth, task preparation, and A2A submission.
314
+ """
315
+ log_id_prefix = f"{self.log_identifier}[HandleInput]"
316
+ user_identity = None
317
+ try:
318
+ user_identity = await self.get_user_identity(external_input, endpoint_context)
170
319
  if not user_identity or not user_identity.get("id"):
171
320
  raise PermissionError(
172
321
  "Authentication failed: No identity could be determined."
@@ -175,6 +324,8 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
175
324
  log.info(
176
325
  "%s Authenticated user: %s", log_id_prefix, user_identity.get("id")
177
326
  )
327
+ # Add user_id to external_input so adapter can use it for permission checks.
328
+ external_input["user_id"] = user_identity.get("id")
178
329
 
179
330
  # 2. Task Preparation
180
331
  sam_task = await self.adapter.prepare_task(external_input, endpoint_context)
@@ -194,6 +345,10 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
194
345
  **sam_task.platform_context,
195
346
  }
196
347
 
348
+ # Pass session_behavior if provided by adapter
349
+ if sam_task.session_behavior:
350
+ external_request_context["session_behavior"] = sam_task.session_behavior
351
+
197
352
  task_id = await self.submit_a2a_task(
198
353
  target_agent_name=sam_task.target_agent,
199
354
  a2a_parts=a2a_parts,
@@ -217,6 +372,7 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
217
372
  # Create a dummy context to report the error
218
373
  error_context = ResponseContext(
219
374
  task_id="pre-task-error",
375
+ session_id=None,
220
376
  conversation_id=None,
221
377
  user_id=user_identity.get("id"),
222
378
  platform_context={},
@@ -294,7 +450,79 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
294
450
  )
295
451
  if artifact_data.get("status") == "success":
296
452
  content_bytes = artifact_data.get("raw_bytes")
453
+ mime_type = artifact_data.get("mime_type")
454
+
297
455
  if content_bytes:
456
+ # For text-based artifacts, resolve templates and late embeds
457
+ if mime_type and is_text_based_mime_type(mime_type):
458
+ try:
459
+
460
+ content_str = content_bytes.decode("utf-8")
461
+
462
+ # Build context for resolution
463
+ context_for_resolver = {
464
+ "artifact_service": self.artifact_service,
465
+ "session_context": {
466
+ "app_name": self.gateway_id,
467
+ "user_id": context.user_id,
468
+ "session_id": context.session_id,
469
+ },
470
+ }
471
+
472
+ config_for_resolver = {
473
+ "gateway_max_artifact_resolve_size_bytes": (
474
+ self.gateway_max_artifact_resolve_size_bytes
475
+ if hasattr(
476
+ self, "gateway_max_artifact_resolve_size_bytes"
477
+ )
478
+ else -1
479
+ ),
480
+ "gateway_recursive_embed_depth": (
481
+ self.gateway_recursive_embed_depth
482
+ if hasattr(self, "gateway_recursive_embed_depth")
483
+ else 12
484
+ ),
485
+ }
486
+
487
+ log.debug(
488
+ "%s Text-based artifact. Resolving late embeds and templates.",
489
+ log_id_prefix,
490
+ )
491
+
492
+ # Resolve late embeds
493
+ resolved_content_str = await resolve_embeds_recursively_in_string(
494
+ text=content_str,
495
+ context=context_for_resolver,
496
+ resolver_func=evaluate_embed,
497
+ types_to_resolve=LATE_EMBED_TYPES,
498
+ resolution_mode=ResolutionMode.RECURSIVE_ARTIFACT_CONTENT,
499
+ log_identifier=f"{log_id_prefix}[RecursiveResolve]",
500
+ config=config_for_resolver,
501
+ max_depth=config_for_resolver[
502
+ "gateway_recursive_embed_depth"
503
+ ],
504
+ max_total_size=config_for_resolver[
505
+ "gateway_max_artifact_resolve_size_bytes"
506
+ ],
507
+ )
508
+
509
+ # Template blocks are automatically resolved by resolve_embeds_recursively_in_string
510
+ # when resolving late embeds. No need to call template resolution separately.
511
+
512
+ content_bytes = resolved_content_str.encode("utf-8")
513
+ log.info(
514
+ "%s Resolved embeds (including templates). Final size: %d bytes.",
515
+ log_id_prefix,
516
+ len(content_bytes),
517
+ )
518
+ except Exception as resolve_err:
519
+ log.warning(
520
+ "%s Failed to resolve embeds/templates: %s. Returning original content.",
521
+ log_id_prefix,
522
+ resolve_err,
523
+ )
524
+ # Fall through to return original content_bytes
525
+
298
526
  log.info(
299
527
  "%s Successfully loaded %d bytes for artifact '%s'.",
300
528
  log_id_prefix,
@@ -357,6 +585,22 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
357
585
  )
358
586
  return []
359
587
 
588
+ def list_agents(self) -> List[Any]:
589
+ """Lists all agents currently registered in the agent registry."""
590
+ log_id_prefix = f"{self.log_identifier}[ListAgents]"
591
+ try:
592
+ agent_names = self.agent_registry.get_agent_names()
593
+ agents = []
594
+ for agent_name in agent_names:
595
+ agent_card = self.agent_registry.get_agent(agent_name)
596
+ if agent_card:
597
+ agents.append(agent_card)
598
+ log.info("%s Found %d registered agents.", log_id_prefix, len(agents))
599
+ return agents
600
+ except Exception as e:
601
+ log.exception("%s Failed to list agents: %s", log_id_prefix, e)
602
+ return []
603
+
360
604
  async def submit_feedback(self, feedback: "SamFeedback") -> None:
361
605
  """Handles feedback submission from an adapter."""
362
606
  log_id_prefix = f"{self.log_identifier}[SubmitFeedback]"
@@ -1,5 +1,3 @@
1
- from logging.config import fileConfig
2
-
3
1
  from alembic import context
4
2
  from sqlalchemy import engine_from_config, pool
5
3
 
@@ -7,11 +5,6 @@ from sqlalchemy import engine_from_config, pool
7
5
  # access to the values within the .ini file in use.
8
6
  config = context.config
9
7
 
10
- # Interpret the config file for Python logging.
11
- # This line sets up loggers basically.
12
- if config.config_file_name is not None:
13
- fileConfig(config.config_file_name)
14
-
15
8
  # add your model's MetaData object here
16
9
  # for 'autogenerate' support
17
10
  from solace_agent_mesh.gateway.http_sse.repository.models.base import Base
@@ -65,56 +65,15 @@ def upgrade() -> None:
65
65
  op.create_index('ix_projects_user_deleted', 'projects', ['user_id', 'deleted_at'])
66
66
  except Exception:
67
67
  pass
68
-
69
- # Enable pg_trgm extension for fuzzy text search (PostgreSQL only)
70
- try:
71
- op.execute('CREATE EXTENSION IF NOT EXISTS pg_trgm')
72
- except Exception:
73
- # Not PostgreSQL or extension already exists
74
- pass
75
-
76
- # Create GIN indexes for text search on sessions
77
- if 'sessions' in inspector.get_table_names():
78
- try:
79
- # Index on session name for fuzzy search
80
- op.execute(
81
- 'CREATE INDEX IF NOT EXISTS ix_sessions_name_trgm ON sessions '
82
- 'USING gin (name gin_trgm_ops)'
83
- )
84
- except Exception:
85
- pass
86
-
87
- # Create GIN indexes for text search on chat_tasks
88
- if 'chat_tasks' in inspector.get_table_names():
89
- try:
90
- # Index on user_message for content search
91
- op.execute(
92
- 'CREATE INDEX IF NOT EXISTS ix_chat_tasks_user_message_trgm ON chat_tasks '
93
- 'USING gin (user_message gin_trgm_ops)'
94
- )
95
- except Exception:
96
- pass
97
68
 
98
69
 
99
70
  def downgrade() -> None:
100
71
  """Remove soft delete columns and search indexes."""
101
72
  bind = op.get_bind()
102
73
  inspector = inspect(bind)
103
-
104
- # Drop search indexes from chat_tasks
105
- if 'chat_tasks' in inspector.get_table_names():
106
- try:
107
- op.execute('DROP INDEX IF EXISTS ix_chat_tasks_user_message_trgm')
108
- except Exception:
109
- pass
110
-
111
- # Drop search indexes from sessions
74
+
75
+ # Drop soft delete indexes from sessions
112
76
  if 'sessions' in inspector.get_table_names():
113
- try:
114
- op.execute('DROP INDEX IF EXISTS ix_sessions_name_trgm')
115
- except Exception:
116
- pass
117
-
118
77
  try:
119
78
  op.drop_index('ix_sessions_user_deleted', table_name='sessions')
120
79
  except Exception:
@@ -1,7 +1,7 @@
1
1
  """add default agent to projects
2
2
 
3
3
  Revision ID: default_agent_001
4
- Revises: fts_indexes_001
4
+ Revises: soft_del_search_001
5
5
  Create Date: 2025-01-24 01:13:00.000000
6
6
 
7
7
  """
@@ -11,7 +11,7 @@ import sqlalchemy as sa
11
11
 
12
12
  # revision identifiers, used by Alembic.
13
13
  revision = 'default_agent_001'
14
- down_revision = 'fts_indexes_001'
14
+ down_revision = 'soft_del_search_001'
15
15
  branch_labels = None
16
16
  depends_on = None
17
17
 
@@ -0,0 +1,154 @@
1
+ """Create prompt tables with role-based sharing support
2
+
3
+ Revision ID: 20251108_prompt_tables_complete
4
+ Revises: 20251103_merge_heads
5
+ Create Date: 2025-11-08
6
+
7
+ This is a squashed migration that combines:
8
+ - Initial prompt tables creation
9
+ - Prompt pinning feature
10
+ - Role-based sharing via prompt_group_users table
11
+ """
12
+
13
+ from collections.abc import Sequence
14
+ import sqlalchemy as sa
15
+ from alembic import op
16
+
17
+ revision: str = "20251108_prompt_tables_complete"
18
+ down_revision: str | Sequence[str] | None = "default_agent_001"
19
+ branch_labels: str | Sequence[str] | None = None
20
+ depends_on: str | Sequence[str] | None = None
21
+
22
+
23
+ def upgrade() -> None:
24
+ """Create complete prompt schema with sharing support."""
25
+
26
+ # 1. Create prompts table (individual prompt versions)
27
+ op.create_table(
28
+ 'prompts',
29
+ sa.Column('id', sa.String(), nullable=False),
30
+ sa.Column('prompt_text', sa.Text(), nullable=False),
31
+ sa.Column('group_id', sa.String(), nullable=False),
32
+ sa.Column('user_id', sa.String(), nullable=False),
33
+ sa.Column('version', sa.Integer(), nullable=False, server_default='1'),
34
+ sa.Column('created_at', sa.BigInteger(), nullable=False),
35
+ sa.Column('updated_at', sa.BigInteger(), nullable=False),
36
+ sa.PrimaryKeyConstraint('id')
37
+ )
38
+
39
+ # Indexes for prompts
40
+ op.create_index('ix_prompts_group_id', 'prompts', ['group_id'], unique=False)
41
+ op.create_index('ix_prompts_user_id', 'prompts', ['user_id'], unique=False)
42
+
43
+ # 2. Create prompt_groups table (prompt collections)
44
+ op.create_table(
45
+ 'prompt_groups',
46
+ sa.Column('id', sa.String(), nullable=False),
47
+ sa.Column('name', sa.String(length=255), nullable=False),
48
+ sa.Column('description', sa.Text(), nullable=True),
49
+ sa.Column('category', sa.String(length=100), nullable=True),
50
+ sa.Column('command', sa.String(length=50), nullable=True),
51
+ sa.Column('user_id', sa.String(), nullable=False),
52
+ sa.Column('author_name', sa.String(length=255), nullable=True),
53
+ sa.Column('production_prompt_id', sa.String(), nullable=True),
54
+ sa.Column('is_shared', sa.Boolean(), nullable=False, server_default='false'),
55
+ sa.Column('is_pinned', sa.Boolean(), nullable=False, server_default='false'),
56
+ sa.Column('created_at', sa.BigInteger(), nullable=False),
57
+ sa.Column('updated_at', sa.BigInteger(), nullable=False),
58
+ sa.ForeignKeyConstraint(
59
+ ['production_prompt_id'],
60
+ ['prompts.id'],
61
+ ondelete='SET NULL'
62
+ ),
63
+ sa.PrimaryKeyConstraint('id')
64
+ )
65
+
66
+ # Indexes for prompt_groups
67
+ op.create_index('ix_prompt_groups_name', 'prompt_groups', ['name'], unique=False)
68
+ op.create_index('ix_prompt_groups_category', 'prompt_groups', ['category'], unique=False)
69
+ op.create_index('ix_prompt_groups_command', 'prompt_groups', ['command'], unique=True)
70
+ op.create_index('ix_prompt_groups_user_id', 'prompt_groups', ['user_id'], unique=False)
71
+ op.create_index('ix_prompt_groups_is_pinned', 'prompt_groups', ['is_pinned'], unique=False)
72
+
73
+ # 3. Add foreign key from prompts to prompt_groups
74
+ with op.batch_alter_table('prompts', schema=None) as batch_op:
75
+ batch_op.create_foreign_key(
76
+ 'fk_prompts_group_id',
77
+ 'prompt_groups',
78
+ ['group_id'],
79
+ ['id'],
80
+ ondelete='CASCADE'
81
+ )
82
+
83
+ # 4. Create prompt_group_users table (role-based sharing)
84
+ op.create_table(
85
+ 'prompt_group_users',
86
+ sa.Column('id', sa.String(), nullable=False),
87
+ sa.Column('prompt_group_id', sa.String(), nullable=False),
88
+ sa.Column('user_id', sa.String(), nullable=False),
89
+ sa.Column('role', sa.String(), nullable=False, server_default='viewer'),
90
+ sa.Column('added_at', sa.BigInteger(), nullable=False),
91
+ sa.Column('added_by_user_id', sa.String(), nullable=False),
92
+ sa.PrimaryKeyConstraint('id'),
93
+ sa.ForeignKeyConstraint(
94
+ ['prompt_group_id'],
95
+ ['prompt_groups.id'],
96
+ ondelete='CASCADE'
97
+ ),
98
+ sa.UniqueConstraint('prompt_group_id', 'user_id', name='uq_prompt_group_user')
99
+ )
100
+
101
+ # Indexes for prompt_group_users (optimized for sharing queries)
102
+ op.create_index(
103
+ 'ix_prompt_group_users_prompt_group_id',
104
+ 'prompt_group_users',
105
+ ['prompt_group_id'],
106
+ unique=False
107
+ )
108
+
109
+ op.create_index(
110
+ 'ix_prompt_group_users_user_id',
111
+ 'prompt_group_users',
112
+ ['user_id'],
113
+ unique=False
114
+ )
115
+
116
+ # Composite index for fast access checks
117
+ op.create_index(
118
+ 'ix_prompt_group_users_user_prompt',
119
+ 'prompt_group_users',
120
+ ['user_id', 'prompt_group_id'],
121
+ unique=False
122
+ )
123
+
124
+ # Optional: Index for role-based queries
125
+ op.create_index(
126
+ 'ix_prompt_group_users_user_role',
127
+ 'prompt_group_users',
128
+ ['user_id', 'role'],
129
+ unique=False
130
+ )
131
+
132
+
133
+ def downgrade() -> None:
134
+ """Remove all prompt-related tables."""
135
+
136
+ # Drop prompt_group_users table and indexes
137
+ op.drop_index('ix_prompt_group_users_user_role', table_name='prompt_group_users')
138
+ op.drop_index('ix_prompt_group_users_user_prompt', table_name='prompt_group_users')
139
+ op.drop_index('ix_prompt_group_users_user_id', table_name='prompt_group_users')
140
+ op.drop_index('ix_prompt_group_users_prompt_group_id', table_name='prompt_group_users')
141
+ op.drop_table('prompt_group_users')
142
+
143
+ # Drop prompt_groups indexes and table
144
+ op.drop_index('ix_prompt_groups_is_pinned', table_name='prompt_groups')
145
+ op.drop_index('ix_prompt_groups_user_id', table_name='prompt_groups')
146
+ op.drop_index('ix_prompt_groups_command', table_name='prompt_groups')
147
+ op.drop_index('ix_prompt_groups_category', table_name='prompt_groups')
148
+ op.drop_index('ix_prompt_groups_name', table_name='prompt_groups')
149
+ op.drop_table('prompt_groups')
150
+
151
+ # Drop prompts indexes and table
152
+ op.drop_index('ix_prompts_user_id', table_name='prompts')
153
+ op.drop_index('ix_prompts_group_id', table_name='prompts')
154
+ op.drop_table('prompts')
@@ -0,0 +1,32 @@
1
+ """Add parent_task_id to tasks table
2
+
3
+ Revision ID: 20251115_add_parent_task_id
4
+ Revises: 20251108_prompt_tables_complete
5
+ Create Date: 2025-11-15
6
+
7
+ """
8
+
9
+ from collections.abc import Sequence
10
+ import sqlalchemy as sa
11
+ from alembic import op
12
+
13
+ revision: str = "20251115_add_parent_task_id"
14
+ down_revision: str | Sequence[str] | None = "20251108_prompt_tables_complete"
15
+ branch_labels: str | Sequence[str] | None = None
16
+ depends_on: str | Sequence[str] | None = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ """Add parent_task_id column to tasks table for efficient task hierarchy queries."""
21
+ op.add_column(
22
+ "tasks", sa.Column("parent_task_id", sa.String(), nullable=True)
23
+ )
24
+ op.create_index(
25
+ "ix_tasks_parent_task_id", "tasks", ["parent_task_id"], unique=False
26
+ )
27
+
28
+
29
+ def downgrade() -> None:
30
+ """Remove parent_task_id column from tasks table."""
31
+ op.drop_index("ix_tasks_parent_task_id", table_name="tasks")
32
+ op.drop_column("tasks", "parent_task_id")