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
@@ -1,17 +1,11 @@
1
+ from __future__ import annotations
2
+
1
3
  import logging
2
4
  import os
3
5
  from pathlib import Path
4
6
 
5
7
  import httpx
6
8
  import sqlalchemy as sa
7
- from fastapi import FastAPI, HTTPException
8
- from fastapi import Request as FastAPIRequest
9
- from fastapi import status
10
- from typing import TYPE_CHECKING
11
-
12
- import sqlalchemy as sa
13
- from a2a.types import InternalError, JSONRPCError
14
- from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
15
9
  from alembic import command
16
10
  from alembic.config import Config
17
11
  from fastapi import FastAPI, HTTPException
@@ -22,12 +16,14 @@ from fastapi.middleware.cors import CORSMiddleware
22
16
  from fastapi.responses import JSONResponse
23
17
  from starlette.middleware.sessions import SessionMiddleware
24
18
  from starlette.staticfiles import StaticFiles
19
+ from typing import TYPE_CHECKING
20
+
21
+ from a2a.types import InternalError, InvalidRequestError, JSONRPCError
22
+ from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
25
23
 
26
- from .routers.sessions import router as session_router
27
- from .routers.tasks import router as task_router
28
- from .routers.users import router as user_router
29
24
  from ...common import a2a
30
25
  from ...gateway.http_sse import dependencies
26
+ from ...shared.auth.middleware import create_oauth_middleware
31
27
  from .routers import (
32
28
  agent_cards,
33
29
  artifacts,
@@ -36,363 +32,30 @@ from .routers import (
36
32
  feedback,
37
33
  people,
38
34
  sse,
35
+ speech,
36
+ version,
39
37
  visualization,
40
38
  projects,
39
+ prompts,
41
40
  )
42
41
  from .routers.sessions import router as session_router
43
42
  from .routers.tasks import router as task_router
44
43
  from .routers.users import router as user_router
45
44
 
46
- from alembic import command
47
- from alembic.config import Config
48
-
49
- from a2a.types import InternalError, InvalidRequestError, JSONRPCError
50
- from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
51
- from ...common import a2a
52
- from ...gateway.http_sse import dependencies
53
-
54
45
 
55
46
  if TYPE_CHECKING:
56
- from gateway.http_sse.component import WebUIBackendComponent
47
+ from .component import WebUIBackendComponent
57
48
 
58
49
  log = logging.getLogger(__name__)
59
50
 
51
+
60
52
  app = FastAPI(
61
53
  title="A2A Web UI Backend",
62
54
  version="1.0.0", # Updated to reflect simplified architecture
63
55
  description="Backend API and SSE server for the A2A Web UI, hosted by Solace AI Connector.",
64
56
  )
65
57
 
66
- # Global flag to track if dependencies have been initialized
67
- _dependencies_initialized = False
68
-
69
-
70
- def _extract_access_token(request: FastAPIRequest) -> str:
71
- auth_header = request.headers.get("Authorization")
72
- if auth_header and auth_header.startswith("Bearer "):
73
- return auth_header[7:]
74
-
75
- try:
76
- if "access_token" in request.session:
77
- log.debug("AuthMiddleware: Found token in session.")
78
- return request.session["access_token"]
79
- except AssertionError:
80
- log.debug("AuthMiddleware: Could not access request.session.")
81
-
82
- if "token" in request.query_params:
83
- return request.query_params["token"]
84
-
85
- return None
86
-
87
-
88
- async def _validate_token(
89
- auth_service_url: str, auth_provider: str, access_token: str
90
- ) -> bool:
91
- async with httpx.AsyncClient() as client:
92
- validation_response = await client.post(
93
- f"{auth_service_url}/is_token_valid",
94
- json={"provider": auth_provider},
95
- headers={"Authorization": f"Bearer {access_token}"},
96
- )
97
- return validation_response.status_code == 200
98
-
99
-
100
- async def _get_user_info(
101
- auth_service_url: str, auth_provider: str, access_token: str
102
- ) -> dict:
103
- async with httpx.AsyncClient() as client:
104
- userinfo_response = await client.get(
105
- f"{auth_service_url}/user_info?provider={auth_provider}",
106
- headers={"Authorization": f"Bearer {access_token}"},
107
- )
108
-
109
- if userinfo_response.status_code != 200:
110
- return None
111
-
112
- return userinfo_response.json()
113
-
114
-
115
- def _extract_user_identifier(user_info: dict) -> str:
116
- user_identifier = (
117
- user_info.get("sub")
118
- or user_info.get("client_id")
119
- or user_info.get("username")
120
- or user_info.get("oid")
121
- or user_info.get("preferred_username")
122
- or user_info.get("upn")
123
- or user_info.get("unique_name")
124
- or user_info.get("email")
125
- or user_info.get("name")
126
- or user_info.get("azp")
127
- or user_info.get("user_id") # internal /user_info endpoint format maps identifier to user_id
128
- )
129
-
130
- if user_identifier and user_identifier.lower() == "unknown":
131
- log.warning(
132
- "AuthMiddleware: IDP returned 'Unknown' as user identifier. Using fallback."
133
- )
134
- return "sam_dev_user"
135
-
136
- return user_identifier
137
-
138
-
139
- def _extract_user_details(user_info: dict, user_identifier: str) -> tuple:
140
- email_from_auth = (
141
- user_info.get("email")
142
- or user_info.get("preferred_username")
143
- or user_info.get("upn")
144
- or user_identifier
145
- )
146
-
147
- display_name = (
148
- user_info.get("name")
149
- or user_info.get("given_name", "") + " " + user_info.get("family_name", "")
150
- or user_info.get("preferred_username")
151
- or user_identifier
152
- ).strip()
153
-
154
- return email_from_auth, display_name
155
-
156
-
157
- async def _create_user_state_without_identity_service(
158
- user_identifier: str, email_from_auth: str, display_name: str
159
- ) -> dict:
160
- final_user_id = user_identifier or email_from_auth or "sam_dev_user"
161
- if not final_user_id or final_user_id.lower() in ["unknown", "null", "none", ""]:
162
- final_user_id = "sam_dev_user"
163
- log.warning(
164
- "AuthMiddleware: Had to use fallback user ID due to invalid identifier: %s",
165
- user_identifier,
166
- )
167
-
168
- log.error(
169
- "AuthMiddleware: Internal IdentityService not configured on component. Using user ID: %s",
170
- final_user_id,
171
- )
172
- return {
173
- "id": final_user_id,
174
- "email": email_from_auth or final_user_id,
175
- "name": display_name or final_user_id,
176
- "authenticated": True,
177
- "auth_method": "oidc",
178
- }
179
-
180
-
181
- async def _create_user_state_with_identity_service(
182
- identity_service,
183
- user_identifier: str,
184
- email_from_auth: str,
185
- display_name: str,
186
- user_info: dict,
187
- ) -> dict:
188
- lookup_value = email_from_auth if "@" in email_from_auth else user_identifier
189
- user_profile = await identity_service.get_user_profile(
190
- {identity_service.lookup_key: lookup_value, "user_info": user_info}
191
- )
192
58
 
193
- if not user_profile:
194
- return None
195
-
196
- user_state = user_profile.copy()
197
- if not user_state.get("id"):
198
- user_state["id"] = user_identifier
199
- if not user_state.get("email"):
200
- user_state["email"] = email_from_auth
201
- if not user_state.get("name"):
202
- user_state["name"] = display_name
203
- user_state["authenticated"] = True
204
- user_state["auth_method"] = "oidc"
205
-
206
- return user_state
207
-
208
-
209
- def _create_auth_middleware(component):
210
- class AuthMiddleware:
211
- def __init__(self, app, component):
212
- self.app = app
213
- self.component = component
214
-
215
- async def __call__(self, scope, receive, send):
216
- if scope["type"] != "http":
217
- await self.app(scope, receive, send)
218
- return
219
-
220
- request = FastAPIRequest(scope, receive)
221
-
222
- if not request.url.path.startswith("/api"):
223
- await self.app(scope, receive, send)
224
- return
225
-
226
- skip_paths = [
227
- "/api/v1/config",
228
- "/api/v1/auth/callback",
229
- "/api/v1/auth/tool/callback",
230
- "/api/v1/auth/login",
231
- "/api/v1/auth/refresh",
232
- "/api/v1/csrf-token",
233
- "/health",
234
- ]
235
-
236
- if any(request.url.path.startswith(path) for path in skip_paths):
237
- await self.app(scope, receive, send)
238
- return
239
-
240
- use_auth = dependencies.api_config and dependencies.api_config.get(
241
- "frontend_use_authorization"
242
- )
243
-
244
- if use_auth:
245
- await self._handle_authenticated_request(request, scope, receive, send)
246
- else:
247
- request.state.user = {
248
- "id": "sam_dev_user",
249
- "name": "Sam Dev User",
250
- "email": "sam@dev.local",
251
- "authenticated": True,
252
- "auth_method": "development",
253
- }
254
- log.debug(
255
- "AuthMiddleware: Set development user state with id: sam_dev_user"
256
- )
257
-
258
- await self.app(scope, receive, send)
259
-
260
- async def _handle_authenticated_request(self, request, scope, receive, send):
261
- access_token = _extract_access_token(request)
262
-
263
- if not access_token:
264
- log.warning("AuthMiddleware: No access token found. Returning 401.")
265
- response = JSONResponse(
266
- status_code=status.HTTP_401_UNAUTHORIZED,
267
- content={
268
- "detail": "Not authenticated",
269
- "error_type": "authentication_required",
270
- },
271
- )
272
- await response(scope, receive, send)
273
- return
274
-
275
- try:
276
- auth_service_url = dependencies.api_config.get(
277
- "external_auth_service_url"
278
- )
279
- auth_provider = dependencies.api_config.get("external_auth_provider")
280
-
281
- if not auth_service_url:
282
- log.error("Auth service URL not configured.")
283
- response = JSONResponse(
284
- status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
285
- content={"detail": "Auth service not configured"},
286
- )
287
- await response(scope, receive, send)
288
- return
289
-
290
- if not await _validate_token(
291
- auth_service_url, auth_provider, access_token
292
- ):
293
- log.warning("AuthMiddleware: Token validation failed")
294
- response = JSONResponse(
295
- status_code=status.HTTP_401_UNAUTHORIZED,
296
- content={
297
- "detail": "Invalid token",
298
- "error_type": "invalid_token",
299
- },
300
- )
301
- await response(scope, receive, send)
302
- return
303
-
304
- user_info = await _get_user_info(
305
- auth_service_url, auth_provider, access_token
306
- )
307
- if not user_info:
308
- log.warning(
309
- "AuthMiddleware: Failed to get user info from external auth service"
310
- )
311
- response = JSONResponse(
312
- status_code=status.HTTP_401_UNAUTHORIZED,
313
- content={
314
- "detail": "Could not retrieve user info from auth provider",
315
- "error_type": "user_info_failed",
316
- },
317
- )
318
- await response(scope, receive, send)
319
- return
320
-
321
- user_identifier = _extract_user_identifier(user_info)
322
- if not user_identifier or user_identifier.lower() in [
323
- "null",
324
- "none",
325
- "",
326
- ]:
327
- log.error(
328
- "AuthMiddleware: No valid user identifier from OAuth provider"
329
- )
330
- response = JSONResponse(
331
- status_code=status.HTTP_401_UNAUTHORIZED,
332
- content={
333
- "detail": "OAuth provider returned no valid user identifier",
334
- "error_type": "invalid_user_identifier_from_provider",
335
- },
336
- )
337
- await response(scope, receive, send)
338
- return
339
-
340
- email_from_auth, display_name = _extract_user_details(
341
- user_info, user_identifier
342
- )
343
-
344
- identity_service = self.component.identity_service
345
- if not identity_service:
346
- request.state.user = (
347
- await _create_user_state_without_identity_service(
348
- user_identifier, email_from_auth, display_name
349
- )
350
- )
351
- else:
352
- user_state = await _create_user_state_with_identity_service(
353
- identity_service,
354
- user_identifier,
355
- email_from_auth,
356
- display_name,
357
- user_info,
358
- )
359
- if not user_state:
360
- log.error(
361
- "AuthMiddleware: User authenticated but not found in internal IdentityService"
362
- )
363
- response = JSONResponse(
364
- status_code=status.HTTP_403_FORBIDDEN,
365
- content={
366
- "detail": "User not authorized for this application",
367
- "error_type": "not_authorized",
368
- },
369
- )
370
- await response(scope, receive, send)
371
- return
372
- request.state.user = user_state
373
-
374
- except httpx.RequestError as exc:
375
- log.error("Error calling auth service: %s", exc)
376
- response = JSONResponse(
377
- status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
378
- content={"detail": "Auth service is unavailable"},
379
- )
380
- await response(scope, receive, send)
381
- return
382
- except Exception as exc:
383
- log.error(
384
- "An unexpected error occurred during token validation: %s", exc
385
- )
386
- response = JSONResponse(
387
- status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
388
- content={
389
- "detail": "An internal error occurred during authentication"
390
- },
391
- )
392
- await response(scope, receive, send)
393
- return
394
-
395
- return AuthMiddleware
396
59
 
397
60
 
398
61
  def _setup_alembic_config(database_url: str) -> Config:
@@ -413,90 +76,46 @@ def _run_community_migrations(database_url: str) -> None:
413
76
  try:
414
77
  from sqlalchemy import create_engine
415
78
 
416
- log.info("Starting community migrations...")
79
+ log.info("[WebUI Gateway] Starting community migrations...")
417
80
  engine = create_engine(database_url)
418
81
  inspector = sa.inspect(engine)
419
82
  existing_tables = inspector.get_table_names()
420
83
 
84
+ alembic_cfg = _setup_alembic_config(database_url)
421
85
  if not existing_tables or "sessions" not in existing_tables:
422
- log.info("Running initial community database setup")
423
- alembic_cfg = _setup_alembic_config(database_url)
424
- command.upgrade(alembic_cfg, "head")
425
- log.info("Community database migrations completed")
86
+ log.info("[WebUI Gateway] Running initial database setup")
426
87
  else:
427
- log.info("Checking for community schema updates")
428
- alembic_cfg = _setup_alembic_config(database_url)
429
- command.upgrade(alembic_cfg, "head")
430
- log.info("Community database schema is current")
88
+ log.info("[WebUI Gateway] Checking for schema updates")
89
+
90
+ command.upgrade(alembic_cfg, "head")
91
+ log.info("[WebUI Gateway] Community migrations completed")
431
92
  except Exception as e:
432
- log.warning(
433
- "Community migration check failed: %s - attempting to run migrations",
434
- e,
435
- )
93
+ log.warning("[WebUI Gateway] Migration check failed: %s - attempting to run migrations", e)
436
94
  try:
437
95
  alembic_cfg = _setup_alembic_config(database_url)
438
96
  command.upgrade(alembic_cfg, "head")
439
- log.info("Community database migrations completed")
97
+ log.info("[WebUI Gateway] Community migrations completed")
440
98
  except Exception as migration_error:
441
- log.error("Community migration failed: %s", migration_error)
442
- log.error("Check database connectivity and permissions")
99
+ log.error("[WebUI Gateway] Migration failed: %s", migration_error)
100
+ log.error("[WebUI Gateway] Check database connectivity and permissions")
443
101
  raise RuntimeError(
444
102
  f"Community database migration failed: {migration_error}"
445
103
  ) from migration_error
446
104
 
447
105
 
448
- def _run_enterprise_migrations(
449
- component: "WebUIBackendComponent", database_url: str
450
- ) -> None:
451
- """
452
- Run migrations for enterprise features like advanced analytics, audit logs, etc.
453
- This is optional and only runs if the enterprise package is available.
454
- """
455
- try:
456
- from solace_agent_mesh_enterprise.webui_backend.migration_runner import (
457
- run_migrations,
458
- )
459
-
460
- webui_app = component.get_app()
461
- app_config = getattr(webui_app, "app_config", {}) if webui_app else {}
462
- log.info("Starting enterprise migrations...")
463
- run_migrations(database_url, app_config)
464
- log.info("Enterprise migrations completed")
465
- except (ImportError, ModuleNotFoundError):
466
- log.debug("Enterprise module not found - skipping enterprise migrations")
467
- except Exception as e:
468
- log.error("Enterprise migration failed: %s", e)
469
- log.error("Advanced features may be unavailable")
470
- raise RuntimeError(f"Enterprise database migration failed: {e}") from e
471
106
 
472
107
 
473
- def _setup_database(
474
- component: "WebUIBackendComponent",
475
- database_url: str,
476
- platform_database_url: str = None
477
- ) -> None:
108
+ def _setup_database(database_url: str) -> None:
478
109
  """
479
- Initialize database connections and run all required migrations.
480
- Sets up both runtime and platform database schemas.
110
+ Initialize database and run migrations for WebUI Gateway.
481
111
 
482
112
  Args:
483
- component: WebUIBackendComponent instance
484
- database_url: Runtime database URL (sessions, tasks, chat) - REQUIRED
485
- platform_database_url: Platform database URL (agents, connectors, deployments).
486
- If None, platform features will be unavailable.
113
+ database_url: Chat database URL (sessions, tasks, feedback)
487
114
  """
488
115
  dependencies.init_database(database_url)
489
- log.info("Persistence enabled - sessions will be stored in database")
490
- log.info("Running database migrations...")
491
-
116
+ log.info("[WebUI Gateway] Running database migrations...")
492
117
  _run_community_migrations(database_url)
493
118
 
494
- if platform_database_url:
495
- log.info("Platform database configured - running migrations")
496
- _run_enterprise_migrations(component, platform_database_url)
497
- else:
498
- log.info("No platform database configured - skipping platform migrations")
499
-
500
119
 
501
120
  def _get_app_config(component: "WebUIBackendComponent") -> dict:
502
121
  webui_app = component.get_app()
@@ -530,52 +149,24 @@ def _create_api_config(app_config: dict, database_url: str) -> dict:
530
149
  }
531
150
 
532
151
 
533
- def setup_dependencies(
534
- component: "WebUIBackendComponent",
535
- database_url: str = None,
536
- platform_database_url: str = None
537
- ):
152
+ def setup_dependencies(component: "WebUIBackendComponent"):
538
153
  """
539
- Initialize dependencies for both runtime and platform databases.
154
+ Initialize FastAPI dependencies (middleware, routers, static files).
155
+ Database migrations are handled in component.__init__().
540
156
 
541
157
  Args:
542
158
  component: WebUIBackendComponent instance
543
- database_url: Runtime database URL (sessions, tasks, chat).
544
- If None, runs in compatibility mode with in-memory sessions.
545
- platform_database_url: Platform database URL (agents, connectors, deployments).
546
- If None, platform features will be unavailable (returns 501).
547
-
548
- This function is idempotent and safe to call multiple times.
549
159
  """
550
- global _dependencies_initialized
551
-
552
- if _dependencies_initialized:
553
- log.debug("[setup_dependencies] Dependencies already initialized, skipping")
554
- return
555
-
556
160
  dependencies.set_component_instance(component)
557
161
 
558
- if database_url:
559
- _setup_database(component, database_url, platform_database_url)
560
- else:
561
- log.warning(
562
- "No database URL provided - using in-memory session storage (data not persisted across restarts)"
563
- )
564
- log.info("This maintains backward compatibility for existing SAM installations")
565
-
566
162
  app_config = _get_app_config(component)
567
- api_config_dict = _create_api_config(app_config, database_url)
568
-
163
+ api_config_dict = _create_api_config(app_config, component.database_url)
569
164
  dependencies.set_api_config(api_config_dict)
570
- log.debug("API configuration extracted and stored.")
571
165
 
572
166
  _setup_middleware(component)
573
167
  _setup_routers()
574
168
  _setup_static_files()
575
169
 
576
- _dependencies_initialized = True
577
- log.debug("[setup_dependencies] Dependencies initialization complete")
578
-
579
170
 
580
171
  def _setup_middleware(component: "WebUIBackendComponent") -> None:
581
172
  allowed_origins = component.get_cors_origins()
@@ -592,9 +183,15 @@ def _setup_middleware(component: "WebUIBackendComponent") -> None:
592
183
  app.add_middleware(SessionMiddleware, secret_key=session_manager.secret_key)
593
184
  log.info("SessionMiddleware added.")
594
185
 
595
- auth_middleware_class = _create_auth_middleware(component)
186
+ auth_middleware_class = create_oauth_middleware(component)
596
187
  app.add_middleware(auth_middleware_class, component=component)
597
- log.info("AuthMiddleware added.")
188
+
189
+ api_config = dependencies.get_api_config()
190
+ use_auth = api_config.get("frontend_use_authorization", False) if api_config else False
191
+ if use_auth:
192
+ log.info("OAuth middleware added (real token validation enabled)")
193
+ else:
194
+ log.info("OAuth middleware added (development mode - community/dev user)")
598
195
 
599
196
 
600
197
  def _setup_routers() -> None:
@@ -603,6 +200,7 @@ def _setup_routers() -> None:
603
200
  app.include_router(session_router, prefix=api_prefix, tags=["Sessions"])
604
201
  app.include_router(user_router, prefix=f"{api_prefix}/users", tags=["Users"])
605
202
  app.include_router(config.router, prefix=api_prefix, tags=["Config"])
203
+ app.include_router(version.router, prefix=api_prefix, tags=["Version"])
606
204
  app.include_router(agent_cards.router, prefix=api_prefix, tags=["Agent Cards"])
607
205
  app.include_router(task_router, prefix=api_prefix, tags=["Tasks"])
608
206
  app.include_router(sse.router, prefix=f"{api_prefix}/sse", tags=["SSE"])
@@ -618,37 +216,15 @@ def _setup_routers() -> None:
618
216
  app.include_router(auth.router, prefix=api_prefix, tags=["Auth"])
619
217
  app.include_router(projects.router, prefix=api_prefix, tags=["Projects"])
620
218
  app.include_router(feedback.router, prefix=api_prefix, tags=["Feedback"])
219
+ app.include_router(prompts.router, prefix=f"{api_prefix}/prompts", tags=["Prompts"])
220
+ app.include_router(speech.router, prefix=f"{api_prefix}/speech", tags=["Speech"])
621
221
  log.info("Legacy routers mounted for endpoints not yet migrated")
622
222
 
623
- # Register shared exception handlers from community repo
624
- from .shared.exception_handlers import register_exception_handlers
223
+ # Register shared exception handlers
224
+ from solace_agent_mesh.shared.exceptions.exception_handlers import register_exception_handlers
625
225
 
626
226
  register_exception_handlers(app)
627
- log.info("Registered shared exception handlers from community repo")
628
-
629
- # Mount enterprise routers if available
630
- try:
631
- from solace_agent_mesh_enterprise.webui_backend.routers import (
632
- get_enterprise_routers,
633
- )
634
-
635
- enterprise_routers = get_enterprise_routers()
636
- for router_config in enterprise_routers:
637
- app.include_router(
638
- router_config["router"],
639
- prefix=router_config["prefix"],
640
- tags=router_config["tags"],
641
- )
642
- log.info("Mounted %d enterprise routers", len(enterprise_routers))
643
-
644
- except ImportError:
645
- log.debug("No enterprise package detected - skipping enterprise routers")
646
- except ModuleNotFoundError:
647
- log.debug(
648
- "Enterprise module not found - skipping enterprise routers and exception handlers"
649
- )
650
- except Exception as e:
651
- log.warning("Failed to load enterprise routers and exception handlers: %s", e)
227
+ log.info("Registered shared exception handlers")
652
228
 
653
229
 
654
230
  def _setup_static_files() -> None:
@@ -661,18 +237,18 @@ def _setup_static_files() -> None:
661
237
  "Static files directory '%s' not found. Frontend may not be served.",
662
238
  static_files_dir,
663
239
  )
664
- else:
665
- try:
666
- app.mount(
667
- "/", StaticFiles(directory=static_files_dir, html=True), name="static"
668
- )
669
- log.info("Mounted static files directory '%s' at '/'", static_files_dir)
670
- except Exception as static_mount_err:
671
- log.error(
672
- "Failed to mount static files directory '%s': %s",
673
- static_files_dir,
674
- static_mount_err,
675
- )
240
+ # try to mount static files directory anyways, might work for enterprise
241
+ try:
242
+ app.mount(
243
+ "/", StaticFiles(directory=static_files_dir, html=True), name="static"
244
+ )
245
+ log.info("Mounted static files directory '%s' at '/'", static_files_dir)
246
+ except Exception as static_mount_err:
247
+ log.error(
248
+ "Failed to mount static files directory '%s': %s",
249
+ static_files_dir,
250
+ static_mount_err,
251
+ )
676
252
 
677
253
 
678
254
  @app.exception_handler(HTTPException)
@@ -780,4 +356,4 @@ async def generic_exception_handler(request: FastAPIRequest, exc: Exception):
780
356
  async def read_root():
781
357
  """Basic health check endpoint."""
782
358
  log.debug("Health check endpoint '/health' called")
783
- return {"status": "A2A Web UI Backend is running"}
359
+ return {"status": "A2A Web UI Backend is running"}
@@ -6,8 +6,8 @@ from typing import List, Optional
6
6
 
7
7
  from sqlalchemy.orm import Session as DBSession
8
8
 
9
- from ..shared import now_epoch_ms
10
- from ..shared.types import SessionId, UserId
9
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
10
+ from solace_agent_mesh.shared.utils.types import SessionId, UserId
11
11
  from .entities import ChatTask
12
12
  from .interfaces import IChatTaskRepository
13
13
  from .models import ChatTaskModel