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
@@ -2,13 +2,15 @@
2
2
  Defines FastAPI dependency injectors to access shared resources
3
3
  managed by the WebUIBackendComponent.
4
4
  """
5
+ from __future__ import annotations
5
6
 
6
7
  import logging
7
8
  from collections.abc import Callable, Generator
8
9
  from contextlib import contextmanager
9
- from typing import TYPE_CHECKING, Any
10
+ from dataclasses import dataclass
11
+ from typing import TYPE_CHECKING, Any, Optional
10
12
 
11
- from fastapi import Depends, HTTPException, Request, status
13
+ from fastapi import Depends, HTTPException, Request, status, Path, Query
12
14
  from sqlalchemy import create_engine
13
15
  from sqlalchemy.orm import Session, sessionmaker
14
16
 
@@ -18,15 +20,18 @@ from ...common.services.identity_service import BaseIdentityService
18
20
  from ...core_a2a.service import CoreA2AService
19
21
  from ...gateway.base.task_context import TaskContextManager
20
22
  from ...gateway.http_sse.services.agent_card_service import AgentCardService
21
- from ...gateway.http_sse.services.people_service import PeopleService
22
- from ...gateway.http_sse.services.task_service import TaskService
23
+ from ...gateway.http_sse.services.audio_service import AudioService
24
+ from ...gateway.http_sse.services.project_service import ProjectService
23
25
  from ...gateway.http_sse.services.feedback_service import FeedbackService
26
+ from ...gateway.http_sse.services.people_service import PeopleService
24
27
  from ...gateway.http_sse.services.task_logger_service import TaskLoggerService
28
+ from ...gateway.http_sse.services.task_service import TaskService
25
29
  from ...gateway.http_sse.services.data_retention_service import DataRetentionService
26
30
  from ...gateway.http_sse.session_manager import SessionManager
27
31
  from ...gateway.http_sse.sse_manager import SSEManager
28
32
  from .repository import SessionRepository
29
33
  from .repository.interfaces import ITaskRepository
34
+ from .repository.project_repository import ProjectRepository
30
35
  from .repository.task_repository import TaskRepository
31
36
  from .services.session_service import SessionService
32
37
 
@@ -41,7 +46,7 @@ except ImportError:
41
46
 
42
47
 
43
48
  if TYPE_CHECKING:
44
- from gateway.http_sse.component import WebUIBackendComponent
49
+ from .component import WebUIBackendComponent
45
50
 
46
51
  sac_component_instance: "WebUIBackendComponent" = None
47
52
  SessionLocal: sessionmaker = None
@@ -54,32 +59,57 @@ def set_component_instance(component: "WebUIBackendComponent"):
54
59
  global sac_component_instance
55
60
  if sac_component_instance is None:
56
61
  sac_component_instance = component
57
- log.info("[Dependencies] SAC Component instance provided.")
62
+ log.info("SAC Component instance provided.")
58
63
  else:
59
- log.warning("[Dependencies] SAC Component instance already set.")
64
+ log.warning("SAC Component instance already set.")
60
65
 
61
66
 
62
67
  def init_database(database_url: str):
63
- """Initialize database with direct sessionmaker."""
68
+ """Initialize database with appropriate configuration based on database dialect."""
64
69
  global SessionLocal
65
70
  if SessionLocal is None:
66
- engine = create_engine(database_url)
71
+ from sqlalchemy import event, pool
72
+ from sqlalchemy.engine.url import make_url
73
+
74
+ url = make_url(database_url)
75
+ dialect_name = url.get_dialect().name
76
+
77
+ engine_kwargs = {}
78
+
79
+ if dialect_name == "sqlite":
80
+ engine_kwargs = {
81
+ "poolclass": pool.StaticPool,
82
+ "connect_args": {"check_same_thread": False}
83
+ }
84
+ log.info("Configuring SQLite database (single-connection mode)")
85
+
86
+ elif dialect_name in ("postgresql", "mysql"):
87
+ engine_kwargs = {
88
+ "pool_size": 10,
89
+ "max_overflow": 20,
90
+ "pool_timeout": 30,
91
+ "pool_recycle": 1800,
92
+ "pool_pre_ping": True,
93
+ }
94
+ log.info(f"Configuring {dialect_name} database with connection pooling")
95
+
96
+ else:
97
+ log.warning(f"Using default configuration for dialect: {dialect_name}")
67
98
 
68
- # Enable foreign keys for SQLite only (database-agnostic)
69
- from sqlalchemy import event
99
+ engine = create_engine(database_url, **engine_kwargs)
70
100
 
71
101
  @event.listens_for(engine, "connect")
72
102
  def set_sqlite_pragma(dbapi_conn, connection_record):
73
- # Only apply to SQLite connections
74
- if database_url.startswith("sqlite"):
103
+ if dialect_name == "sqlite":
75
104
  cursor = dbapi_conn.cursor()
76
105
  cursor.execute("PRAGMA foreign_keys=ON")
77
106
  cursor.close()
78
107
 
79
108
  SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
80
- log.info("[Dependencies] Database initialized with foreign key support.")
109
+ log.debug(f"Database initialized: {url}")
110
+ log.info("Database initialized successfully")
81
111
  else:
82
- log.warning("[Dependencies] Database already initialized.")
112
+ log.warning("Database already initialized.")
83
113
 
84
114
 
85
115
  def set_api_config(config: dict[str, Any]):
@@ -87,16 +117,16 @@ def set_api_config(config: dict[str, Any]):
87
117
  global api_config
88
118
  if api_config is None:
89
119
  api_config = config
90
- log.info("[Dependencies] API configuration provided.")
120
+ log.debug("API configuration provided.")
91
121
  else:
92
- log.warning("[Dependencies] API configuration already set.")
122
+ log.warning("API configuration already set.")
93
123
 
94
124
 
95
125
  def get_sac_component() -> "WebUIBackendComponent":
96
126
  """FastAPI dependency to get the SAC component instance."""
97
127
  if sac_component_instance is None:
98
128
  log.critical(
99
- "[Dependencies] SAC Component instance accessed before it was set!"
129
+ "SAC Component instance accessed before it was set!"
100
130
  )
101
131
  raise HTTPException(
102
132
  status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
@@ -108,7 +138,7 @@ def get_sac_component() -> "WebUIBackendComponent":
108
138
  def get_api_config() -> dict[str, Any]:
109
139
  """FastAPI dependency to get the API configuration."""
110
140
  if api_config is None:
111
- log.critical("[Dependencies] API configuration accessed before it was set!")
141
+ log.critical("API configuration accessed before it was set!")
112
142
  raise HTTPException(
113
143
  status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
114
144
  detail="API configuration not yet initialized.",
@@ -120,7 +150,7 @@ def get_agent_registry(
120
150
  component: "WebUIBackendComponent" = Depends(get_sac_component),
121
151
  ) -> AgentRegistry:
122
152
  """FastAPI dependency to get the AgentRegistry."""
123
- log.debug("[Dependencies] get_agent_registry called")
153
+ log.debug("get_agent_registry called")
124
154
  return component.get_agent_registry()
125
155
 
126
156
 
@@ -128,7 +158,7 @@ def get_sse_manager(
128
158
  component: "WebUIBackendComponent" = Depends(get_sac_component),
129
159
  ) -> SSEManager:
130
160
  """FastAPI dependency to get the SSEManager."""
131
- log.debug("[Dependencies] get_sse_manager called")
161
+ log.debug("get_sse_manager called")
132
162
  return component.get_sse_manager()
133
163
 
134
164
 
@@ -136,7 +166,7 @@ def get_session_manager(
136
166
  component: "WebUIBackendComponent" = Depends(get_sac_component),
137
167
  ) -> SessionManager:
138
168
  """FastAPI dependency to get the SessionManager."""
139
- log.debug("[Dependencies] get_session_manager called")
169
+ log.debug("get_session_manager called")
140
170
  return component.get_session_manager()
141
171
 
142
172
 
@@ -144,7 +174,7 @@ def get_user_id_callable(
144
174
  session_manager: SessionManager = Depends(get_session_manager),
145
175
  ) -> Callable:
146
176
  """Dependency that provides the callable for getting user_id (client_id)."""
147
- log.debug("[Dependencies] Providing user_id callable")
177
+ log.debug("Providing user_id callable")
148
178
  return session_manager.dep_get_client_id()
149
179
 
150
180
 
@@ -152,7 +182,7 @@ def ensure_session_id_callable(
152
182
  session_manager: SessionManager = Depends(get_session_manager),
153
183
  ) -> Callable:
154
184
  """Dependency that provides the callable for ensuring session_id."""
155
- log.debug("[Dependencies] Providing ensure_session_id callable")
185
+ log.debug("Providing ensure_session_id callable")
156
186
  return session_manager.dep_ensure_session_id()
157
187
 
158
188
 
@@ -165,27 +195,27 @@ def get_user_id(
165
195
  When FRONTEND_USE_AUTHORIZATION is true: Fully relies on OAuth - user must be authenticated by AuthMiddleware.
166
196
  When FRONTEND_USE_AUTHORIZATION is false: Uses development fallback user.
167
197
  """
168
- log.debug("[Dependencies] Resolving user_id string")
198
+ log.debug("Resolving user_id string")
169
199
 
170
200
  # AuthMiddleware should always set user state for both auth enabled/disabled cases
171
201
  if hasattr(request.state, "user") and request.state.user:
172
202
  user_id = request.state.user.get("id")
173
203
  if user_id:
174
- log.debug(f"[Dependencies] Using user ID from AuthMiddleware: {user_id}")
204
+ log.debug(f"Using user ID from AuthMiddleware: {user_id}")
175
205
  return user_id
176
206
  else:
177
207
  log.error(
178
- "[Dependencies] request.state.user exists but has no 'id' field: %s. This indicates a bug in AuthMiddleware.",
208
+ "request.state.user exists but has no 'id' field: %s. This indicates a bug in AuthMiddleware.",
179
209
  request.state.user,
180
210
  )
181
211
 
182
212
  # If we reach here, AuthMiddleware didn't set user state properly
183
- use_authorization = session_manager.use_authorization
213
+ use_authorization = api_config.get("frontend_use_authorization", False) if api_config else False
184
214
 
185
215
  if use_authorization:
186
216
  # When OAuth is enabled, we should never reach here - AuthMiddleware should have handled authentication
187
217
  log.error(
188
- "[Dependencies] OAuth is enabled but no authenticated user found. This indicates an authentication failure or middleware bug."
218
+ "OAuth is enabled but no authenticated user found. This indicates an authentication failure or middleware bug."
189
219
  )
190
220
  raise HTTPException(
191
221
  status_code=status.HTTP_401_UNAUTHORIZED,
@@ -195,7 +225,7 @@ def get_user_id(
195
225
  # When auth is disabled, use development fallback user
196
226
  fallback_id = "sam_dev_user"
197
227
  log.info(
198
- "[Dependencies] Authorization disabled and no user in request state, using fallback user: %s",
228
+ "Authorization disabled and no user in request state, using fallback user: %s",
199
229
  fallback_id,
200
230
  )
201
231
  return fallback_id
@@ -206,7 +236,7 @@ def ensure_session_id(
206
236
  session_manager: SessionManager = Depends(get_session_manager),
207
237
  ) -> str:
208
238
  """FastAPI dependency that directly returns the ensured session_id string."""
209
- log.debug("[Dependencies] Resolving ensured session_id string")
239
+ log.debug("Resolving ensured session_id string")
210
240
  return session_manager.ensure_a2a_session(request)
211
241
 
212
242
 
@@ -214,7 +244,7 @@ def get_identity_service(
214
244
  component: "WebUIBackendComponent" = Depends(get_sac_component),
215
245
  ) -> BaseIdentityService | None:
216
246
  """FastAPI dependency to get the configured IdentityService instance."""
217
- log.debug("[Dependencies] get_identity_service called")
247
+ log.debug("get_identity_service called")
218
248
  return component.identity_service
219
249
 
220
250
 
@@ -239,13 +269,13 @@ def get_people_service(
239
269
  identity_service: BaseIdentityService | None = Depends(get_identity_service),
240
270
  ) -> PeopleService:
241
271
  """FastAPI dependency to get an instance of PeopleService."""
242
- log.debug("[Dependencies] get_people_service called")
272
+ log.debug("get_people_service called")
243
273
  return PeopleService(identity_service=identity_service)
244
274
 
245
275
 
246
276
  def get_task_repository() -> ITaskRepository:
247
277
  """FastAPI dependency to get an instance of TaskRepository."""
248
- log.debug("[Dependencies] get_task_repository called")
278
+ log.debug("get_task_repository called")
249
279
  return TaskRepository()
250
280
 
251
281
 
@@ -254,7 +284,7 @@ def get_feedback_service(
254
284
  task_repo: ITaskRepository = Depends(get_task_repository),
255
285
  ) -> FeedbackService:
256
286
  """FastAPI dependency to get an instance of FeedbackService."""
257
- log.debug("[Dependencies] get_feedback_service called")
287
+ log.debug("get_feedback_service called")
258
288
  # The session factory is needed for the existing DB save logic.
259
289
  session_factory = SessionLocal if component.database_url else None
260
290
  return FeedbackService(
@@ -264,7 +294,7 @@ def get_feedback_service(
264
294
 
265
295
  def get_data_retention_service(
266
296
  component: "WebUIBackendComponent" = Depends(get_sac_component),
267
- ) -> "DataRetentionService | None":
297
+ ) -> DataRetentionService | None:
268
298
  """
269
299
  FastAPI dependency to get the DataRetentionService instance.
270
300
 
@@ -277,11 +307,11 @@ def get_data_retention_service(
277
307
  data retention statistics or manual cleanup triggers. The service itself
278
308
  runs automatically via timer in the component.
279
309
  """
280
- log.debug("[Dependencies] get_data_retention_service called")
310
+ log.debug("get_data_retention_service called")
281
311
 
282
312
  if not component.database_url:
283
313
  log.debug(
284
- "[Dependencies] Database not configured, returning None for data retention service"
314
+ "Database not configured, returning None for data retention service"
285
315
  )
286
316
  return None
287
317
 
@@ -289,7 +319,7 @@ def get_data_retention_service(
289
319
  not hasattr(component, "data_retention_service")
290
320
  or component.data_retention_service is None
291
321
  ):
292
- log.warning("[Dependencies] DataRetentionService not initialized on component")
322
+ log.warning("DataRetentionService not initialized on component")
293
323
  return None
294
324
 
295
325
  return component.data_retention_service
@@ -299,10 +329,10 @@ def get_task_logger_service(
299
329
  component: "WebUIBackendComponent" = Depends(get_sac_component),
300
330
  ) -> TaskLoggerService:
301
331
  """FastAPI dependency to get an instance of TaskLoggerService."""
302
- log.debug("[Dependencies] get_task_logger_service called")
332
+ log.debug("get_task_logger_service called")
303
333
  task_logger_service = component.get_task_logger_service()
304
334
  if task_logger_service is None:
305
- log.error("[Dependencies] TaskLoggerService is not available.")
335
+ log.error("TaskLoggerService is not available.")
306
336
  raise HTTPException(
307
337
  status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
308
338
  detail="Task logging service is not configured or available.",
@@ -317,7 +347,7 @@ def get_publish_a2a_func(
317
347
  component: "WebUIBackendComponent" = Depends(get_sac_component),
318
348
  ) -> PublishFunc:
319
349
  """FastAPI dependency to get the component's publish_a2a method."""
320
- log.debug("[Dependencies] get_publish_a2a_func called")
350
+ log.debug("get_publish_a2a_func called")
321
351
  return component.publish_a2a
322
352
 
323
353
 
@@ -325,7 +355,7 @@ def get_namespace(
325
355
  component: "WebUIBackendComponent" = Depends(get_sac_component),
326
356
  ) -> str:
327
357
  """FastAPI dependency to get the namespace."""
328
- log.debug("[Dependencies] get_namespace called")
358
+ log.debug("get_namespace called")
329
359
  return component.get_namespace()
330
360
 
331
361
 
@@ -333,7 +363,7 @@ def get_gateway_id(
333
363
  component: "WebUIBackendComponent" = Depends(get_sac_component),
334
364
  ) -> str:
335
365
  """FastAPI dependency to get the Gateway ID."""
336
- log.debug("[Dependencies] get_gateway_id called")
366
+ log.debug("get_gateway_id called")
337
367
  return component.get_gateway_id()
338
368
 
339
369
 
@@ -341,7 +371,7 @@ def get_config_resolver(
341
371
  component: "WebUIBackendComponent" = Depends(get_sac_component),
342
372
  ) -> ConfigResolver:
343
373
  """FastAPI dependency to get the ConfigResolver."""
344
- log.debug("[Dependencies] get_config_resolver called")
374
+ log.debug("get_config_resolver called")
345
375
  return component.get_config_resolver()
346
376
 
347
377
 
@@ -351,7 +381,7 @@ def get_app_config(
351
381
  """
352
382
  FastAPI dependency to safely get the application configuration dictionary.
353
383
  """
354
- log.debug("[Dependencies] get_app_config called")
384
+ log.debug("get_app_config called")
355
385
  return component.component_config.get("app_config", {})
356
386
 
357
387
 
@@ -365,74 +395,35 @@ async def get_user_config(
365
395
  """
366
396
  FastAPI dependency to get the user-specific configuration.
367
397
  """
368
- log.debug(f"[Dependencies] get_user_config called for user_id: {user_id}")
369
- gateway_context = {
370
- "gateway_id": component.gateway_id,
371
- "gateway_app_config": app_config,
372
- "request": request,
373
- }
398
+ log.debug(f"get_user_config called for user_id: {user_id}")
399
+
400
+ # TODO: DATAGO-114659-split-cleanup
401
+ gateway_context = {}
402
+ if getattr(component, "gateway_id", None):
403
+ gateway_context = {
404
+ "gateway_id": component.gateway_id,
405
+ "gateway_app_config": app_config,
406
+ "request": request,
407
+ }
374
408
  return await config_resolver.resolve_user_config(
375
409
  user_id, gateway_context, app_config
376
410
  )
377
411
 
378
412
 
379
- class ValidatedUserConfig:
380
- """
381
- FastAPI dependency class for validating user scopes and returning user config.
382
-
383
- This class creates a callable dependency that validates a user has the required
384
- scopes before allowing access to protected endpoints.
385
-
386
- Args:
387
- required_scopes: List of scope strings required for authorization
388
-
389
- Raises:
390
- HTTPException: 403 if user lacks required scopes
391
-
392
- Example:
393
- @router.get("/artifacts")
394
- async def list_artifacts(
395
- user_config: dict = Depends(ValidatedUserConfig(["tool:artifact:list"])),
396
- ):
397
- """
398
-
399
- def __init__(self, required_scopes: list[str]):
400
- self.required_scopes = required_scopes
401
-
402
- async def __call__(
403
- self,
404
- request: Request,
405
- config_resolver: ConfigResolver = Depends(get_config_resolver),
406
- user_config: dict[str, Any] = Depends(get_user_config),
407
- ) -> dict[str, Any]:
408
- user_id = user_config.get("user_profile", {}).get("id")
409
-
410
- log.debug(
411
- f"[Dependencies] ValidatedUserConfig called for user_id: {user_id} with required scopes: {self.required_scopes}"
412
- )
413
-
414
- # Validate scopes
415
- if not config_resolver.is_feature_enabled(
416
- user_config,
417
- {"tool_metadata": {"required_scopes": self.required_scopes}},
418
- {},
419
- ):
420
- log.warning(
421
- f"[Dependencies] Authorization denied for user '{user_id}'. Required scopes: {self.required_scopes}"
422
- )
423
- raise HTTPException(
424
- status_code=status.HTTP_403_FORBIDDEN,
425
- detail=f"Not authorized. Required scopes: {self.required_scopes}",
426
- )
413
+ # DEPRECATED: Import from shared location
414
+ # Re-export for backward compatibility
415
+ from solace_agent_mesh.shared.auth.dependencies import ValidatedUserConfig
427
416
 
428
- return user_config
417
+ # Note: ValidatedUserConfig implementation moved to:
418
+ # src/solace_agent_mesh/shared/auth/dependencies.py
419
+ # This re-export will be removed in v2.0.0
429
420
 
430
421
 
431
422
  def get_shared_artifact_service(
432
423
  component: "WebUIBackendComponent" = Depends(get_sac_component),
433
424
  ) -> BaseArtifactService | None:
434
425
  """FastAPI dependency to get the shared ArtifactService."""
435
- log.debug("[Dependencies] get_shared_artifact_service called")
426
+ log.debug("get_shared_artifact_service called")
436
427
  return component.get_shared_artifact_service()
437
428
 
438
429
 
@@ -440,7 +431,7 @@ def get_embed_config(
440
431
  component: "WebUIBackendComponent" = Depends(get_sac_component),
441
432
  ) -> dict[str, Any]:
442
433
  """FastAPI dependency to get embed-related configuration."""
443
- log.debug("[Dependencies] get_embed_config called")
434
+ log.debug("get_embed_config called")
444
435
  return component.get_embed_config()
445
436
 
446
437
 
@@ -448,10 +439,10 @@ def get_core_a2a_service(
448
439
  component: "WebUIBackendComponent" = Depends(get_sac_component),
449
440
  ) -> CoreA2AService:
450
441
  """FastAPI dependency to get the CoreA2AService."""
451
- log.debug("[Dependencies] get_core_a2a_service called")
442
+ log.debug("get_core_a2a_service called")
452
443
  core_service = component.get_core_a2a_service()
453
444
  if core_service is None:
454
- log.critical("[Dependencies] CoreA2AService accessed before initialization!")
445
+ log.critical("CoreA2AService accessed before initialization!")
455
446
  raise HTTPException(status_code=503, detail="Core service not ready.")
456
447
  return core_service
457
448
 
@@ -460,10 +451,10 @@ def get_task_context_manager_from_component(
460
451
  component: "WebUIBackendComponent" = Depends(get_sac_component),
461
452
  ) -> TaskContextManager:
462
453
  """FastAPI dependency to get the TaskContextManager from the component."""
463
- log.debug("[Dependencies] get_task_context_manager_from_component called")
454
+ log.debug("get_task_context_manager_from_component called")
464
455
  if component.task_context_manager is None:
465
456
  log.critical(
466
- "[Dependencies] TaskContextManager accessed before initialization!"
457
+ "TaskContextManager accessed before initialization!"
467
458
  )
468
459
  raise HTTPException(status_code=503, detail="Task context manager not ready.")
469
460
  return component.task_context_manager
@@ -473,7 +464,7 @@ def get_agent_card_service(
473
464
  registry: AgentRegistry = Depends(get_agent_registry),
474
465
  ) -> AgentCardService:
475
466
  """FastAPI dependency to get an instance of AgentCardService."""
476
- log.debug("[Dependencies] get_agent_card_service called")
467
+ log.debug("get_agent_card_service called")
477
468
  return AgentCardService(agent_registry=registry)
478
469
 
479
470
 
@@ -489,7 +480,7 @@ def get_task_service(
489
480
  component: "WebUIBackendComponent" = Depends(get_sac_component),
490
481
  ) -> TaskService:
491
482
  """FastAPI dependency to get an instance of TaskService."""
492
- log.debug("[Dependencies] get_task_service called")
483
+ log.debug("get_task_service called")
493
484
  app_name = component.get_config("name", "WebUIBackendApp")
494
485
  return TaskService(
495
486
  core_a2a_service=core_a2a_service,
@@ -506,7 +497,7 @@ def get_task_service(
506
497
  def get_session_business_service(
507
498
  component: "WebUIBackendComponent" = Depends(get_sac_component),
508
499
  ) -> SessionService:
509
- log.debug("[Dependencies] get_session_business_service called")
500
+ log.debug("get_session_business_service called")
510
501
 
511
502
  # Note: Session and message repositories will be created per request
512
503
  # when the SessionService methods receive the db parameter
@@ -516,7 +507,7 @@ def get_session_business_service(
516
507
  def get_session_validator(
517
508
  component: "WebUIBackendComponent" = Depends(get_sac_component),
518
509
  ) -> Callable[[str, str], bool]:
519
- log.debug("[Dependencies] get_session_validator called")
510
+ log.debug("get_session_validator called")
520
511
 
521
512
  if SessionLocal:
522
513
  log.debug("Using database-backed session validation")
@@ -532,7 +523,7 @@ def get_session_validator(
532
523
  return session_domain is not None
533
524
  finally:
534
525
  db.close()
535
- except:
526
+ except Exception:
536
527
  return False
537
528
 
538
529
  return validate_with_database
@@ -550,7 +541,7 @@ def get_session_validator(
550
541
  def get_db_optional() -> Generator[Session | None, None, None]:
551
542
  """Optional database dependency that returns None if database is not configured."""
552
543
  if SessionLocal is None:
553
- log.debug("[Dependencies] Database not configured, returning None")
544
+ log.debug("Database not configured, returning None")
554
545
  yield None
555
546
  else:
556
547
  db = SessionLocal()
@@ -563,6 +554,21 @@ def get_db_optional() -> Generator[Session | None, None, None]:
563
554
  finally:
564
555
  db.close()
565
556
 
557
+ def get_project_service(
558
+ component: "WebUIBackendComponent" = Depends(get_sac_component),
559
+ ) -> ProjectService:
560
+ """Dependency factory for ProjectService."""
561
+ return ProjectService(component=component)
562
+
563
+
564
+ def get_project_service_optional(
565
+ component: "WebUIBackendComponent" = Depends(get_sac_component),
566
+ ) -> ProjectService | None:
567
+ """Optional project service dependency that returns None if database is not configured."""
568
+ if SessionLocal is None:
569
+ log.debug("Database not configured, projects unavailable")
570
+ return None
571
+ return ProjectService(component=component)
566
572
 
567
573
  def get_session_business_service_optional(
568
574
  component: "WebUIBackendComponent" = Depends(get_sac_component),
@@ -570,7 +576,36 @@ def get_session_business_service_optional(
570
576
  """Optional session service dependency that returns None if database is not configured."""
571
577
  if SessionLocal is None:
572
578
  log.debug(
573
- "[Dependencies] Database not configured, returning None for session service"
579
+ "Database not configured, returning None for session service"
574
580
  )
575
581
  return None
576
582
  return SessionService(component=component)
583
+
584
+
585
+ def get_audio_service(
586
+ component: "WebUIBackendComponent" = Depends(get_sac_component),
587
+ ) -> AudioService:
588
+ """FastAPI dependency to get an instance of AudioService."""
589
+ log.debug("[get_audio_service] called")
590
+ # AudioService expects app_config which contains the speech configuration
591
+ app_config = component.component_config.get('app_config', {}) if hasattr(component, 'component_config') else {}
592
+ log.debug(f"[get_audio_service] app_config keys: {app_config.keys()}")
593
+ return AudioService(config=app_config)
594
+
595
+
596
+
597
+ def get_user_display_name(
598
+ request: Request,
599
+ user_id: str = Depends(get_user_id),
600
+ ) -> str:
601
+ """
602
+ FastAPI dependency to get a user's display name.
603
+ Returns email if available, otherwise returns user_id.
604
+ """
605
+ # Try to get user info from request state (set by AuthMiddleware)
606
+ if hasattr(request.state, "user") and request.state.user:
607
+ user_info = request.state.user
608
+ # Try email first, then name, then fall back to user_id
609
+ return user_info.get("email") or user_info.get("name") or user_id
610
+
611
+ return user_id