solace-agent-mesh 1.11.2__py3-none-any.whl → 1.12.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. solace_agent_mesh/agent/adk/callbacks.py +177 -10
  2. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +3 -0
  3. solace_agent_mesh/agent/adk/models/lite_llm.py +34 -16
  4. solace_agent_mesh/agent/adk/runner.py +66 -8
  5. solace_agent_mesh/agent/adk/setup.py +61 -26
  6. solace_agent_mesh/agent/protocol/event_handlers.py +48 -0
  7. solace_agent_mesh/agent/proxies/a2a/component.py +27 -0
  8. solace_agent_mesh/agent/sac/component.py +84 -2
  9. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +41 -22
  10. solace_agent_mesh/agent/tools/peer_agent_tool.py +19 -12
  11. solace_agent_mesh/agent/tools/tool_config_types.py +21 -1
  12. solace_agent_mesh/agent/utils/artifact_helpers.py +54 -0
  13. solace_agent_mesh/assets/docs/404.html +3 -3
  14. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  15. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  16. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  17. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  18. solace_agent_mesh/assets/docs/assets/js/{3ac1795d.28b7c67b.js → 3ac1795d.dc006e20.js} +1 -1
  19. solace_agent_mesh/assets/docs/assets/js/3ff0015d.f08618fb.js +1 -0
  20. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  21. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  22. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  23. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  24. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  25. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  26. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  27. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  28. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  29. solace_agent_mesh/assets/docs/assets/js/81a99df0.95be65d4.js +1 -0
  30. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  31. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  32. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  33. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  34. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  35. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  36. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  37. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  38. solace_agent_mesh/assets/docs/assets/js/f284c35a.08fab659.js +1 -0
  39. solace_agent_mesh/assets/docs/assets/js/main.b241af3e.js +2 -0
  40. solace_agent_mesh/assets/docs/assets/js/runtime~main.4ca7d2e2.js +1 -0
  41. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +4 -4
  42. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +4 -4
  43. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +4 -4
  44. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +4 -4
  45. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +4 -4
  46. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  47. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +14 -12
  48. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +30 -9
  49. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +4 -4
  50. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +6 -4
  51. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +4 -4
  52. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  53. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +4 -4
  54. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +4 -4
  55. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +4 -4
  56. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +4 -4
  57. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +4 -4
  58. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +4 -4
  59. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +5 -5
  60. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +4 -4
  61. solace_agent_mesh/assets/docs/docs/documentation/deploying/{kubernetes-deployment → kubernetes}/index.html +6 -6
  62. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  63. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +11 -6
  64. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +4 -4
  65. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +4 -4
  66. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +4 -4
  67. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +4 -4
  68. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +23 -5
  69. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +4 -4
  70. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +4 -4
  71. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +4 -4
  72. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +4 -4
  73. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +4 -4
  74. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +4 -4
  75. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +4 -4
  76. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +17 -8
  77. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +4 -4
  78. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +4 -4
  79. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +4 -4
  80. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +4 -4
  81. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +4 -4
  82. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +4 -4
  83. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +5 -5
  84. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +4 -4
  85. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +4 -4
  86. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +4 -4
  87. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +4 -4
  88. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +4 -4
  89. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +4 -4
  90. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +4 -4
  91. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +4 -4
  92. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +4 -4
  93. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +6 -5
  94. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +4 -4
  95. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +4 -4
  96. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  97. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +25 -4
  98. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +4 -4
  99. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +4 -4
  100. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +4 -4
  101. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +4 -4
  102. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +4 -4
  103. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +4 -4
  104. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +4 -4
  105. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +4 -4
  106. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +4 -4
  107. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  108. solace_agent_mesh/assets/docs/lunr-index-1767712284328.json +1 -0
  109. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  110. solace_agent_mesh/assets/docs/search-doc-1767712284328.json +1 -0
  111. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  112. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  113. solace_agent_mesh/cli/__init__.py +1 -1
  114. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  115. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  116. solace_agent_mesh/cli/commands/init_cmd/env_step.py +29 -2
  117. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  118. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  119. solace_agent_mesh/cli/main.py +2 -0
  120. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-Dj3JtK42.js → authCallback-8Nihi8rv.js} +1 -1
  121. solace_agent_mesh/client/webui/frontend/static/assets/{client-ZKk9kEJ5.js → client-DYtZN8p-.js} +1 -1
  122. solace_agent_mesh/client/webui/frontend/static/assets/main-BYGUHQMk.js +435 -0
  123. solace_agent_mesh/client/webui/frontend/static/assets/main-D2CSH1bp.css +1 -0
  124. solace_agent_mesh/client/webui/frontend/static/assets/{vendor-BNV4kZN0.js → vendor-XBWAmrun.js} +106 -101
  125. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  126. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  127. solace_agent_mesh/client/webui/frontend/static/ui-version.json +1 -1
  128. solace_agent_mesh/common/a2a/types.py +1 -1
  129. solace_agent_mesh/common/agent_registry.py +38 -11
  130. solace_agent_mesh/common/data_parts.py +28 -0
  131. solace_agent_mesh/common/error_handlers.py +83 -0
  132. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  133. solace_agent_mesh/config_portal/backend/common.py +2 -0
  134. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ZV-jX48T.js +103 -0
  135. solace_agent_mesh/config_portal/frontend/static/client/assets/{manifest-ba77705e.js → manifest-ce5bc5da.js} +1 -1
  136. solace_agent_mesh/config_portal/frontend/static/client/index.html +1 -1
  137. solace_agent_mesh/core_a2a/service.py +3 -2
  138. solace_agent_mesh/gateway/adapter/base.py +28 -1
  139. solace_agent_mesh/gateway/adapter/types.py +9 -0
  140. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  141. solace_agent_mesh/gateway/base/component.py +68 -1
  142. solace_agent_mesh/gateway/generic/component.py +195 -30
  143. solace_agent_mesh/gateway/http_sse/app.py +23 -6
  144. solace_agent_mesh/gateway/http_sse/component.py +9 -61
  145. solace_agent_mesh/gateway/http_sse/dependencies.py +9 -51
  146. solace_agent_mesh/gateway/http_sse/main.py +28 -418
  147. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  148. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +1 -1
  149. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +1 -1
  150. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +2 -2
  151. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +2 -2
  152. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +2 -2
  153. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +1 -1
  154. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +1 -1
  155. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +1 -1
  156. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +1 -1
  157. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +4 -4
  158. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +2 -2
  159. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +16 -15
  160. solace_agent_mesh/gateway/http_sse/routers/auth.py +61 -132
  161. solace_agent_mesh/gateway/http_sse/routers/config.py +12 -8
  162. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +1 -1
  163. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  164. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +2 -2
  165. solace_agent_mesh/gateway/http_sse/routers/feedback.py +2 -2
  166. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  167. solace_agent_mesh/gateway/http_sse/routers/projects.py +2 -1
  168. solace_agent_mesh/gateway/http_sse/routers/prompts.py +2 -1
  169. solace_agent_mesh/gateway/http_sse/routers/sessions.py +3 -3
  170. solace_agent_mesh/gateway/http_sse/routers/speech.py +1 -1
  171. solace_agent_mesh/gateway/http_sse/routers/tasks.py +3 -2
  172. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  173. solace_agent_mesh/gateway/http_sse/routers/visualization.py +2 -1
  174. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +1 -1
  175. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  176. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  177. solace_agent_mesh/gateway/http_sse/services/session_service.py +4 -4
  178. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +1 -1
  179. solace_agent_mesh/services/platform/__init__.py +23 -12
  180. solace_agent_mesh/services/platform/api/dependencies.py +23 -16
  181. solace_agent_mesh/services/platform/api/main.py +118 -43
  182. solace_agent_mesh/services/platform/api/routers/__init__.py +12 -3
  183. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  184. solace_agent_mesh/services/platform/app.py +101 -7
  185. solace_agent_mesh/services/platform/component.py +552 -33
  186. solace_agent_mesh/shared/__init__.py +14 -0
  187. solace_agent_mesh/shared/api/__init__.py +42 -0
  188. solace_agent_mesh/shared/auth/__init__.py +26 -0
  189. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  190. solace_agent_mesh/shared/auth/middleware.py +291 -0
  191. solace_agent_mesh/shared/database/__init__.py +20 -0
  192. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  193. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  194. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  195. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  196. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +1 -1
  197. solace_agent_mesh/shared/utils/__init__.py +21 -0
  198. solace_agent_mesh/templates/platform.yaml +49 -0
  199. solace_agent_mesh/templates/webui.yaml +12 -3
  200. {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/METADATA +2 -1
  201. {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/RECORD +214 -258
  202. solace_agent_mesh/agent/adk/adk_llm.txt +0 -226
  203. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  204. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  205. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -189
  206. solace_agent_mesh/agent/agent_llm.txt +0 -369
  207. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  208. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  209. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  210. solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +0 -190
  211. solace_agent_mesh/agent/proxies/base/base_llm.txt +0 -148
  212. solace_agent_mesh/agent/proxies/proxies_llm.txt +0 -283
  213. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  214. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  215. solace_agent_mesh/agent/testing/testing_llm.txt +0 -58
  216. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  217. solace_agent_mesh/agent/tools/tools_llm.txt +0 -276
  218. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -275
  219. solace_agent_mesh/agent/utils/utils_llm.txt +0 -152
  220. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  221. solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +0 -1
  222. solace_agent_mesh/assets/docs/assets/js/240a0364.9ad94d1b.js +0 -1
  223. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  224. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  225. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2ddc75c0.js +0 -1
  226. solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +0 -1
  227. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.90a87880.js +0 -1
  228. solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +0 -1
  229. solace_agent_mesh/assets/docs/assets/js/66d4869e.b77431fc.js +0 -1
  230. solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +0 -1
  231. solace_agent_mesh/assets/docs/assets/js/81a99df0.2484b8d9.js +0 -1
  232. solace_agent_mesh/assets/docs/assets/js/9bb13469.b2333011.js +0 -1
  233. solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +0 -1
  234. solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +0 -1
  235. solace_agent_mesh/assets/docs/assets/js/e04b235d.52cb25ed.js +0 -1
  236. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.b1068f9b.js +0 -1
  237. solace_agent_mesh/assets/docs/assets/js/e6f9706b.4488e34c.js +0 -1
  238. solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +0 -1
  239. solace_agent_mesh/assets/docs/assets/js/f284c35a.250993bf.js +0 -1
  240. solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js +0 -2
  241. solace_agent_mesh/assets/docs/assets/js/runtime~main.9e0813a2.js +0 -1
  242. solace_agent_mesh/assets/docs/lunr-index-1765810064709.json +0 -1
  243. solace_agent_mesh/assets/docs/search-doc-1765810064709.json +0 -1
  244. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  245. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  246. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  247. solace_agent_mesh/client/webui/frontend/static/assets/main-BcUaNZ-Q.css +0 -1
  248. solace_agent_mesh/client/webui/frontend/static/assets/main-vjch4RYc.js +0 -435
  249. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -175
  250. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  251. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -445
  252. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  253. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -330
  254. solace_agent_mesh/common/common_llm.txt +0 -230
  255. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  256. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  257. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  258. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  259. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  260. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  261. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  262. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -81
  263. solace_agent_mesh/common/services/services_llm.txt +0 -368
  264. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  265. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  266. solace_agent_mesh/common/utils/utils_llm.txt +0 -335
  267. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  268. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DiOiAjzL.js +0 -103
  269. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  270. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  271. solace_agent_mesh/gateway/base/base_llm.txt +0 -226
  272. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  273. solace_agent_mesh/gateway/gateway_llm.txt +0 -369
  274. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  275. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -345
  276. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -161
  277. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  278. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  279. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  280. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -221
  281. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -257
  282. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -308
  283. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -450
  284. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -133
  285. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -123
  286. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -312
  287. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -303
  288. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  289. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -319
  290. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  291. solace_agent_mesh/llm.txt +0 -228
  292. solace_agent_mesh/llm_detail.txt +0 -2835
  293. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  294. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  295. solace_agent_mesh/templates/templates_llm.txt +0 -147
  296. /solace_agent_mesh/assets/docs/assets/js/{main.7acf7ace.js.LICENSE.txt → main.b241af3e.js.LICENSE.txt} +0 -0
  297. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  298. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  299. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  300. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  301. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  302. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  303. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  304. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  305. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  306. {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/WHEEL +0 -0
  307. {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/entry_points.txt +0 -0
  308. {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/licenses/LICENSE +0 -0
@@ -1 +1 @@
1
- window.__remixManifest={"entry":{"module":"/assets/entry.client-mvZjNKiz.js","imports":["/assets/index-DzNKzXrc.js","/assets/components-Rk0n-9cK.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/root-V2BeTIUc.js","imports":["/assets/index-DzNKzXrc.js","/assets/components-Rk0n-9cK.js"],"css":["/assets/root-B17tZKK7.css"]},"routes/_index":{"id":"routes/_index","parentId":"root","index":true,"hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_index-DiOiAjzL.js","imports":["/assets/index-DzNKzXrc.js"],"css":[]}},"url":"/assets/manifest-ba77705e.js","version":"ba77705e"};
1
+ window.__remixManifest={"entry":{"module":"/assets/entry.client-mvZjNKiz.js","imports":["/assets/index-DzNKzXrc.js","/assets/components-Rk0n-9cK.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/root-V2BeTIUc.js","imports":["/assets/index-DzNKzXrc.js","/assets/components-Rk0n-9cK.js"],"css":["/assets/root-B17tZKK7.css"]},"routes/_index":{"id":"routes/_index","parentId":"root","index":true,"hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_index-ZV-jX48T.js","imports":["/assets/index-DzNKzXrc.js"],"css":[]}},"url":"/assets/manifest-ce5bc5da.js","version":"ce5bc5da"};
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html>
2
- <html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/assets/root-B17tZKK7.css"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&amp;display=swap"/></head><body><p>Loading...</p><link rel="modulepreload" href="/assets/manifest-ba77705e.js"/><link rel="modulepreload" href="/assets/entry.client-mvZjNKiz.js"/><link rel="modulepreload" href="/assets/index-DzNKzXrc.js"/><link rel="modulepreload" href="/assets/components-Rk0n-9cK.js"/><link rel="modulepreload" href="/assets/root-V2BeTIUc.js"/><script>window.__remixContext = {"basename":"/","future":{"v3_fetcherPersist":false,"v3_relativeSplatPath":false,"v3_throwAbortReason":false,"v3_routeConfig":false,"v3_singleFetch":false,"v3_lazyRouteDiscovery":false,"unstable_optimizeDeps":false},"isSpaMode":true,"state":{"loaderData":{"root":null,"routes/_index":null},"actionData":null,"errors":null}};</script><script type="module" async="">import "/assets/manifest-ba77705e.js";
2
+ <html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/assets/root-B17tZKK7.css"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&amp;display=swap"/></head><body><p>Loading...</p><link rel="modulepreload" href="/assets/manifest-ce5bc5da.js"/><link rel="modulepreload" href="/assets/entry.client-mvZjNKiz.js"/><link rel="modulepreload" href="/assets/index-DzNKzXrc.js"/><link rel="modulepreload" href="/assets/components-Rk0n-9cK.js"/><link rel="modulepreload" href="/assets/root-V2BeTIUc.js"/><script>window.__remixContext = {"basename":"/","future":{"v3_fetcherPersist":false,"v3_relativeSplatPath":false,"v3_throwAbortReason":false,"v3_routeConfig":false,"v3_singleFetch":false,"v3_lazyRouteDiscovery":false,"unstable_optimizeDeps":false},"isSpaMode":true,"state":{"loaderData":{"root":null,"routes/_index":null},"actionData":null,"errors":null}};</script><script type="module" async="">import "/assets/manifest-ce5bc5da.js";
3
3
  import * as route0 from "/assets/root-V2BeTIUc.js";
4
4
 
5
5
  window.__remixRouteModules = {"root":route0};
@@ -22,13 +22,14 @@ class CoreA2AService:
22
22
  and SAC messaging implementation.
23
23
  """
24
24
 
25
- def __init__(self, agent_registry: AgentRegistry, namespace: str):
25
+ def __init__(self, agent_registry: AgentRegistry, namespace: str, component_id: str = None):
26
26
  """
27
27
  Initializes the CoreA2AService.
28
28
 
29
29
  Args:
30
30
  agent_registry: An instance of the shared AgentRegistry.
31
31
  namespace: The namespace string.
32
+ component_id: Optional component identifier for distinguishing logs (e.g., "Platform", "WebUI")
32
33
  """
33
34
  if not isinstance(agent_registry, AgentRegistry):
34
35
  raise TypeError("agent_registry must be an instance of AgentRegistry")
@@ -37,7 +38,7 @@ class CoreA2AService:
37
38
 
38
39
  self.agent_registry = agent_registry
39
40
  self.namespace = namespace
40
- self.log_identifier = "[CoreA2AService]"
41
+ self.log_identifier = f"[CoreA2AService-{component_id}]" if component_id else "[CoreA2AService]"
41
42
  log.info("%s Initialized with namespace: %s", self.log_identifier, namespace)
42
43
 
43
44
  def submit_task(
@@ -3,10 +3,14 @@ Defines the abstract base class for Generic Gateway Adapters.
3
3
  """
4
4
 
5
5
  from abc import ABC, abstractmethod
6
- from typing import Any, Dict, Generic, Optional, Type, TypeVar
6
+ from typing import TYPE_CHECKING, Any, Dict, Generic, Optional, Type, TypeVar
7
7
 
8
8
  from pydantic import BaseModel
9
9
 
10
+ if TYPE_CHECKING:
11
+ from a2a.types import AgentCard
12
+
13
+
10
14
  from .types import (
11
15
  AuthClaims,
12
16
  GatewayContext,
@@ -141,3 +145,26 @@ class GatewayAdapter(
141
145
  async def handle_error(self, error: SamError, context: ResponseContext) -> None:
142
146
  """Handle error from the agent or gateway."""
143
147
  pass
148
+
149
+ # --- Agent Registry Change Handlers ---
150
+
151
+ async def handle_agent_registered(self, agent_card: "AgentCard") -> None:
152
+ """
153
+ Called when a new agent is registered in the agent registry.
154
+
155
+ This allows adapters to react to new agents becoming available.
156
+ For example, the MCP adapter can register new tools dynamically.
157
+
158
+ Args:
159
+ agent_card: The AgentCard of the newly registered agent
160
+ """
161
+ pass # Optional - default is no-op
162
+
163
+ async def handle_agent_deregistered(self, agent_name: str) -> None:
164
+ """
165
+ Called when an agent is removed from the registry (e.g., TTL expiry).
166
+
167
+ Args:
168
+ agent_name: Name of the agent that was removed
169
+ """
170
+ pass # Optional - default is no-op
@@ -70,6 +70,10 @@ class SamTask(BaseModel):
70
70
  default_factory=dict,
71
71
  description="Platform-specific data for response routing.",
72
72
  )
73
+ session_behavior: Optional[str] = Field(
74
+ default=None,
75
+ description="Session behavior: 'PERSISTENT' or 'RUN_BASED'. If provided, overrides agent's default.",
76
+ )
73
77
 
74
78
 
75
79
  class SamUpdate(BaseModel):
@@ -174,6 +178,11 @@ class GatewayContext:
174
178
  """Lists all artifacts available in the user's context."""
175
179
  raise NotImplementedError
176
180
 
181
+ def list_agents(self) -> List[Any]:
182
+ """Lists all agents currently registered in the agent registry."""
183
+ raise NotImplementedError
184
+
185
+
177
186
  def add_timer(
178
187
  self, delay_ms: int, callback: "Callable", interval_ms: Optional[int] = None
179
188
  ) -> str:
@@ -0,0 +1,103 @@
1
+ """Abstract interface for gateway authentication.
2
+
3
+ This module defines the auth interface that enterprise implementations
4
+ must follow. The community repo provides only the interface - the actual
5
+ OAuth implementation lives in solace-agent-mesh-enterprise.
6
+ """
7
+
8
+ from abc import ABC, abstractmethod
9
+ from typing import Dict, Any
10
+
11
+
12
+ class AuthHandler(ABC):
13
+ """
14
+ Base interface for authentication handlers.
15
+
16
+ Enterprise implementations (e.g., SAMOAuth2Handler) implement this interface
17
+ to provide OAuth2, API key, or other authentication mechanisms.
18
+
19
+ The handler is responsible for:
20
+ - Initiating authorization flows (OAuth, API key setup, etc.)
21
+ - Handling callbacks from auth providers
22
+ - Providing auth headers for outgoing requests
23
+ - Managing authentication state
24
+ """
25
+
26
+ @abstractmethod
27
+ async def handle_authorize(self, request: Any) -> Any:
28
+ """
29
+ Initiate authorization flow.
30
+
31
+ For OAuth2, this typically redirects to the OAuth2 service.
32
+ For API keys, this might return a setup page.
33
+
34
+ Args:
35
+ request: Framework-specific request object (FastAPI Request, etc.)
36
+
37
+ Returns:
38
+ Framework-specific redirect response or dict with redirect_url.
39
+ For dict responses, should contain:
40
+ - redirect_url: str - URL to redirect to
41
+ - status_code: int - HTTP status code (default 302)
42
+
43
+ Raises:
44
+ Exception: If authorization initiation fails
45
+ """
46
+ pass
47
+
48
+ @abstractmethod
49
+ async def handle_callback(self, request: Any) -> Dict[str, Any]:
50
+ """
51
+ Handle OAuth callback or auth completion.
52
+
53
+ For OAuth2, this exchanges authorization codes for tokens.
54
+ For API keys, this might process key submission.
55
+
56
+ Args:
57
+ request: Framework-specific request object with callback params
58
+ (e.g., code, state for OAuth2)
59
+
60
+ Returns:
61
+ Dictionary with callback result:
62
+ - success: bool - Whether auth succeeded
63
+ - message: str - Human-readable status message
64
+ - (optional) redirect_url: str - URL to redirect to after callback
65
+
66
+ Raises:
67
+ ValueError: If callback parameters are invalid
68
+ Exception: If auth exchange/completion fails
69
+ """
70
+ pass
71
+
72
+ @abstractmethod
73
+ async def get_auth_headers(self) -> Dict[str, str]:
74
+ """
75
+ Get authentication headers for outgoing API requests.
76
+
77
+ Returns headers that should be included in HTTP requests to
78
+ authenticate with external services.
79
+
80
+ Returns:
81
+ Dictionary of HTTP headers (e.g., {"Authorization": "Bearer ..."})
82
+ Returns empty dict {} if not authenticated or no headers needed.
83
+
84
+ Examples:
85
+ OAuth2: {"Authorization": "Bearer eyJhbGc..."}
86
+ API Key: {"X-API-Key": "sk-..."}
87
+ Basic Auth: {"Authorization": "Basic dXNlcjpwYXNz"}
88
+ """
89
+ pass
90
+
91
+ @abstractmethod
92
+ async def is_authenticated(self) -> bool:
93
+ """
94
+ Check if currently authenticated.
95
+
96
+ Returns:
97
+ True if authenticated with valid credentials, False otherwise.
98
+
99
+ Notes:
100
+ This should check if credentials are present AND valid.
101
+ For token-based auth, this might check token expiration.
102
+ """
103
+ pass
@@ -22,6 +22,7 @@ from ...common.services.identity_service import (
22
22
  create_identity_service,
23
23
  )
24
24
  from .task_context import TaskContextManager
25
+ from .auth_interface import AuthHandler
25
26
  from ...common.a2a.types import ContentPart
26
27
  from ...common.utils.rbac_utils import validate_agent_access
27
28
  from a2a.types import (
@@ -169,7 +170,9 @@ class BaseGatewayComponent(SamComponentBase):
169
170
 
170
171
  self.agent_registry: AgentRegistry = AgentRegistry()
171
172
  self.core_a2a_service: CoreA2AService = CoreA2AService(
172
- agent_registry=self.agent_registry, namespace=self.namespace
173
+ agent_registry=self.agent_registry,
174
+ namespace=self.namespace,
175
+ component_id="WebUI"
173
176
  )
174
177
  self.shared_artifact_service: Optional[BaseArtifactService] = (
175
178
  initialize_artifact_service(self)
@@ -189,10 +192,65 @@ class BaseGatewayComponent(SamComponentBase):
189
192
  self.log_identifier,
190
193
  )
191
194
 
195
+ # Authentication handler (optional, enterprise feature)
196
+ self.auth_handler: Optional[AuthHandler] = None
197
+
198
+ # Setup authentication if enabled (subclasses override _setup_auth)
199
+ self._setup_auth()
200
+
192
201
  log.info(
193
202
  "%s Initialized Base Gateway Component.", self.log_identifier
194
203
  )
195
204
 
205
+ def _setup_auth(self) -> None:
206
+ """
207
+ Setup authentication handler if enabled.
208
+
209
+ This method is called during initialization and can be overridden
210
+ by subclasses to customize auth setup. The default implementation
211
+ does nothing - subclasses should override to enable auth.
212
+
213
+ Example override in subclass:
214
+ def _setup_auth(self):
215
+ if self.get_config('enable_auth', False):
216
+ from enterprise.auth import SAMOAuth2Handler
217
+ self.auth_handler = SAMOAuth2Handler(self.config)
218
+ """
219
+ # Base implementation: no auth
220
+ # Subclasses (like GenericGateway) override to enable auth
221
+ pass
222
+
223
+ async def _inject_auth_headers(self, headers: Dict[str, str]) -> Dict[str, str]:
224
+ """
225
+ Inject authentication headers if authenticated.
226
+
227
+ This helper method should be called before making outgoing HTTP requests
228
+ to add authentication headers (e.g., Bearer tokens) to the request.
229
+
230
+ Args:
231
+ headers: Existing headers dictionary
232
+
233
+ Returns:
234
+ Headers dictionary with auth headers added (if authenticated)
235
+
236
+ Example:
237
+ headers = {"Content-Type": "application/json"}
238
+ headers = await self._inject_auth_headers(headers)
239
+ # headers now includes Authorization if authenticated
240
+ """
241
+ if self.auth_handler:
242
+ try:
243
+ auth_headers = await self.auth_handler.get_auth_headers()
244
+ headers.update(auth_headers)
245
+ except Exception as e:
246
+ log.warning(
247
+ "%s Failed to get auth headers: %s",
248
+ self.log_identifier,
249
+ e
250
+ )
251
+
252
+ return headers
253
+
196
254
  async def authenticate_and_enrich_user(
197
255
  self, external_event_data: Any
198
256
  ) -> Optional[Dict[str, Any]]:
@@ -344,6 +402,15 @@ class BaseGatewayComponent(SamComponentBase):
344
402
  "system_purpose": system_purpose,
345
403
  "response_format": response_format,
346
404
  }
405
+
406
+ # Add session behavior if provided by adapter
407
+ session_behavior = external_request_context.get("session_behavior")
408
+ if session_behavior:
409
+ a2a_metadata["sessionBehavior"] = session_behavior
410
+ log.debug(
411
+ "%s Setting sessionBehavior to: %s", log_id_prefix, session_behavior
412
+ )
413
+
347
414
  invoked_artifacts = external_request_context.get("invoked_with_artifacts")
348
415
  if invoked_artifacts:
349
416
  a2a_metadata["invoked_with_artifacts"] = invoked_artifacts
@@ -47,6 +47,15 @@ from ..adapter.types import (
47
47
  )
48
48
  from ..base.component import BaseGatewayComponent
49
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
+
50
59
  log = logging.getLogger(__name__)
51
60
 
52
61
  info = {
@@ -132,48 +141,181 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
132
141
  self.artifact_service = self.shared_artifact_service
133
142
  # `gateway_id`, `namespace`, `config` are available from base classes.
134
143
 
135
- # --- GatewayContext Implementation ---
144
+ # --- Setup Authentication ---
145
+ self._setup_auth()
136
146
 
137
- async def handle_external_input(
138
- self, external_input: Any, endpoint_context: Optional[Dict[str, Any]] = None
139
- ) -> 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:
140
157
  """
141
- Processes an external input event through the full gateway flow.
142
- 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__()
143
166
  """
144
- 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]"
145
263
  user_identity = None
264
+ # 1. Authentication & Enrichment
265
+ # Try enterprise authentication first, fallback to adapter-based auth
146
266
  try:
147
- # 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)
148
278
  auth_claims = await self.adapter.extract_auth_claims(
149
279
  external_input, endpoint_context
150
280
  )
151
281
 
152
- # The final user_identity is a dictionary, not the Pydantic model.
153
- # It's built from claims and potentially enriched by an identity service.
154
- if auth_claims:
155
- if self.identity_service:
156
- # Pass the rich claims object to the identity service
157
- enriched_profile = await self.identity_service.get_user_profile(
158
- auth_claims
159
- )
160
- if enriched_profile:
161
- # Merge claims and profile, with profile taking precedence
162
- user_identity = {
163
- **auth_claims.model_dump(),
164
- **enriched_profile,
165
- }
166
- else:
167
- 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
+ }
168
296
  else:
169
- # No identity service, just use the claims from the adapter
170
297
  user_identity = auth_claims.model_dump()
171
298
  else:
172
- # Fallback to default identity if no claims are extracted
173
- default_identity = self.get_config("default_user_identity")
174
- if default_identity:
175
- 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
176
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)
177
319
  if not user_identity or not user_identity.get("id"):
178
320
  raise PermissionError(
179
321
  "Authentication failed: No identity could be determined."
@@ -201,6 +343,10 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
201
343
  **sam_task.platform_context,
202
344
  }
203
345
 
346
+ # Pass session_behavior if provided by adapter
347
+ if sam_task.session_behavior:
348
+ external_request_context["session_behavior"] = sam_task.session_behavior
349
+
204
350
  task_id = await self.submit_a2a_task(
205
351
  target_agent_name=sam_task.target_agent,
206
352
  a2a_parts=a2a_parts,
@@ -224,6 +370,7 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
224
370
  # Create a dummy context to report the error
225
371
  error_context = ResponseContext(
226
372
  task_id="pre-task-error",
373
+ session_id=None,
227
374
  conversation_id=None,
228
375
  user_id=user_identity.get("id"),
229
376
  platform_context={},
@@ -404,7 +551,9 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
404
551
  )
405
552
  return None
406
553
 
407
- async def list_artifacts(self, context: "ResponseContext") -> List[ArtifactInfo]:
554
+ async def list_artifacts(
555
+ self, context: "ResponseContext"
556
+ ) -> List[ArtifactInfo]:
408
557
  """Lists all artifacts available in the user's context."""
409
558
  log_id_prefix = f"{self.log_identifier}[ListArtifacts]"
410
559
  if not self.artifact_service:
@@ -434,6 +583,22 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
434
583
  )
435
584
  return []
436
585
 
586
+ def list_agents(self) -> List[Any]:
587
+ """Lists all agents currently registered in the agent registry."""
588
+ log_id_prefix = f"{self.log_identifier}[ListAgents]"
589
+ try:
590
+ agent_names = self.agent_registry.get_agent_names()
591
+ agents = []
592
+ for agent_name in agent_names:
593
+ agent_card = self.agent_registry.get_agent(agent_name)
594
+ if agent_card:
595
+ agents.append(agent_card)
596
+ log.info("%s Found %d registered agents.", log_id_prefix, len(agents))
597
+ return agents
598
+ except Exception as e:
599
+ log.exception("%s Failed to list agents: %s", log_id_prefix, e)
600
+ return []
601
+
437
602
  async def submit_feedback(self, feedback: "SamFeedback") -> None:
438
603
  """Handles feedback submission from an adapter."""
439
604
  log_id_prefix = f"{self.log_identifier}[SubmitFeedback]"
@@ -166,6 +166,20 @@ class WebUIBackendApp(BaseGatewayApp):
166
166
  "default": "",
167
167
  "description": "The passphrase for the SSL private key.",
168
168
  },
169
+ {
170
+ "name": "frontend_server_url",
171
+ "required": False,
172
+ "type": "string",
173
+ "default": "",
174
+ "description": (
175
+ "The WebUI Gateway's public URL for frontend API requests. "
176
+ "If empty (default), the frontend uses relative URLs for same-origin requests. "
177
+ "Only set this if the frontend is served from a different origin than the WebUI Gateway. "
178
+ "Examples: "
179
+ " - Same-origin (default): '' (empty, uses relative URLs like /api/v1/...) "
180
+ " - Cross-origin: https://webui-gateway.example.com"
181
+ ),
182
+ },
169
183
  {
170
184
  "name": "session_service",
171
185
  "required": False,
@@ -193,16 +207,19 @@ class WebUIBackendApp(BaseGatewayApp):
193
207
  "required": False,
194
208
  "type": "dict",
195
209
  "default": {},
196
- "description": "Configuration for the Platform Service (enterprise features: agents, connectors, deployments).",
210
+ "description": "Configuration for connecting to the Platform Service (runs separately on port 8001).",
197
211
  "dict_schema": {
198
- "database_url": {
212
+ "url": {
199
213
  "type": "string",
200
214
  "required": False,
201
- "default": None,
215
+ "default": "",
202
216
  "description": (
203
- "Database URL for platform data (agents, connectors, deployments). "
204
- "REQUIRED for platform features to be available. "
205
- "Example: postgresql://user:pass@host:5432/platform_db"
217
+ "Platform Service URL for frontend API routing to enterprise endpoints. "
218
+ "Frontend will call this URL for /api/v1/platform/* requests. "
219
+ "Examples: "
220
+ " - Docker: http://platform-service:8001 "
221
+ " - K8s: http://platform-service:8001 "
222
+ " - Local: http://localhost:8001"
206
223
  ),
207
224
  },
208
225
  },