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
@@ -0,0 +1,14 @@
1
+ """
2
+ Shared utilities for Solace Agent Mesh.
3
+
4
+ This module contains utilities used by both gateways and services:
5
+ - API utilities (pagination, responses, auth)
6
+ - Database utilities (repositories, exceptions, helpers)
7
+ - Exception handling
8
+ - Common utilities (timestamps, enums, types)
9
+
10
+ Architecture:
11
+ - GATEWAYS (http_sse, slack, webhook) import from shared/
12
+ - SERVICES (platform) import from shared/
13
+ - No cross-dependencies between gateways and services
14
+ """
@@ -0,0 +1,42 @@
1
+ """
2
+ API utilities for REST endpoints.
3
+
4
+ Provides:
5
+ - Pagination patterns (PaginationParams, PaginatedResponse, DataResponse)
6
+ - Response utilities (create_data_response, create_paginated_response)
7
+ - Auth utilities (get_current_user)
8
+
9
+ Note: Error responses are handled by exception_handlers in shared.exceptions
10
+ """
11
+
12
+ from .pagination import (
13
+ PaginationParams,
14
+ PaginatedResponse,
15
+ DataResponse,
16
+ PaginationMeta,
17
+ Meta,
18
+ get_pagination_or_default,
19
+ DEFAULT_PAGE_NUMBER,
20
+ DEFAULT_PAGE_SIZE,
21
+ MAX_PAGE_SIZE,
22
+ )
23
+ from .response_utils import (
24
+ create_data_response,
25
+ create_paginated_response,
26
+ )
27
+ from .auth_utils import get_current_user
28
+
29
+ __all__ = [
30
+ "PaginationParams",
31
+ "PaginatedResponse",
32
+ "DataResponse",
33
+ "PaginationMeta",
34
+ "Meta",
35
+ "get_pagination_or_default",
36
+ "DEFAULT_PAGE_NUMBER",
37
+ "DEFAULT_PAGE_SIZE",
38
+ "MAX_PAGE_SIZE",
39
+ "create_data_response",
40
+ "create_paginated_response",
41
+ "get_current_user",
42
+ ]
@@ -0,0 +1,26 @@
1
+ """
2
+ Authentication and authorization dependencies.
3
+
4
+ Provides FastAPI dependencies for:
5
+ - User authentication (extracting current user from request)
6
+ - Authorization (scope-based validation)
7
+ - User configuration resolution
8
+
9
+ Works with both gateways and services.
10
+ """
11
+
12
+ from .dependencies import (
13
+ get_current_user,
14
+ get_config_resolver,
15
+ get_user_config,
16
+ ValidatedUserConfig,
17
+ ComponentWithAuth,
18
+ )
19
+
20
+ __all__ = [
21
+ "get_current_user",
22
+ "get_config_resolver",
23
+ "get_user_config",
24
+ "ValidatedUserConfig",
25
+ "ComponentWithAuth",
26
+ ]
@@ -0,0 +1,204 @@
1
+ """
2
+ Shared authentication dependencies for both gateways and services.
3
+
4
+ Provides FastAPI dependencies for:
5
+ - User authentication (get_current_user)
6
+ - Authorization/scope validation (ValidatedUserConfig)
7
+ - Config resolution (get_config_resolver, get_user_config)
8
+
9
+ These work with any component that implements the required interface:
10
+ - get_config_resolver() -> ConfigResolver
11
+ - get_namespace() -> str
12
+ """
13
+
14
+ import logging
15
+ from typing import Any, Protocol
16
+
17
+ from fastapi import Depends, HTTPException, Request, status
18
+ from solace_agent_mesh.common.middleware.config_resolver import ConfigResolver
19
+
20
+ log = logging.getLogger(__name__)
21
+
22
+
23
+ class ComponentWithAuth(Protocol):
24
+ """
25
+ Protocol for components that support authentication and authorization.
26
+
27
+ Both WebUIBackendComponent (gateway) and PlatformServiceComponent (service)
28
+ implement this interface.
29
+ """
30
+ def get_config_resolver(self) -> ConfigResolver: ...
31
+ def get_namespace(self) -> str: ...
32
+
33
+
34
+ def get_current_user(request: Request) -> dict:
35
+ """
36
+ Extract authenticated user from request state.
37
+
38
+ The user is set by OAuth middleware during request processing.
39
+ Works with both gateway and service contexts.
40
+
41
+ Args:
42
+ request: FastAPI Request object
43
+
44
+ Returns:
45
+ Dictionary containing user information (id, email, name, authenticated, etc.)
46
+
47
+ Raises:
48
+ HTTPException: 401 if user is not authenticated
49
+ """
50
+ if not hasattr(request.state, "user") or not request.state.user:
51
+ raise HTTPException(
52
+ status_code=status.HTTP_401_UNAUTHORIZED,
53
+ detail="Authentication required",
54
+ )
55
+ return request.state.user
56
+
57
+
58
+ def _get_component_from_context() -> ComponentWithAuth:
59
+ """
60
+ Get component instance from either gateway or service context.
61
+
62
+ Tries platform service first, then falls back to http_sse gateway.
63
+
64
+ Returns:
65
+ Component instance implementing ComponentWithAuth protocol
66
+
67
+ Raises:
68
+ HTTPException: 503 if no component is available
69
+ """
70
+ try:
71
+ from solace_agent_mesh.services.platform.api.dependencies import platform_component_instance
72
+ if platform_component_instance is not None:
73
+ return platform_component_instance
74
+ except ImportError:
75
+ pass
76
+
77
+ try:
78
+ from solace_agent_mesh.gateway.http_sse.dependencies import sac_component_instance
79
+ if sac_component_instance is not None:
80
+ return sac_component_instance
81
+ except ImportError:
82
+ pass
83
+
84
+ raise HTTPException(
85
+ status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
86
+ detail="Component not initialized"
87
+ )
88
+
89
+
90
+ def get_config_resolver() -> ConfigResolver:
91
+ """
92
+ Get ConfigResolver from current component context.
93
+
94
+ Works with both gateway and service components.
95
+
96
+ Returns:
97
+ ConfigResolver instance for authorization checks
98
+ """
99
+ component = _get_component_from_context()
100
+ return component.get_config_resolver()
101
+
102
+
103
+ async def get_user_config(
104
+ request: Request,
105
+ user: dict = Depends(get_current_user),
106
+ config_resolver: ConfigResolver = Depends(get_config_resolver),
107
+ ) -> dict[str, Any]:
108
+ """
109
+ Get user configuration including profile and permissions.
110
+
111
+ Works with both gateway and service components.
112
+
113
+ Args:
114
+ request: FastAPI Request object
115
+ user: Authenticated user (from get_current_user dependency)
116
+ config_resolver: ConfigResolver (from get_config_resolver dependency)
117
+
118
+ Returns:
119
+ Dictionary containing user configuration and permissions
120
+ """
121
+ component = _get_component_from_context()
122
+ user_id = user.get("id")
123
+
124
+ log.debug(f"get_user_config called for user_id: {user_id}")
125
+
126
+ namespace = component.get_namespace()
127
+
128
+ app_config = {}
129
+ if hasattr(component, "component_config"):
130
+ app_config = getattr(component, "component_config", {}).get("app_config", {})
131
+
132
+ gateway_context = {}
133
+ if hasattr(component, "gateway_id"):
134
+ gateway_context = {
135
+ "gateway_id": component.gateway_id,
136
+ "gateway_app_config": app_config,
137
+ "request": request,
138
+ }
139
+
140
+ return await config_resolver.resolve_user_config(
141
+ user_id, gateway_context, app_config
142
+ )
143
+
144
+
145
+ class ValidatedUserConfig:
146
+ """
147
+ FastAPI dependency for scope-based authorization.
148
+
149
+ Validates that the current user has required scopes before allowing access.
150
+ Works with both gateways (http_sse) and services (platform).
151
+
152
+ Args:
153
+ required_scopes: List of scope strings required for authorization
154
+
155
+ Raises:
156
+ HTTPException: 403 if user lacks required scopes
157
+
158
+ Example:
159
+ @router.post("/agents")
160
+ async def create_agent(
161
+ user_config: dict = Depends(ValidatedUserConfig(["sam:agents:create"])),
162
+ ):
163
+ # Only users with sam:agents:create scope can access
164
+ ...
165
+ """
166
+
167
+ def __init__(self, required_scopes: list[str]):
168
+ self.required_scopes = required_scopes
169
+
170
+ async def __call__(
171
+ self,
172
+ request: Request,
173
+ config_resolver: ConfigResolver = Depends(get_config_resolver),
174
+ user_config: dict[str, Any] = Depends(get_user_config),
175
+ ) -> dict[str, Any]:
176
+ user_id = user_config.get("user_profile", {}).get("id")
177
+
178
+ log.debug(
179
+ f"ValidatedUserConfig called for user_id: {user_id} with required scopes: {self.required_scopes}"
180
+ )
181
+
182
+ if not config_resolver.is_feature_enabled(
183
+ user_config,
184
+ {"tool_metadata": {"required_scopes": self.required_scopes}},
185
+ {},
186
+ ):
187
+ log.warning(
188
+ f"Authorization denied for user '{user_id}'. Required scopes: {self.required_scopes}"
189
+ )
190
+ raise HTTPException(
191
+ status_code=status.HTTP_403_FORBIDDEN,
192
+ detail=f"Not authorized. Required scopes: {self.required_scopes}",
193
+ )
194
+
195
+ return user_config
196
+
197
+
198
+ __all__ = [
199
+ "get_current_user",
200
+ "get_config_resolver",
201
+ "get_user_config",
202
+ "ValidatedUserConfig",
203
+ "ComponentWithAuth",
204
+ ]
@@ -0,0 +1,347 @@
1
+ """
2
+ OAuth2 authentication middleware for both gateways and services.
3
+
4
+ Provides reusable OAuth2 token validation middleware that works with any
5
+ component that has OAuth configuration.
6
+ """
7
+
8
+ import httpx
9
+ import logging
10
+ from fastapi import Request as FastAPIRequest
11
+ from fastapi.responses import JSONResponse
12
+ from fastapi import status
13
+
14
+ log = logging.getLogger(__name__)
15
+
16
+
17
+ def _extract_access_token(request: FastAPIRequest) -> str:
18
+ """
19
+ Extract access token from request (header, session, or query param).
20
+
21
+ Args:
22
+ request: FastAPI request object
23
+
24
+ Returns:
25
+ Access token string if found, None otherwise
26
+ """
27
+ auth_header = request.headers.get("Authorization")
28
+ if auth_header and auth_header.startswith("Bearer "):
29
+ return auth_header[7:]
30
+
31
+ try:
32
+ if "access_token" in request.session:
33
+ log.debug("AuthMiddleware: Found token in session.")
34
+ return request.session["access_token"]
35
+ except AssertionError:
36
+ log.debug("AuthMiddleware: Could not access request.session.")
37
+
38
+ if "token" in request.query_params:
39
+ return request.query_params["token"]
40
+
41
+ return None
42
+
43
+
44
+ async def _validate_token(
45
+ auth_service_url: str, auth_provider: str, access_token: str
46
+ ) -> bool:
47
+ """
48
+ Validate token with external OAuth service.
49
+
50
+ Args:
51
+ auth_service_url: Base URL of OAuth service
52
+ auth_provider: OAuth provider name (azure, google, okta, etc.)
53
+ access_token: Bearer token to validate
54
+
55
+ Returns:
56
+ True if token is valid, False otherwise
57
+ """
58
+ async with httpx.AsyncClient() as client:
59
+ validation_response = await client.post(
60
+ f"{auth_service_url}/is_token_valid",
61
+ json={"provider": auth_provider},
62
+ headers={"Authorization": f"Bearer {access_token}"},
63
+ )
64
+ return validation_response.status_code == 200
65
+
66
+
67
+ async def _get_user_info(
68
+ auth_service_url: str, auth_provider: str, access_token: str
69
+ ) -> dict:
70
+ """
71
+ Get user info from OAuth service.
72
+
73
+ Args:
74
+ auth_service_url: Base URL of OAuth service
75
+ auth_provider: OAuth provider name
76
+ access_token: Bearer token
77
+
78
+ Returns:
79
+ User info dictionary if successful, None otherwise
80
+ """
81
+ async with httpx.AsyncClient() as client:
82
+ userinfo_response = await client.get(
83
+ f"{auth_service_url}/user_info?provider={auth_provider}",
84
+ headers={"Authorization": f"Bearer {access_token}"},
85
+ )
86
+
87
+ if userinfo_response.status_code != 200:
88
+ return None
89
+
90
+ return userinfo_response.json()
91
+
92
+
93
+ def _extract_user_identifier(user_info: dict) -> str:
94
+ """Extract user identifier from OAuth user info."""
95
+ user_identifier = (
96
+ user_info.get("sub")
97
+ or user_info.get("client_id")
98
+ or user_info.get("username")
99
+ or user_info.get("oid")
100
+ or user_info.get("preferred_username")
101
+ or user_info.get("upn")
102
+ or user_info.get("unique_name")
103
+ or user_info.get("email")
104
+ or user_info.get("name")
105
+ or user_info.get("azp")
106
+ or user_info.get("user_id")
107
+ )
108
+
109
+ if user_identifier and user_identifier.lower() == "unknown":
110
+ log.warning("AuthMiddleware: IDP returned 'Unknown' as user identifier. Using fallback.")
111
+ return "sam_dev_user"
112
+
113
+ return user_identifier
114
+
115
+
116
+ def _extract_user_details(user_info: dict, user_identifier: str) -> tuple:
117
+ """Extract email and display name from OAuth user info."""
118
+ email_from_auth = (
119
+ user_info.get("email")
120
+ or user_info.get("preferred_username")
121
+ or user_info.get("upn")
122
+ or user_identifier
123
+ )
124
+
125
+ display_name = (
126
+ user_info.get("name")
127
+ or user_info.get("given_name", "") + " " + user_info.get("family_name", "")
128
+ or user_info.get("preferred_username")
129
+ or user_identifier
130
+ ).strip()
131
+
132
+ return email_from_auth, display_name
133
+
134
+
135
+ async def _create_user_state(
136
+ user_identifier: str, email_from_auth: str, display_name: str
137
+ ) -> dict:
138
+ """Create user state dictionary from OAuth info."""
139
+ final_user_id = user_identifier or email_from_auth or "sam_dev_user"
140
+ if not final_user_id or final_user_id.lower() in ["unknown", "null", "none", ""]:
141
+ final_user_id = "sam_dev_user"
142
+ log.warning("AuthMiddleware: Had to use fallback user ID due to invalid identifier")
143
+
144
+ return {
145
+ "id": final_user_id,
146
+ "email": email_from_auth or final_user_id,
147
+ "name": display_name or final_user_id,
148
+ "authenticated": True,
149
+ "auth_method": "oidc",
150
+ }
151
+
152
+
153
+ def create_oauth_middleware(component):
154
+ """
155
+ Create OAuth2 authentication middleware for any component (gateway or service).
156
+
157
+ Works with any component that has:
158
+ - external_auth_service_url config
159
+ - external_auth_provider config
160
+ - use_authorization config
161
+
162
+ Args:
163
+ component: Component instance (gateway or service)
164
+
165
+ Returns:
166
+ AuthMiddleware class configured for the component
167
+ """
168
+
169
+ class AuthMiddleware:
170
+ def __init__(self, app, component):
171
+ self.app = app
172
+ self.component = component
173
+
174
+ async def __call__(self, scope, receive, send):
175
+ if scope["type"] != "http":
176
+ await self.app(scope, receive, send)
177
+ return
178
+
179
+ request = FastAPIRequest(scope, receive)
180
+
181
+ if not request.url.path.startswith("/api"):
182
+ await self.app(scope, receive, send)
183
+ return
184
+
185
+ skip_paths = [
186
+ "/api/v1/config",
187
+ "/api/v1/auth/callback",
188
+ "/api/v1/auth/tool/callback",
189
+ "/api/v1/auth/login",
190
+ "/api/v1/auth/refresh",
191
+ "/api/v1/csrf-token",
192
+ "/api/v1/platform/mcp/oauth/callback",
193
+ "/api/v1/platform/health",
194
+ "/health",
195
+ ]
196
+
197
+ if any(request.url.path.startswith(path) for path in skip_paths):
198
+ await self.app(scope, receive, send)
199
+ return
200
+
201
+ if request.method == "OPTIONS":
202
+ await self.app(scope, receive, send)
203
+ return
204
+
205
+ use_auth = self.component.get_config("frontend_use_authorization", False)
206
+
207
+ if use_auth:
208
+ if await self._handle_authenticated_request(request, scope, receive, send):
209
+ return
210
+ else:
211
+ request.state.user = {
212
+ "id": "sam_dev_user",
213
+ "name": "Sam Dev User",
214
+ "email": "sam@dev.local",
215
+ "authenticated": True,
216
+ "auth_method": "development",
217
+ }
218
+ log.debug("AuthMiddleware: Set development user (frontend_use_authorization=false)")
219
+
220
+ await self.app(scope, receive, send)
221
+
222
+ async def _handle_authenticated_request(self, request, scope, receive, send) -> bool:
223
+ """
224
+ Handle authentication for a request.
225
+
226
+ Supports both sam_access_token (new) and IdP access_token (existing)
227
+ for backwards compatibility. Tries sam_access_token validation first
228
+ (fast, local JWT verification), then falls back to IdP validation.
229
+
230
+ Returns:
231
+ True if an error response was sent (caller should not continue),
232
+ False if authentication succeeded (caller should proceed with app).
233
+ """
234
+ access_token = _extract_access_token(request)
235
+
236
+ if not access_token:
237
+ log.warning("AuthMiddleware: No access token found. Returning 401.")
238
+ response = JSONResponse(
239
+ status_code=status.HTTP_401_UNAUTHORIZED,
240
+ content={
241
+ "detail": "Not authenticated",
242
+ "error_type": "authentication_required",
243
+ },
244
+ )
245
+ await response(scope, receive, send)
246
+ return True
247
+
248
+ # Try sam_access_token validation first (fast, local JWT verification)
249
+ # This is an enterprise feature - trust_manager and authorization_service
250
+ # are set on the component by enterprise initialization code.
251
+ # If not present, we safely skip to IdP validation.
252
+ trust_manager = getattr(self.component, "trust_manager", None)
253
+ authorization_service = getattr(self.component, "authorization_service", None)
254
+
255
+ if trust_manager and getattr(trust_manager, "access_token_enabled", False):
256
+ try:
257
+ # Validate as sam_access_token using trust_manager (no task_id binding)
258
+ claims = trust_manager.verify_user_claims_without_task_binding(access_token)
259
+
260
+ # Success! It's a valid sam_access_token
261
+ # Extract roles from token, resolve scopes at request time
262
+ roles = claims.get("roles", [])
263
+ scopes = []
264
+ if authorization_service:
265
+ # Use existing get_scopes_for_user with roles param to skip role lookup
266
+ scopes = await authorization_service.get_scopes_for_user(
267
+ user_identity=claims["sub"],
268
+ gateway_context={},
269
+ roles=roles,
270
+ )
271
+ else:
272
+ log.warning(
273
+ "AuthMiddleware: Access token is enabled and provided but authorization service not available. "
274
+ "Cannot resolve scopes for sam_access_token."
275
+ )
276
+
277
+ request.state.user = {
278
+ "id": claims["sub"],
279
+ "email": claims.get("email", claims["sub"]),
280
+ "name": claims.get("name", claims["sub"]),
281
+ "authenticated": True,
282
+ "auth_method": "sam_access_token",
283
+ "roles": roles,
284
+ "scopes": scopes,
285
+ }
286
+ log.debug(
287
+ f"AuthMiddleware: Validated sam_access_token for user '{claims['sub']}' "
288
+ f"with roles={roles}, resolved scopes={len(scopes)}"
289
+ )
290
+ return False # Success - continue to app
291
+
292
+ except Exception as e:
293
+ # Not a sam_access_token or verification failed
294
+ # Fall through to IdP token validation below
295
+ log.debug(f"AuthMiddleware: Token is not a valid sam_access_token: {e}")
296
+
297
+ # EXISTING: Fall back to IdP token validation (unchanged logic)
298
+ auth_service_url = getattr(self.component, "external_auth_service_url", None)
299
+ auth_provider = getattr(self.component, "external_auth_provider", "generic")
300
+
301
+ if not auth_service_url:
302
+ log.error("Auth service URL not configured.")
303
+ response = JSONResponse(
304
+ status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
305
+ content={"detail": "Auth service not configured"},
306
+ )
307
+ await response(scope, receive, send)
308
+ return True
309
+
310
+ if not await _validate_token(auth_service_url, auth_provider, access_token):
311
+ log.warning("AuthMiddleware: Token validation failed")
312
+ response = JSONResponse(
313
+ status_code=status.HTTP_401_UNAUTHORIZED,
314
+ content={"detail": "Invalid token", "error_type": "invalid_token"},
315
+ )
316
+ await response(scope, receive, send)
317
+ return True
318
+
319
+ user_info = await _get_user_info(auth_service_url, auth_provider, access_token)
320
+ if not user_info:
321
+ log.warning("AuthMiddleware: Failed to get user info")
322
+ response = JSONResponse(
323
+ status_code=status.HTTP_401_UNAUTHORIZED,
324
+ content={"detail": "Could not retrieve user info"},
325
+ )
326
+ await response(scope, receive, send)
327
+ return True
328
+
329
+ user_identifier = _extract_user_identifier(user_info)
330
+ email_from_auth, display_name = _extract_user_details(user_info, user_identifier)
331
+
332
+ request.state.user = await _create_user_state(
333
+ user_identifier, email_from_auth, display_name
334
+ )
335
+
336
+ log.debug(f"AuthMiddleware: Authenticated user: {request.state.user['id']}")
337
+ return False
338
+
339
+ return AuthMiddleware
340
+
341
+
342
+ __all__ = [
343
+ "create_oauth_middleware",
344
+ "_extract_access_token",
345
+ "_validate_token",
346
+ "_get_user_info",
347
+ ]
@@ -0,0 +1,20 @@
1
+ """
2
+ Database utilities for repositories and data access.
3
+
4
+ Provides:
5
+ - Base repository classes (PaginatedRepository, ValidationMixin)
6
+ - Database exception handlers
7
+ - Database helpers (SimpleJSON type)
8
+ """
9
+
10
+ from .base_repository import PaginatedRepository, ValidationMixin
11
+ from .database_exceptions import DatabaseExceptionHandler, DatabaseErrorDecorator
12
+ from .database_helpers import SimpleJSON
13
+
14
+ __all__ = [
15
+ "PaginatedRepository",
16
+ "ValidationMixin",
17
+ "DatabaseExceptionHandler",
18
+ "DatabaseErrorDecorator",
19
+ "SimpleJSON",
20
+ ]
@@ -10,7 +10,7 @@ from typing import Any, Generic, TypeVar
10
10
 
11
11
  from sqlalchemy.orm import Session
12
12
 
13
- from .exceptions import EntityNotFoundError
13
+ from ..exceptions.exceptions import EntityNotFoundError
14
14
 
15
15
  T = TypeVar("T")
16
16
  ModelType = TypeVar("ModelType")
@@ -8,7 +8,7 @@ that can be properly handled by the API layer.
8
8
 
9
9
  from typing import Optional, Dict, List
10
10
  from sqlalchemy.exc import IntegrityError, SQLAlchemyError, OperationalError, DatabaseError
11
- from .exceptions import ValidationError, DataIntegrityError, EntityAlreadyExistsError
11
+ from ..exceptions.exceptions import ValidationError, DataIntegrityError, EntityAlreadyExistsError
12
12
 
13
13
 
14
14
  class DatabaseExceptionHandler:
@@ -7,7 +7,7 @@ Separated from dependencies.py to avoid circular imports.
7
7
 
8
8
  import json
9
9
  from sqlalchemy import Text, TypeDecorator
10
- from .exceptions import DataIntegrityError
10
+ from ..exceptions.exceptions import DataIntegrityError
11
11
 
12
12
 
13
13
  class SimpleJSON(TypeDecorator):