solace-agent-mesh 1.6.1__py3-none-any.whl → 1.13.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of solace-agent-mesh might be problematic. Click here for more details.

Files changed (481) hide show
  1. solace_agent_mesh/agent/adk/alembic/README +74 -0
  2. solace_agent_mesh/agent/adk/alembic/env.py +77 -0
  3. solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
  4. solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
  5. solace_agent_mesh/agent/adk/alembic.ini +112 -0
  6. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  7. solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
  8. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
  9. solace_agent_mesh/agent/adk/callbacks.py +852 -109
  10. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
  11. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
  12. solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
  13. solace_agent_mesh/agent/adk/models/lite_llm.py +77 -21
  14. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
  15. solace_agent_mesh/agent/adk/runner.py +85 -20
  16. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  17. solace_agent_mesh/agent/adk/services.py +94 -18
  18. solace_agent_mesh/agent/adk/setup.py +281 -65
  19. solace_agent_mesh/agent/adk/stream_parser.py +231 -37
  20. solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
  21. solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
  22. solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
  23. solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
  24. solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
  25. solace_agent_mesh/agent/proxies/base/app.py +3 -2
  26. solace_agent_mesh/agent/proxies/base/component.py +188 -22
  27. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
  28. solace_agent_mesh/agent/sac/app.py +91 -3
  29. solace_agent_mesh/agent/sac/component.py +591 -157
  30. solace_agent_mesh/agent/sac/patch_adk.py +8 -16
  31. solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
  32. solace_agent_mesh/agent/tools/__init__.py +3 -0
  33. solace_agent_mesh/agent/tools/audio_tools.py +3 -3
  34. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +710 -171
  35. solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
  36. solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
  37. solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
  38. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  39. solace_agent_mesh/agent/tools/tool_config_types.py +57 -2
  40. solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
  41. solace_agent_mesh/agent/tools/web_tools.py +125 -17
  42. solace_agent_mesh/agent/utils/artifact_helpers.py +248 -6
  43. solace_agent_mesh/agent/utils/context_helpers.py +17 -0
  44. solace_agent_mesh/assets/docs/404.html +6 -6
  45. solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
  46. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  51. solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
  52. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
  62. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
  104. solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
  105. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
  106. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
  107. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
  108. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
  109. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +82 -68
  110. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  111. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
  112. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
  113. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
  114. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
  115. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
  116. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
  117. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  118. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
  119. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
  120. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  121. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
  122. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  123. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -49
  124. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
  125. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
  126. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
  127. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  128. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +90 -0
  129. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
  130. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  131. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
  132. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +162 -171
  133. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
  134. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
  135. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
  136. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
  137. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
  138. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
  139. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
  140. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
  141. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
  142. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
  143. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
  144. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
  145. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
  146. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
  147. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +23 -19
  151. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
  152. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +112 -87
  154. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +87 -64
  156. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
  158. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
  159. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
  160. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
  161. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +311 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
  164. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
  165. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
  166. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
  167. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
  168. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
  169. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
  170. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
  171. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
  172. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  173. solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
  174. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  175. solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
  176. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  177. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  178. solace_agent_mesh/cli/__init__.py +1 -1
  179. solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
  180. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
  181. solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
  182. solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
  183. solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
  184. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  185. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  186. solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
  187. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
  188. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  189. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
  190. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
  191. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  192. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
  193. solace_agent_mesh/cli/commands/run_cmd.py +64 -49
  194. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  195. solace_agent_mesh/cli/main.py +15 -0
  196. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-BTf6dqwp.js → authCallback-KnKMP_vb.js} +1 -1
  197. solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
  198. solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
  199. solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
  200. solace_agent_mesh/client/webui/frontend/static/assets/vendor-CGk8Suyh.js +565 -0
  201. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  202. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  203. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  204. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  205. solace_agent_mesh/common/a2a/events.py +2 -1
  206. solace_agent_mesh/common/a2a/protocol.py +5 -0
  207. solace_agent_mesh/common/a2a/types.py +2 -1
  208. solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
  209. solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
  210. solace_agent_mesh/common/agent_registry.py +38 -11
  211. solace_agent_mesh/common/data_parts.py +144 -4
  212. solace_agent_mesh/common/error_handlers.py +83 -0
  213. solace_agent_mesh/common/exceptions.py +24 -0
  214. solace_agent_mesh/common/oauth/__init__.py +17 -0
  215. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  216. solace_agent_mesh/common/oauth/utils.py +50 -0
  217. solace_agent_mesh/common/rag_dto.py +156 -0
  218. solace_agent_mesh/common/sac/sam_component_base.py +97 -19
  219. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  220. solace_agent_mesh/common/services/employee_service.py +1 -1
  221. solace_agent_mesh/common/utils/embeds/constants.py +1 -0
  222. solace_agent_mesh/common/utils/embeds/converter.py +1 -8
  223. solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
  224. solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
  225. solace_agent_mesh/common/utils/embeds/types.py +9 -0
  226. solace_agent_mesh/common/utils/log_formatters.py +20 -0
  227. solace_agent_mesh/common/utils/mime_helpers.py +12 -5
  228. solace_agent_mesh/common/utils/pydantic_utils.py +90 -3
  229. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  230. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  231. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  232. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  233. solace_agent_mesh/config_portal/backend/common.py +12 -0
  234. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
  235. solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
  236. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
  237. solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
  238. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
  239. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
  240. solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
  241. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  242. solace_agent_mesh/core_a2a/service.py +3 -2
  243. solace_agent_mesh/gateway/adapter/__init__.py +1 -0
  244. solace_agent_mesh/gateway/adapter/base.py +170 -0
  245. solace_agent_mesh/gateway/adapter/types.py +230 -0
  246. solace_agent_mesh/gateway/base/app.py +39 -2
  247. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  248. solace_agent_mesh/gateway/base/component.py +1027 -151
  249. solace_agent_mesh/gateway/generic/__init__.py +1 -0
  250. solace_agent_mesh/gateway/generic/app.py +50 -0
  251. solace_agent_mesh/gateway/generic/component.py +894 -0
  252. solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
  253. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
  254. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
  255. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
  256. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
  257. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  258. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  259. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  260. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  261. solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
  262. solace_agent_mesh/gateway/http_sse/app.py +40 -11
  263. solace_agent_mesh/gateway/http_sse/component.py +285 -160
  264. solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
  265. solace_agent_mesh/gateway/http_sse/main.py +68 -450
  266. solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
  267. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  268. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
  269. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
  270. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +26 -3
  271. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
  272. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
  273. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
  274. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -0
  275. solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
  276. solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
  277. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  278. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +8 -2
  279. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
  280. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
  281. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
  282. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +177 -11
  283. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
  284. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
  285. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +256 -58
  286. solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
  287. solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
  288. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  289. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  290. solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
  291. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -1
  292. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  293. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
  294. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
  295. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  296. solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
  297. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  298. solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
  299. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
  300. solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
  301. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  302. solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
  303. solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
  304. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  305. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  306. solace_agent_mesh/gateway/http_sse/routers/visualization.py +92 -9
  307. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  308. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  309. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  310. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  311. solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
  312. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  313. solace_agent_mesh/gateway/http_sse/services/session_service.py +361 -12
  314. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
  315. solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
  316. solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
  317. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  318. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
  319. solace_agent_mesh/services/__init__.py +0 -0
  320. solace_agent_mesh/services/platform/__init__.py +29 -0
  321. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  322. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  323. solace_agent_mesh/services/platform/alembic.ini +109 -0
  324. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  325. solace_agent_mesh/services/platform/api/dependencies.py +154 -0
  326. solace_agent_mesh/services/platform/api/main.py +314 -0
  327. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  328. solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
  329. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  330. solace_agent_mesh/services/platform/app.py +215 -0
  331. solace_agent_mesh/services/platform/component.py +777 -0
  332. solace_agent_mesh/shared/__init__.py +14 -0
  333. solace_agent_mesh/shared/api/__init__.py +42 -0
  334. solace_agent_mesh/shared/auth/__init__.py +26 -0
  335. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  336. solace_agent_mesh/shared/auth/middleware.py +347 -0
  337. solace_agent_mesh/shared/database/__init__.py +20 -0
  338. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  339. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  340. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  341. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  342. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +19 -5
  343. solace_agent_mesh/shared/utils/__init__.py +21 -0
  344. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  345. solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
  346. solace_agent_mesh/templates/platform.yaml +49 -0
  347. solace_agent_mesh/templates/plugin_readme_template.md +3 -25
  348. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  349. solace_agent_mesh/templates/proxy_template.yaml +62 -0
  350. solace_agent_mesh/templates/webui.yaml +148 -6
  351. solace_agent_mesh/tools/web_search/__init__.py +18 -0
  352. solace_agent_mesh/tools/web_search/base.py +84 -0
  353. solace_agent_mesh/tools/web_search/google_search.py +247 -0
  354. solace_agent_mesh/tools/web_search/models.py +99 -0
  355. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
  356. solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
  357. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
  358. solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
  359. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  360. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  361. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -142
  362. solace_agent_mesh/agent/agent_llm.txt +0 -378
  363. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  364. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  365. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  366. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  367. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  368. solace_agent_mesh/agent/testing/testing_llm.txt +0 -57
  369. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  370. solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
  371. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
  372. solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
  373. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  374. solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
  375. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
  376. solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +0 -1
  377. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  378. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  379. solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
  380. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
  381. solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
  382. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
  383. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
  384. solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
  385. solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
  386. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
  387. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
  388. solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
  389. solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
  390. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
  391. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
  392. solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
  393. solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
  394. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
  395. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
  396. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +0 -1
  397. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
  398. solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
  399. solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
  400. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
  401. solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
  402. solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
  403. solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
  404. solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
  405. solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
  406. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
  407. solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
  408. solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
  409. solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
  410. solace_agent_mesh/assets/docs/search-doc-1761248203150.json +0 -1
  411. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  412. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  413. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  414. solace_agent_mesh/client/webui/frontend/static/assets/client-CaY59VuC.js +0 -25
  415. solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
  416. solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
  417. solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
  418. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
  419. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  420. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
  421. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  422. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
  423. solace_agent_mesh/common/common_llm.txt +0 -251
  424. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  425. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  426. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  427. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  428. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  429. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  430. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  431. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -80
  432. solace_agent_mesh/common/services/services_llm.txt +0 -363
  433. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  434. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  435. solace_agent_mesh/common/utils/utils_llm.txt +0 -336
  436. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  437. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
  438. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
  439. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
  440. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
  441. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  442. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  443. solace_agent_mesh/gateway/base/base_llm.txt +0 -224
  444. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  445. solace_agent_mesh/gateway/gateway_llm.txt +0 -373
  446. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  447. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
  448. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
  449. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  450. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  451. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  452. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -263
  453. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
  454. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
  455. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
  456. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
  457. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
  458. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
  459. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
  460. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  461. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
  462. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  463. solace_agent_mesh/llm.txt +0 -228
  464. solace_agent_mesh/llm_detail.txt +0 -2835
  465. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  466. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  467. solace_agent_mesh/templates/logging_config_template.ini +0 -45
  468. solace_agent_mesh/templates/templates_llm.txt +0 -147
  469. solace_agent_mesh-1.6.1.dist-info/RECORD +0 -525
  470. /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
  471. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  472. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  473. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  474. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  475. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  476. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  477. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  478. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  479. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  480. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
  481. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,12 +1,11 @@
1
+ from __future__ import annotations
2
+
1
3
  import logging
2
4
  import os
3
5
  from pathlib import Path
4
- from typing import TYPE_CHECKING
5
6
 
6
7
  import httpx
7
8
  import sqlalchemy as sa
8
- from a2a.types import InternalError, JSONRPCError
9
- from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
10
9
  from alembic import command
11
10
  from alembic.config import Config
12
11
  from fastapi import FastAPI, HTTPException
@@ -17,365 +16,47 @@ from fastapi.middleware.cors import CORSMiddleware
17
16
  from fastapi.responses import JSONResponse
18
17
  from starlette.middleware.sessions import SessionMiddleware
19
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
20
23
 
21
24
  from ...common import a2a
22
25
  from ...gateway.http_sse import dependencies
23
- from ...gateway.http_sse.routers import (
26
+ from ...shared.auth.middleware import create_oauth_middleware
27
+ from .routers import (
24
28
  agent_cards,
25
29
  artifacts,
26
30
  auth,
27
31
  config,
32
+ feedback,
28
33
  people,
29
34
  sse,
30
- tasks,
35
+ speech,
36
+ version,
31
37
  visualization,
32
- feedback,
38
+ projects,
39
+ prompts,
33
40
  )
34
41
  from .routers.sessions import router as session_router
35
42
  from .routers.tasks import router as task_router
36
43
  from .routers.users import router as user_router
37
44
 
45
+
38
46
  if TYPE_CHECKING:
39
- from gateway.http_sse.component import WebUIBackendComponent
47
+ from .component import WebUIBackendComponent
40
48
 
41
49
  log = logging.getLogger(__name__)
42
50
 
51
+
43
52
  app = FastAPI(
44
53
  title="A2A Web UI Backend",
45
54
  version="1.0.0", # Updated to reflect simplified architecture
46
55
  description="Backend API and SSE server for the A2A Web UI, hosted by Solace AI Connector.",
47
56
  )
48
57
 
49
- # Global flag to track if dependencies have been initialized
50
- _dependencies_initialized = False
51
-
52
-
53
- def _extract_access_token(request: FastAPIRequest) -> str:
54
- auth_header = request.headers.get("Authorization")
55
- if auth_header and auth_header.startswith("Bearer "):
56
- return auth_header[7:]
57
-
58
- try:
59
- if "access_token" in request.session:
60
- log.debug("AuthMiddleware: Found token in session.")
61
- return request.session["access_token"]
62
- except AssertionError:
63
- log.debug("AuthMiddleware: Could not access request.session.")
64
-
65
- if "token" in request.query_params:
66
- return request.query_params["token"]
67
-
68
- return None
69
-
70
-
71
- async def _validate_token(
72
- auth_service_url: str, auth_provider: str, access_token: str
73
- ) -> bool:
74
- async with httpx.AsyncClient() as client:
75
- validation_response = await client.post(
76
- f"{auth_service_url}/is_token_valid",
77
- json={"provider": auth_provider},
78
- headers={"Authorization": f"Bearer {access_token}"},
79
- )
80
- return validation_response.status_code == 200
81
-
82
-
83
- async def _get_user_info(
84
- auth_service_url: str, auth_provider: str, access_token: str
85
- ) -> dict:
86
- async with httpx.AsyncClient() as client:
87
- userinfo_response = await client.get(
88
- f"{auth_service_url}/user_info?provider={auth_provider}",
89
- headers={"Authorization": f"Bearer {access_token}"},
90
- )
91
-
92
- if userinfo_response.status_code != 200:
93
- return None
94
-
95
- return userinfo_response.json()
96
-
97
-
98
- def _extract_user_identifier(user_info: dict) -> str:
99
- user_identifier = (
100
- user_info.get("sub")
101
- or user_info.get("client_id")
102
- or user_info.get("username")
103
- or user_info.get("oid")
104
- or user_info.get("preferred_username")
105
- or user_info.get("upn")
106
- or user_info.get("unique_name")
107
- or user_info.get("email")
108
- or user_info.get("name")
109
- or user_info.get("azp")
110
- or user_info.get("user_id") # internal /user_info endpoint format maps identifier to user_id
111
- )
112
-
113
- if user_identifier and user_identifier.lower() == "unknown":
114
- log.warning(
115
- "AuthMiddleware: IDP returned 'Unknown' as user identifier. Using fallback."
116
- )
117
- return "sam_dev_user"
118
-
119
- return user_identifier
120
-
121
-
122
- def _extract_user_details(user_info: dict, user_identifier: str) -> tuple:
123
- email_from_auth = (
124
- user_info.get("email")
125
- or user_info.get("preferred_username")
126
- or user_info.get("upn")
127
- or user_identifier
128
- )
129
-
130
- display_name = (
131
- user_info.get("name")
132
- or user_info.get("given_name", "") + " " + user_info.get("family_name", "")
133
- or user_info.get("preferred_username")
134
- or user_identifier
135
- ).strip()
136
-
137
- return email_from_auth, display_name
138
-
139
-
140
- async def _create_user_state_without_identity_service(
141
- user_identifier: str, email_from_auth: str, display_name: str
142
- ) -> dict:
143
- final_user_id = user_identifier or email_from_auth or "sam_dev_user"
144
- if not final_user_id or final_user_id.lower() in ["unknown", "null", "none", ""]:
145
- final_user_id = "sam_dev_user"
146
- log.warning(
147
- "AuthMiddleware: Had to use fallback user ID due to invalid identifier: %s",
148
- user_identifier,
149
- )
150
-
151
- log.error(
152
- "AuthMiddleware: Internal IdentityService not configured on component. Using user ID: %s",
153
- final_user_id,
154
- )
155
- return {
156
- "id": final_user_id,
157
- "email": email_from_auth or final_user_id,
158
- "name": display_name or final_user_id,
159
- "authenticated": True,
160
- "auth_method": "oidc",
161
- }
162
58
 
163
59
 
164
- async def _create_user_state_with_identity_service(
165
- identity_service,
166
- user_identifier: str,
167
- email_from_auth: str,
168
- display_name: str,
169
- user_info: dict,
170
- ) -> dict:
171
- lookup_value = email_from_auth if "@" in email_from_auth else user_identifier
172
- user_profile = await identity_service.get_user_profile(
173
- {identity_service.lookup_key: lookup_value, "user_info": user_info}
174
- )
175
-
176
- if not user_profile:
177
- return None
178
-
179
- user_state = user_profile.copy()
180
- if not user_state.get("id"):
181
- user_state["id"] = user_identifier
182
- if not user_state.get("email"):
183
- user_state["email"] = email_from_auth
184
- if not user_state.get("name"):
185
- user_state["name"] = display_name
186
- user_state["authenticated"] = True
187
- user_state["auth_method"] = "oidc"
188
-
189
- return user_state
190
-
191
-
192
- def _create_auth_middleware(component):
193
- class AuthMiddleware:
194
- def __init__(self, app, component):
195
- self.app = app
196
- self.component = component
197
-
198
- async def __call__(self, scope, receive, send):
199
- if scope["type"] != "http":
200
- await self.app(scope, receive, send)
201
- return
202
-
203
- request = FastAPIRequest(scope, receive)
204
-
205
- if not request.url.path.startswith("/api"):
206
- await self.app(scope, receive, send)
207
- return
208
-
209
- skip_paths = [
210
- "/api/v1/config",
211
- "/api/v1/auth/callback",
212
- "/api/v1/auth/login",
213
- "/api/v1/auth/refresh",
214
- "/api/v1/csrf-token",
215
- "/health",
216
- ]
217
-
218
- if any(request.url.path.startswith(path) for path in skip_paths):
219
- await self.app(scope, receive, send)
220
- return
221
-
222
- use_auth = dependencies.api_config and dependencies.api_config.get(
223
- "frontend_use_authorization"
224
- )
225
-
226
- if use_auth:
227
- await self._handle_authenticated_request(request, scope, receive, send)
228
- else:
229
- request.state.user = {
230
- "id": "sam_dev_user",
231
- "name": "Sam Dev User",
232
- "email": "sam@dev.local",
233
- "authenticated": True,
234
- "auth_method": "development",
235
- }
236
- log.debug(
237
- "AuthMiddleware: Set development user state with id: sam_dev_user"
238
- )
239
-
240
- await self.app(scope, receive, send)
241
-
242
- async def _handle_authenticated_request(self, request, scope, receive, send):
243
- access_token = _extract_access_token(request)
244
-
245
- if not access_token:
246
- log.warning("AuthMiddleware: No access token found. Returning 401.")
247
- response = JSONResponse(
248
- status_code=status.HTTP_401_UNAUTHORIZED,
249
- content={
250
- "detail": "Not authenticated",
251
- "error_type": "authentication_required",
252
- },
253
- )
254
- await response(scope, receive, send)
255
- return
256
-
257
- try:
258
- auth_service_url = dependencies.api_config.get(
259
- "external_auth_service_url"
260
- )
261
- auth_provider = dependencies.api_config.get("external_auth_provider")
262
-
263
- if not auth_service_url:
264
- log.error("Auth service URL not configured.")
265
- response = JSONResponse(
266
- status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
267
- content={"detail": "Auth service not configured"},
268
- )
269
- await response(scope, receive, send)
270
- return
271
-
272
- if not await _validate_token(
273
- auth_service_url, auth_provider, access_token
274
- ):
275
- log.warning("AuthMiddleware: Token validation failed")
276
- response = JSONResponse(
277
- status_code=status.HTTP_401_UNAUTHORIZED,
278
- content={
279
- "detail": "Invalid token",
280
- "error_type": "invalid_token",
281
- },
282
- )
283
- await response(scope, receive, send)
284
- return
285
-
286
- user_info = await _get_user_info(
287
- auth_service_url, auth_provider, access_token
288
- )
289
- if not user_info:
290
- log.warning(
291
- "AuthMiddleware: Failed to get user info from external auth service"
292
- )
293
- response = JSONResponse(
294
- status_code=status.HTTP_401_UNAUTHORIZED,
295
- content={
296
- "detail": "Could not retrieve user info from auth provider",
297
- "error_type": "user_info_failed",
298
- },
299
- )
300
- await response(scope, receive, send)
301
- return
302
-
303
- user_identifier = _extract_user_identifier(user_info)
304
- if not user_identifier or user_identifier.lower() in [
305
- "null",
306
- "none",
307
- "",
308
- ]:
309
- log.error(
310
- "AuthMiddleware: No valid user identifier from OAuth provider"
311
- )
312
- response = JSONResponse(
313
- status_code=status.HTTP_401_UNAUTHORIZED,
314
- content={
315
- "detail": "OAuth provider returned no valid user identifier",
316
- "error_type": "invalid_user_identifier_from_provider",
317
- },
318
- )
319
- await response(scope, receive, send)
320
- return
321
-
322
- email_from_auth, display_name = _extract_user_details(
323
- user_info, user_identifier
324
- )
325
-
326
- identity_service = self.component.identity_service
327
- if not identity_service:
328
- request.state.user = (
329
- await _create_user_state_without_identity_service(
330
- user_identifier, email_from_auth, display_name
331
- )
332
- )
333
- else:
334
- user_state = await _create_user_state_with_identity_service(
335
- identity_service,
336
- user_identifier,
337
- email_from_auth,
338
- display_name,
339
- user_info,
340
- )
341
- if not user_state:
342
- log.error(
343
- "AuthMiddleware: User authenticated but not found in internal IdentityService"
344
- )
345
- response = JSONResponse(
346
- status_code=status.HTTP_403_FORBIDDEN,
347
- content={
348
- "detail": "User not authorized for this application",
349
- "error_type": "not_authorized",
350
- },
351
- )
352
- await response(scope, receive, send)
353
- return
354
- request.state.user = user_state
355
-
356
- except httpx.RequestError as exc:
357
- log.error("Error calling auth service: %s", exc)
358
- response = JSONResponse(
359
- status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
360
- content={"detail": "Auth service is unavailable"},
361
- )
362
- await response(scope, receive, send)
363
- return
364
- except Exception as exc:
365
- log.error(
366
- "An unexpected error occurred during token validation: %s", exc
367
- )
368
- response = JSONResponse(
369
- status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
370
- content={
371
- "detail": "An internal error occurred during authentication"
372
- },
373
- )
374
- await response(scope, receive, send)
375
- return
376
-
377
- return AuthMiddleware
378
-
379
60
 
380
61
  def _setup_alembic_config(database_url: str) -> Config:
381
62
  alembic_cfg = Config()
@@ -395,74 +76,45 @@ def _run_community_migrations(database_url: str) -> None:
395
76
  try:
396
77
  from sqlalchemy import create_engine
397
78
 
398
- log.info("Starting community migrations...")
79
+ log.info("[WebUI Gateway] Starting community migrations...")
399
80
  engine = create_engine(database_url)
400
81
  inspector = sa.inspect(engine)
401
82
  existing_tables = inspector.get_table_names()
402
83
 
84
+ alembic_cfg = _setup_alembic_config(database_url)
403
85
  if not existing_tables or "sessions" not in existing_tables:
404
- log.info("Running initial community database setup")
405
- alembic_cfg = _setup_alembic_config(database_url)
406
- command.upgrade(alembic_cfg, "head")
407
- log.info("Community database migrations completed")
86
+ log.info("[WebUI Gateway] Running initial database setup")
408
87
  else:
409
- log.info("Checking for community schema updates")
410
- alembic_cfg = _setup_alembic_config(database_url)
411
- command.upgrade(alembic_cfg, "head")
412
- 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")
413
92
  except Exception as e:
414
- log.warning(
415
- "Community migration check failed: %s - attempting to run migrations",
416
- e,
417
- )
93
+ log.warning("[WebUI Gateway] Migration check failed: %s - attempting to run migrations", e)
418
94
  try:
419
95
  alembic_cfg = _setup_alembic_config(database_url)
420
96
  command.upgrade(alembic_cfg, "head")
421
- log.info("Community database migrations completed")
97
+ log.info("[WebUI Gateway] Community migrations completed")
422
98
  except Exception as migration_error:
423
- log.error("Community migration failed: %s", migration_error)
424
- 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")
425
101
  raise RuntimeError(
426
102
  f"Community database migration failed: {migration_error}"
427
103
  ) from migration_error
428
104
 
429
105
 
430
- def _run_enterprise_migrations(
431
- component: "WebUIBackendComponent", database_url: str
432
- ) -> None:
433
- """
434
- Run migrations for enterprise features like advanced analytics, audit logs, etc.
435
- This is optional and only runs if the enterprise package is available.
436
- """
437
- try:
438
- from solace_agent_mesh_enterprise.webui_backend.migration_runner import (
439
- run_migrations,
440
- )
441
-
442
- webui_app = component.get_app()
443
- app_config = getattr(webui_app, "app_config", {}) if webui_app else {}
444
- log.info("Starting enterprise migrations...")
445
- run_migrations(database_url, app_config)
446
- log.info("Enterprise migrations completed")
447
- except (ImportError, ModuleNotFoundError):
448
- log.debug("Enterprise module not found - skipping enterprise migrations")
449
- except Exception as e:
450
- log.error("Enterprise migration failed: %s", e)
451
- log.error("Advanced features may be unavailable")
452
- raise RuntimeError(f"Enterprise database migration failed: {e}") from e
453
106
 
454
107
 
455
- def _setup_database(component: "WebUIBackendComponent", database_url: str) -> None:
108
+ def _setup_database(database_url: str) -> None:
456
109
  """
457
- Initialize database connection and run all required migrations.
458
- This sets up both community and enterprise database schemas.
110
+ Initialize database and run migrations for WebUI Gateway.
111
+
112
+ Args:
113
+ database_url: Chat database URL (sessions, tasks, feedback)
459
114
  """
460
115
  dependencies.init_database(database_url)
461
- log.info("Persistence enabled - sessions will be stored in database")
462
- log.info("Running database migrations...")
463
-
116
+ log.info("[WebUI Gateway] Running database migrations...")
464
117
  _run_community_migrations(database_url)
465
- _run_enterprise_migrations(component, database_url)
466
118
 
467
119
 
468
120
  def _get_app_config(component: "WebUIBackendComponent") -> dict:
@@ -497,44 +149,24 @@ def _create_api_config(app_config: dict, database_url: str) -> dict:
497
149
  }
498
150
 
499
151
 
500
- def setup_dependencies(component: "WebUIBackendComponent", database_url: str = None):
152
+ def setup_dependencies(component: "WebUIBackendComponent"):
501
153
  """
502
- This function initializes the simplified architecture while maintaining full
503
- backward compatibility with existing API contracts.
504
-
505
- If database_url is None, runs in compatibility mode with in-memory sessions.
154
+ Initialize FastAPI dependencies (middleware, routers, static files).
155
+ Database migrations are handled in component.__init__().
506
156
 
507
- This function is idempotent and safe to call multiple times.
157
+ Args:
158
+ component: WebUIBackendComponent instance
508
159
  """
509
- global _dependencies_initialized
510
-
511
- if _dependencies_initialized:
512
- log.debug("[setup_dependencies] Dependencies already initialized, skipping")
513
- return
514
-
515
160
  dependencies.set_component_instance(component)
516
161
 
517
- if database_url:
518
- _setup_database(component, database_url)
519
- else:
520
- log.warning(
521
- "No database URL provided - using in-memory session storage (data not persisted across restarts)"
522
- )
523
- log.info("This maintains backward compatibility for existing SAM installations")
524
-
525
162
  app_config = _get_app_config(component)
526
- api_config_dict = _create_api_config(app_config, database_url)
527
-
163
+ api_config_dict = _create_api_config(app_config, component.database_url)
528
164
  dependencies.set_api_config(api_config_dict)
529
- log.info("API configuration extracted and stored.")
530
165
 
531
166
  _setup_middleware(component)
532
167
  _setup_routers()
533
168
  _setup_static_files()
534
169
 
535
- _dependencies_initialized = True
536
- log.info("[setup_dependencies] Dependencies initialization complete")
537
-
538
170
 
539
171
  def _setup_middleware(component: "WebUIBackendComponent") -> None:
540
172
  allowed_origins = component.get_cors_origins()
@@ -551,9 +183,15 @@ def _setup_middleware(component: "WebUIBackendComponent") -> None:
551
183
  app.add_middleware(SessionMiddleware, secret_key=session_manager.secret_key)
552
184
  log.info("SessionMiddleware added.")
553
185
 
554
- auth_middleware_class = _create_auth_middleware(component)
186
+ auth_middleware_class = create_oauth_middleware(component)
555
187
  app.add_middleware(auth_middleware_class, component=component)
556
- 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)")
557
195
 
558
196
 
559
197
  def _setup_routers() -> None:
@@ -562,8 +200,9 @@ def _setup_routers() -> None:
562
200
  app.include_router(session_router, prefix=api_prefix, tags=["Sessions"])
563
201
  app.include_router(user_router, prefix=f"{api_prefix}/users", tags=["Users"])
564
202
  app.include_router(config.router, prefix=api_prefix, tags=["Config"])
203
+ app.include_router(version.router, prefix=api_prefix, tags=["Version"])
565
204
  app.include_router(agent_cards.router, prefix=api_prefix, tags=["Agent Cards"])
566
- app.include_router(tasks.router, prefix=api_prefix, tags=["Tasks"])
205
+ app.include_router(task_router, prefix=api_prefix, tags=["Tasks"])
567
206
  app.include_router(sse.router, prefix=f"{api_prefix}/sse", tags=["SSE"])
568
207
  app.include_router(
569
208
  artifacts.router, prefix=f"{api_prefix}/artifacts", tags=["Artifacts"]
@@ -575,38 +214,17 @@ def _setup_routers() -> None:
575
214
  )
576
215
  app.include_router(people.router, prefix=api_prefix, tags=["People"])
577
216
  app.include_router(auth.router, prefix=api_prefix, tags=["Auth"])
217
+ app.include_router(projects.router, prefix=api_prefix, tags=["Projects"])
578
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"])
579
221
  log.info("Legacy routers mounted for endpoints not yet migrated")
580
222
 
581
- # Register shared exception handlers from community repo
582
- 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
583
225
 
584
226
  register_exception_handlers(app)
585
- log.info("Registered shared exception handlers from community repo")
586
-
587
- # Mount enterprise routers if available
588
- try:
589
- from solace_agent_mesh_enterprise.webui_backend.routers import (
590
- get_enterprise_routers,
591
- )
592
-
593
- enterprise_routers = get_enterprise_routers()
594
- for router_config in enterprise_routers:
595
- app.include_router(
596
- router_config["router"],
597
- prefix=router_config["prefix"],
598
- tags=router_config["tags"],
599
- )
600
- log.info("Mounted %d enterprise routers", len(enterprise_routers))
601
-
602
- except ImportError:
603
- log.debug("No enterprise package detected - skipping enterprise routers")
604
- except ModuleNotFoundError:
605
- log.debug(
606
- "Enterprise module not found - skipping enterprise routers and exception handlers"
607
- )
608
- except Exception as e:
609
- log.warning("Failed to load enterprise routers and exception handlers: %s", e)
227
+ log.info("Registered shared exception handlers")
610
228
 
611
229
 
612
230
  def _setup_static_files() -> None:
@@ -619,18 +237,18 @@ def _setup_static_files() -> None:
619
237
  "Static files directory '%s' not found. Frontend may not be served.",
620
238
  static_files_dir,
621
239
  )
622
- else:
623
- try:
624
- app.mount(
625
- "/", StaticFiles(directory=static_files_dir, html=True), name="static"
626
- )
627
- log.info("Mounted static files directory '%s' at '/'", static_files_dir)
628
- except Exception as static_mount_err:
629
- log.error(
630
- "Failed to mount static files directory '%s': %s",
631
- static_files_dir,
632
- static_mount_err,
633
- )
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
+ )
634
252
 
635
253
 
636
254
  @app.exception_handler(HTTPException)
@@ -738,4 +356,4 @@ async def generic_exception_handler(request: FastAPIRequest, exc: Exception):
738
356
  async def read_root():
739
357
  """Basic health check endpoint."""
740
358
  log.debug("Health check endpoint '/health' called")
741
- return {"status": "A2A Web UI Backend is running"}
359
+ return {"status": "A2A Web UI Backend is running"}
@@ -3,10 +3,20 @@ Repository layer containing all data access logic organized by entity type.
3
3
  """
4
4
 
5
5
  # Interfaces
6
- from .interfaces import ISessionRepository
6
+ from .interfaces import (
7
+ IChatTaskRepository,
8
+ IFeedbackRepository,
9
+ IProjectRepository,
10
+ ISessionRepository,
11
+ ITaskRepository,
12
+ )
7
13
 
8
14
  # Implementations
15
+ from .chat_task_repository import ChatTaskRepository
16
+ from .feedback_repository import FeedbackRepository
17
+ from .project_repository import ProjectRepository
9
18
  from .session_repository import SessionRepository
19
+ from .task_repository import TaskRepository
10
20
 
11
21
  # Entities (re-exported for convenience)
12
22
  from .entities.session import Session
@@ -17,9 +27,17 @@ from .models.session_model import SessionModel
17
27
 
18
28
  __all__ = [
19
29
  # Interfaces
30
+ "IChatTaskRepository",
31
+ "IFeedbackRepository",
32
+ "IProjectRepository",
20
33
  "ISessionRepository",
34
+ "ITaskRepository",
21
35
  # Implementations
36
+ "ChatTaskRepository",
37
+ "FeedbackRepository",
38
+ "ProjectRepository",
22
39
  "SessionRepository",
40
+ "TaskRepository",
23
41
  # Entities
24
42
  "Session",
25
43
  # Models