solace-agent-mesh 1.11.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.
Files changed (624) hide show
  1. solace_agent_mesh/__init__.py +0 -0
  2. solace_agent_mesh/agent/__init__.py +0 -0
  3. solace_agent_mesh/agent/adk/__init__.py +0 -0
  4. solace_agent_mesh/agent/adk/adk_llm.txt +226 -0
  5. solace_agent_mesh/agent/adk/adk_llm_detail.txt +566 -0
  6. solace_agent_mesh/agent/adk/alembic/README +74 -0
  7. solace_agent_mesh/agent/adk/alembic/env.py +77 -0
  8. solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
  9. solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
  10. solace_agent_mesh/agent/adk/alembic.ini +112 -0
  11. solace_agent_mesh/agent/adk/app_llm_agent.py +52 -0
  12. solace_agent_mesh/agent/adk/artifacts/__init__.py +1 -0
  13. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +171 -0
  14. solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +545 -0
  15. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +609 -0
  16. solace_agent_mesh/agent/adk/callbacks.py +2318 -0
  17. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +406 -0
  18. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +415 -0
  19. solace_agent_mesh/agent/adk/mcp_content_processor.py +666 -0
  20. solace_agent_mesh/agent/adk/models/lite_llm.py +1026 -0
  21. solace_agent_mesh/agent/adk/models/models_llm.txt +189 -0
  22. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +132 -0
  23. solace_agent_mesh/agent/adk/runner.py +390 -0
  24. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  25. solace_agent_mesh/agent/adk/services.py +468 -0
  26. solace_agent_mesh/agent/adk/setup.py +1325 -0
  27. solace_agent_mesh/agent/adk/stream_parser.py +415 -0
  28. solace_agent_mesh/agent/adk/tool_wrapper.py +165 -0
  29. solace_agent_mesh/agent/agent_llm.txt +369 -0
  30. solace_agent_mesh/agent/agent_llm_detail.txt +1702 -0
  31. solace_agent_mesh/agent/protocol/__init__.py +0 -0
  32. solace_agent_mesh/agent/protocol/event_handlers.py +2041 -0
  33. solace_agent_mesh/agent/protocol/protocol_llm.txt +81 -0
  34. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +92 -0
  35. solace_agent_mesh/agent/proxies/__init__.py +0 -0
  36. solace_agent_mesh/agent/proxies/a2a/__init__.py +3 -0
  37. solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +190 -0
  38. solace_agent_mesh/agent/proxies/a2a/app.py +56 -0
  39. solace_agent_mesh/agent/proxies/a2a/component.py +1585 -0
  40. solace_agent_mesh/agent/proxies/a2a/config.py +216 -0
  41. solace_agent_mesh/agent/proxies/a2a/oauth_token_cache.py +104 -0
  42. solace_agent_mesh/agent/proxies/base/__init__.py +3 -0
  43. solace_agent_mesh/agent/proxies/base/app.py +100 -0
  44. solace_agent_mesh/agent/proxies/base/base_llm.txt +148 -0
  45. solace_agent_mesh/agent/proxies/base/component.py +816 -0
  46. solace_agent_mesh/agent/proxies/base/config.py +85 -0
  47. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +19 -0
  48. solace_agent_mesh/agent/proxies/proxies_llm.txt +283 -0
  49. solace_agent_mesh/agent/sac/__init__.py +0 -0
  50. solace_agent_mesh/agent/sac/app.py +595 -0
  51. solace_agent_mesh/agent/sac/component.py +3668 -0
  52. solace_agent_mesh/agent/sac/patch_adk.py +103 -0
  53. solace_agent_mesh/agent/sac/sac_llm.txt +189 -0
  54. solace_agent_mesh/agent/sac/sac_llm_detail.txt +200 -0
  55. solace_agent_mesh/agent/sac/task_execution_context.py +415 -0
  56. solace_agent_mesh/agent/testing/__init__.py +3 -0
  57. solace_agent_mesh/agent/testing/debug_utils.py +135 -0
  58. solace_agent_mesh/agent/testing/testing_llm.txt +58 -0
  59. solace_agent_mesh/agent/testing/testing_llm_detail.txt +68 -0
  60. solace_agent_mesh/agent/tools/__init__.py +16 -0
  61. solace_agent_mesh/agent/tools/audio_tools.py +1740 -0
  62. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +2500 -0
  63. solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +244 -0
  64. solace_agent_mesh/agent/tools/dynamic_tool.py +396 -0
  65. solace_agent_mesh/agent/tools/general_agent_tools.py +572 -0
  66. solace_agent_mesh/agent/tools/image_tools.py +1185 -0
  67. solace_agent_mesh/agent/tools/peer_agent_tool.py +363 -0
  68. solace_agent_mesh/agent/tools/registry.py +38 -0
  69. solace_agent_mesh/agent/tools/test_tools.py +136 -0
  70. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  71. solace_agent_mesh/agent/tools/tool_config_types.py +93 -0
  72. solace_agent_mesh/agent/tools/tool_definition.py +53 -0
  73. solace_agent_mesh/agent/tools/tools_llm.txt +276 -0
  74. solace_agent_mesh/agent/tools/tools_llm_detail.txt +275 -0
  75. solace_agent_mesh/agent/tools/web_tools.py +392 -0
  76. solace_agent_mesh/agent/utils/__init__.py +0 -0
  77. solace_agent_mesh/agent/utils/artifact_helpers.py +1353 -0
  78. solace_agent_mesh/agent/utils/config_parser.py +49 -0
  79. solace_agent_mesh/agent/utils/context_helpers.py +77 -0
  80. solace_agent_mesh/agent/utils/utils_llm.txt +152 -0
  81. solace_agent_mesh/agent/utils/utils_llm_detail.txt +149 -0
  82. solace_agent_mesh/assets/docs/404.html +16 -0
  83. solace_agent_mesh/assets/docs/assets/css/styles.8162edfb.css +1 -0
  84. solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
  85. solace_agent_mesh/assets/docs/assets/images/sam-enterprise-credentials-b269f095349473118b2b33bdfcc40122.png +0 -0
  86. solace_agent_mesh/assets/docs/assets/js/032c2d61.f3d37824.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/0bcf40b7.c019ad46.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
  95. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
  96. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/2131ec11.5c7a1f6e.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  101. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js.LICENSE.txt +13 -0
  102. solace_agent_mesh/assets/docs/assets/js/2334.1cf50a20.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/240a0364.9ad94d1b.js +1 -0
  104. solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
  105. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +1 -0
  106. solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
  107. solace_agent_mesh/assets/docs/assets/js/341393d4.0fac2613.js +1 -0
  108. solace_agent_mesh/assets/docs/assets/js/3624.0eaa1fd0.js +1 -0
  109. solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
  110. solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
  111. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +1 -0
  112. solace_agent_mesh/assets/docs/assets/js/3ac1795d.28b7c67b.js +1 -0
  113. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2ddc75c0.js +1 -0
  114. solace_agent_mesh/assets/docs/assets/js/41adc471.48b12a4e.js +1 -0
  115. solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
  116. solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
  117. solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
  118. solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
  119. solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
  120. solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
  121. solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
  122. solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
  123. solace_agent_mesh/assets/docs/assets/js/509e993c.a1fbf45a.js +1 -0
  124. solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
  125. solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +1 -0
  126. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  127. solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
  128. solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
  129. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.90a87880.js +1 -0
  130. solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
  131. solace_agent_mesh/assets/docs/assets/js/6063ff4c.ef84f702.js +1 -0
  132. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  133. solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
  134. solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
  135. solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
  136. solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +1 -0
  137. solace_agent_mesh/assets/docs/assets/js/66d4869e.b77431fc.js +1 -0
  138. solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
  139. solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
  140. solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
  141. solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
  142. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  143. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
  144. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  145. solace_agent_mesh/assets/docs/assets/js/6fdfefc7.99de744e.js +1 -0
  146. solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
  147. solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
  148. solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
  149. solace_agent_mesh/assets/docs/assets/js/722f809d.965da774.js +1 -0
  150. solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
  151. solace_agent_mesh/assets/docs/assets/js/742f027b.46c07808.js +1 -0
  152. solace_agent_mesh/assets/docs/assets/js/77cf947d.48cb18a2.js +1 -0
  153. solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
  154. solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
  155. solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +1 -0
  156. solace_agent_mesh/assets/docs/assets/js/81a99df0.2484b8d9.js +1 -0
  157. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  158. solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
  159. solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
  160. solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
  161. solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
  162. solace_agent_mesh/assets/docs/assets/js/8591.5d015485.js +2 -0
  163. solace_agent_mesh/assets/docs/assets/js/8591.5d015485.js.LICENSE.txt +61 -0
  164. solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
  165. solace_agent_mesh/assets/docs/assets/js/8731.6c1dbf0c.js +1 -0
  166. solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
  167. solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
  168. solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
  169. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  170. solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
  171. solace_agent_mesh/assets/docs/assets/js/945fb41e.6f4cdffd.js +1 -0
  172. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  173. solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
  174. solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
  175. solace_agent_mesh/assets/docs/assets/js/9bb13469.b2333011.js +1 -0
  176. solace_agent_mesh/assets/docs/assets/js/9e9d0a82.570c057b.js +1 -0
  177. solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
  178. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  179. solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +1 -0
  180. solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
  181. solace_agent_mesh/assets/docs/assets/js/ad71b5ed.af3ecfd1.js +1 -0
  182. solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
  183. solace_agent_mesh/assets/docs/assets/js/c198a0dc.8f31f867.js +1 -0
  184. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  185. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  186. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  187. solace_agent_mesh/assets/docs/assets/js/ceb2a7a6.5d92d7d0.js +1 -0
  188. solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
  189. solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +1 -0
  190. solace_agent_mesh/assets/docs/assets/js/db924877.e98d12a1.js +1 -0
  191. solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
  192. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
  193. solace_agent_mesh/assets/docs/assets/js/de5f4c65.e8241890.js +1 -0
  194. solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
  195. solace_agent_mesh/assets/docs/assets/js/e04b235d.52cb25ed.js +1 -0
  196. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.b1068f9b.js +1 -0
  197. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  198. solace_agent_mesh/assets/docs/assets/js/e6f9706b.4488e34c.js +1 -0
  199. solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +1 -0
  200. solace_agent_mesh/assets/docs/assets/js/f284c35a.250993bf.js +1 -0
  201. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
  202. solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js +2 -0
  203. solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js.LICENSE.txt +81 -0
  204. solace_agent_mesh/assets/docs/assets/js/runtime~main.9e0813a2.js +1 -0
  205. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +154 -0
  206. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +99 -0
  207. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +90 -0
  208. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +107 -0
  209. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +166 -0
  210. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +101 -0
  211. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +219 -0
  212. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +92 -0
  213. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +29 -0
  214. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +55 -0
  215. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +110 -0
  216. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
  217. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  218. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +345 -0
  219. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  220. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +83 -0
  221. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +84 -0
  222. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +25 -0
  223. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +47 -0
  224. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +85 -0
  225. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +60 -0
  226. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  227. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +144 -0
  228. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +191 -0
  229. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +128 -0
  230. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +54 -0
  231. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +135 -0
  232. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +34 -0
  233. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +55 -0
  234. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +267 -0
  235. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +142 -0
  236. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +116 -0
  237. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +86 -0
  238. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +164 -0
  239. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +140 -0
  240. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +57 -0
  241. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +72 -0
  242. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +102 -0
  243. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  244. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
  245. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
  246. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +37 -0
  247. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +86 -0
  248. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  249. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +247 -0
  250. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
  251. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +184 -0
  252. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
  253. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +75 -0
  254. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +54 -0
  255. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +85 -0
  256. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +41 -0
  257. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +290 -0
  258. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +78 -0
  259. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +25 -0
  260. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +78 -0
  261. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +160 -0
  262. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +142 -0
  263. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
  264. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
  265. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +100 -0
  266. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +52 -0
  267. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
  268. solace_agent_mesh/assets/docs/img/logo.png +0 -0
  269. solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
  270. solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
  271. solace_agent_mesh/assets/docs/img/sam-enterprise-credentials.png +0 -0
  272. solace_agent_mesh/assets/docs/img/solace-logo-text.svg +18 -0
  273. solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
  274. solace_agent_mesh/assets/docs/lunr-index-1765810064709.json +1 -0
  275. solace_agent_mesh/assets/docs/lunr-index.json +1 -0
  276. solace_agent_mesh/assets/docs/search-doc-1765810064709.json +1 -0
  277. solace_agent_mesh/assets/docs/search-doc.json +1 -0
  278. solace_agent_mesh/assets/docs/sitemap.xml +1 -0
  279. solace_agent_mesh/cli/__init__.py +1 -0
  280. solace_agent_mesh/cli/commands/__init__.py +0 -0
  281. solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
  282. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
  283. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +729 -0
  284. solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
  285. solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +102 -0
  286. solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +114 -0
  287. solace_agent_mesh/cli/commands/docs_cmd.py +60 -0
  288. solace_agent_mesh/cli/commands/eval_cmd.py +46 -0
  289. solace_agent_mesh/cli/commands/init_cmd/__init__.py +439 -0
  290. solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
  291. solace_agent_mesh/cli/commands/init_cmd/database_step.py +91 -0
  292. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
  293. solace_agent_mesh/cli/commands/init_cmd/env_step.py +238 -0
  294. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
  295. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +464 -0
  296. solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
  297. solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +119 -0
  298. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +215 -0
  299. solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +20 -0
  300. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +137 -0
  301. solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
  302. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +144 -0
  303. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +306 -0
  304. solace_agent_mesh/cli/commands/plugin_cmd/install_cmd.py +283 -0
  305. solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +175 -0
  306. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
  307. solace_agent_mesh/cli/commands/run_cmd.py +215 -0
  308. solace_agent_mesh/cli/main.py +52 -0
  309. solace_agent_mesh/cli/utils.py +262 -0
  310. solace_agent_mesh/client/webui/frontend/static/assets/authCallback-Dj3JtK42.js +1 -0
  311. solace_agent_mesh/client/webui/frontend/static/assets/client-ZKk9kEJ5.js +25 -0
  312. solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
  313. solace_agent_mesh/client/webui/frontend/static/assets/main-BcUaNZ-Q.css +1 -0
  314. solace_agent_mesh/client/webui/frontend/static/assets/main-vjch4RYc.js +435 -0
  315. solace_agent_mesh/client/webui/frontend/static/assets/vendor-BNV4kZN0.js +535 -0
  316. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +15 -0
  317. solace_agent_mesh/client/webui/frontend/static/index.html +16 -0
  318. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  319. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  320. solace_agent_mesh/common/__init__.py +1 -0
  321. solace_agent_mesh/common/a2a/__init__.py +241 -0
  322. solace_agent_mesh/common/a2a/a2a_llm.txt +175 -0
  323. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +193 -0
  324. solace_agent_mesh/common/a2a/artifact.py +368 -0
  325. solace_agent_mesh/common/a2a/events.py +213 -0
  326. solace_agent_mesh/common/a2a/message.py +375 -0
  327. solace_agent_mesh/common/a2a/protocol.py +689 -0
  328. solace_agent_mesh/common/a2a/task.py +127 -0
  329. solace_agent_mesh/common/a2a/translation.py +655 -0
  330. solace_agent_mesh/common/a2a/types.py +55 -0
  331. solace_agent_mesh/common/a2a_spec/a2a.json +2576 -0
  332. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +445 -0
  333. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +736 -0
  334. solace_agent_mesh/common/a2a_spec/schemas/agent_progress_update.json +18 -0
  335. solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +48 -0
  336. solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
  337. solace_agent_mesh/common/a2a_spec/schemas/llm_invocation.json +41 -0
  338. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +330 -0
  339. solace_agent_mesh/common/a2a_spec/schemas/tool_invocation_start.json +26 -0
  340. solace_agent_mesh/common/a2a_spec/schemas/tool_result.json +48 -0
  341. solace_agent_mesh/common/agent_registry.py +122 -0
  342. solace_agent_mesh/common/common_llm.txt +230 -0
  343. solace_agent_mesh/common/common_llm_detail.txt +2562 -0
  344. solace_agent_mesh/common/constants.py +6 -0
  345. solace_agent_mesh/common/data_parts.py +150 -0
  346. solace_agent_mesh/common/exceptions.py +49 -0
  347. solace_agent_mesh/common/middleware/__init__.py +12 -0
  348. solace_agent_mesh/common/middleware/config_resolver.py +132 -0
  349. solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
  350. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +185 -0
  351. solace_agent_mesh/common/middleware/registry.py +127 -0
  352. solace_agent_mesh/common/oauth/__init__.py +17 -0
  353. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  354. solace_agent_mesh/common/oauth/utils.py +50 -0
  355. solace_agent_mesh/common/sac/__init__.py +0 -0
  356. solace_agent_mesh/common/sac/sac_llm.txt +71 -0
  357. solace_agent_mesh/common/sac/sac_llm_detail.txt +82 -0
  358. solace_agent_mesh/common/sac/sam_component_base.py +730 -0
  359. solace_agent_mesh/common/sam_events/__init__.py +9 -0
  360. solace_agent_mesh/common/sam_events/event_service.py +208 -0
  361. solace_agent_mesh/common/sam_events/sam_events_llm.txt +104 -0
  362. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +115 -0
  363. solace_agent_mesh/common/services/__init__.py +4 -0
  364. solace_agent_mesh/common/services/employee_service.py +164 -0
  365. solace_agent_mesh/common/services/identity_service.py +134 -0
  366. solace_agent_mesh/common/services/providers/__init__.py +4 -0
  367. solace_agent_mesh/common/services/providers/local_file_identity_service.py +151 -0
  368. solace_agent_mesh/common/services/providers/providers_llm.txt +81 -0
  369. solace_agent_mesh/common/services/services_llm.txt +368 -0
  370. solace_agent_mesh/common/services/services_llm_detail.txt +459 -0
  371. solace_agent_mesh/common/utils/__init__.py +7 -0
  372. solace_agent_mesh/common/utils/artifact_utils.py +31 -0
  373. solace_agent_mesh/common/utils/asyncio_macos_fix.py +88 -0
  374. solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
  375. solace_agent_mesh/common/utils/embeds/constants.py +56 -0
  376. solace_agent_mesh/common/utils/embeds/converter.py +447 -0
  377. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +220 -0
  378. solace_agent_mesh/common/utils/embeds/evaluators.py +395 -0
  379. solace_agent_mesh/common/utils/embeds/modifiers.py +793 -0
  380. solace_agent_mesh/common/utils/embeds/resolver.py +967 -0
  381. solace_agent_mesh/common/utils/embeds/types.py +23 -0
  382. solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
  383. solace_agent_mesh/common/utils/initializer.py +52 -0
  384. solace_agent_mesh/common/utils/log_formatters.py +64 -0
  385. solace_agent_mesh/common/utils/message_utils.py +80 -0
  386. solace_agent_mesh/common/utils/mime_helpers.py +172 -0
  387. solace_agent_mesh/common/utils/push_notification_auth.py +135 -0
  388. solace_agent_mesh/common/utils/pydantic_utils.py +159 -0
  389. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  390. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  391. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  392. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  393. solace_agent_mesh/common/utils/type_utils.py +28 -0
  394. solace_agent_mesh/common/utils/utils_llm.txt +335 -0
  395. solace_agent_mesh/common/utils/utils_llm_detail.txt +572 -0
  396. solace_agent_mesh/config_portal/__init__.py +0 -0
  397. solace_agent_mesh/config_portal/backend/__init__.py +0 -0
  398. solace_agent_mesh/config_portal/backend/common.py +77 -0
  399. solace_agent_mesh/config_portal/backend/plugin_catalog/__init__.py +0 -0
  400. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +24 -0
  401. solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
  402. solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +166 -0
  403. solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +521 -0
  404. solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +217 -0
  405. solace_agent_mesh/config_portal/backend/server.py +644 -0
  406. solace_agent_mesh/config_portal/frontend/static/client/Solace_community_logo.png +0 -0
  407. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DiOiAjzL.js +103 -0
  408. solace_agent_mesh/config_portal/frontend/static/client/assets/components-Rk0n-9cK.js +140 -0
  409. solace_agent_mesh/config_portal/frontend/static/client/assets/entry.client-mvZjNKiz.js +19 -0
  410. solace_agent_mesh/config_portal/frontend/static/client/assets/index-DzNKzXrc.js +68 -0
  411. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-ba77705e.js +1 -0
  412. solace_agent_mesh/config_portal/frontend/static/client/assets/root-B17tZKK7.css +1 -0
  413. solace_agent_mesh/config_portal/frontend/static/client/assets/root-V2BeTIUc.js +10 -0
  414. solace_agent_mesh/config_portal/frontend/static/client/favicon.ico +0 -0
  415. solace_agent_mesh/config_portal/frontend/static/client/index.html +7 -0
  416. solace_agent_mesh/core_a2a/__init__.py +1 -0
  417. solace_agent_mesh/core_a2a/core_a2a_llm.txt +90 -0
  418. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +101 -0
  419. solace_agent_mesh/core_a2a/service.py +307 -0
  420. solace_agent_mesh/evaluation/__init__.py +0 -0
  421. solace_agent_mesh/evaluation/evaluator.py +691 -0
  422. solace_agent_mesh/evaluation/message_organizer.py +553 -0
  423. solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
  424. solace_agent_mesh/evaluation/report/chart_section.html +141 -0
  425. solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
  426. solace_agent_mesh/evaluation/report/modal.html +59 -0
  427. solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
  428. solace_agent_mesh/evaluation/report/modal_script.js +296 -0
  429. solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
  430. solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
  431. solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
  432. solace_agent_mesh/evaluation/report/templates/header.html +340 -0
  433. solace_agent_mesh/evaluation/report_data_processor.py +970 -0
  434. solace_agent_mesh/evaluation/report_generator.py +607 -0
  435. solace_agent_mesh/evaluation/run.py +954 -0
  436. solace_agent_mesh/evaluation/shared/__init__.py +92 -0
  437. solace_agent_mesh/evaluation/shared/constants.py +47 -0
  438. solace_agent_mesh/evaluation/shared/exceptions.py +50 -0
  439. solace_agent_mesh/evaluation/shared/helpers.py +35 -0
  440. solace_agent_mesh/evaluation/shared/test_case_loader.py +167 -0
  441. solace_agent_mesh/evaluation/shared/test_suite_loader.py +280 -0
  442. solace_agent_mesh/evaluation/subscriber.py +776 -0
  443. solace_agent_mesh/evaluation/summary_builder.py +880 -0
  444. solace_agent_mesh/gateway/__init__.py +0 -0
  445. solace_agent_mesh/gateway/adapter/__init__.py +1 -0
  446. solace_agent_mesh/gateway/adapter/base.py +143 -0
  447. solace_agent_mesh/gateway/adapter/types.py +221 -0
  448. solace_agent_mesh/gateway/base/__init__.py +1 -0
  449. solace_agent_mesh/gateway/base/app.py +345 -0
  450. solace_agent_mesh/gateway/base/base_llm.txt +226 -0
  451. solace_agent_mesh/gateway/base/base_llm_detail.txt +235 -0
  452. solace_agent_mesh/gateway/base/component.py +2030 -0
  453. solace_agent_mesh/gateway/base/task_context.py +75 -0
  454. solace_agent_mesh/gateway/gateway_llm.txt +369 -0
  455. solace_agent_mesh/gateway/gateway_llm_detail.txt +3885 -0
  456. solace_agent_mesh/gateway/generic/__init__.py +1 -0
  457. solace_agent_mesh/gateway/generic/app.py +50 -0
  458. solace_agent_mesh/gateway/generic/component.py +727 -0
  459. solace_agent_mesh/gateway/http_sse/__init__.py +0 -0
  460. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +345 -0
  461. solace_agent_mesh/gateway/http_sse/alembic/env.py +87 -0
  462. solace_agent_mesh/gateway/http_sse/alembic/script.py.mako +28 -0
  463. solace_agent_mesh/gateway/http_sse/alembic/versions/20250910_d5b3f8f2e9a0_create_initial_database.py +58 -0
  464. solace_agent_mesh/gateway/http_sse/alembic/versions/20250911_b1c2d3e4f5g6_add_database_indexes.py +83 -0
  465. solace_agent_mesh/gateway/http_sse/alembic/versions/20250916_f6e7d8c9b0a1_convert_timestamps_to_epoch_and_align_columns.py +412 -0
  466. solace_agent_mesh/gateway/http_sse/alembic/versions/20251006_98882922fa59_add_tasks_events_feedback_chat_tasks.py +190 -0
  467. solace_agent_mesh/gateway/http_sse/alembic/versions/20251015_add_session_performance_indexes.py +70 -0
  468. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
  469. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
  470. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
  471. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
  472. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  473. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  474. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  475. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  476. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +161 -0
  477. solace_agent_mesh/gateway/http_sse/alembic.ini +109 -0
  478. solace_agent_mesh/gateway/http_sse/app.py +351 -0
  479. solace_agent_mesh/gateway/http_sse/component.py +2360 -0
  480. solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
  481. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +105 -0
  482. solace_agent_mesh/gateway/http_sse/components/task_logger_forwarder.py +109 -0
  483. solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +110 -0
  484. solace_agent_mesh/gateway/http_sse/dependencies.py +653 -0
  485. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +299 -0
  486. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +3278 -0
  487. solace_agent_mesh/gateway/http_sse/main.py +789 -0
  488. solace_agent_mesh/gateway/http_sse/repository/__init__.py +46 -0
  489. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +102 -0
  490. solace_agent_mesh/gateway/http_sse/repository/entities/__init__.py +11 -0
  491. solace_agent_mesh/gateway/http_sse/repository/entities/chat_task.py +75 -0
  492. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +221 -0
  493. solace_agent_mesh/gateway/http_sse/repository/entities/feedback.py +20 -0
  494. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
  495. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
  496. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +66 -0
  497. solace_agent_mesh/gateway/http_sse/repository/entities/session_history.py +0 -0
  498. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +32 -0
  499. solace_agent_mesh/gateway/http_sse/repository/entities/task_event.py +21 -0
  500. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +125 -0
  501. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +239 -0
  502. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +34 -0
  503. solace_agent_mesh/gateway/http_sse/repository/models/base.py +7 -0
  504. solace_agent_mesh/gateway/http_sse/repository/models/chat_task_model.py +31 -0
  505. solace_agent_mesh/gateway/http_sse/repository/models/feedback_model.py +21 -0
  506. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +257 -0
  507. solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
  508. solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
  509. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  510. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +53 -0
  511. solace_agent_mesh/gateway/http_sse/repository/models/task_event_model.py +25 -0
  512. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +39 -0
  513. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
  514. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
  515. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +308 -0
  516. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +268 -0
  517. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +248 -0
  518. solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
  519. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +74 -0
  520. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +1137 -0
  521. solace_agent_mesh/gateway/http_sse/routers/auth.py +311 -0
  522. solace_agent_mesh/gateway/http_sse/routers/config.py +371 -0
  523. solace_agent_mesh/gateway/http_sse/routers/dto/__init__.py +10 -0
  524. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +450 -0
  525. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  526. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  527. solace_agent_mesh/gateway/http_sse/routers/dto/requests/__init__.py +15 -0
  528. solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
  529. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +133 -0
  530. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +33 -0
  531. solace_agent_mesh/gateway/http_sse/routers/dto/requests/task_requests.py +58 -0
  532. solace_agent_mesh/gateway/http_sse/routers/dto/responses/__init__.py +18 -0
  533. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +42 -0
  534. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
  535. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +123 -0
  536. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +33 -0
  537. solace_agent_mesh/gateway/http_sse/routers/dto/responses/task_responses.py +30 -0
  538. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  539. solace_agent_mesh/gateway/http_sse/routers/feedback.py +168 -0
  540. solace_agent_mesh/gateway/http_sse/routers/people.py +38 -0
  541. solace_agent_mesh/gateway/http_sse/routers/projects.py +767 -0
  542. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1415 -0
  543. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +312 -0
  544. solace_agent_mesh/gateway/http_sse/routers/sessions.py +634 -0
  545. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  546. solace_agent_mesh/gateway/http_sse/routers/sse.py +230 -0
  547. solace_agent_mesh/gateway/http_sse/routers/tasks.py +1089 -0
  548. solace_agent_mesh/gateway/http_sse/routers/users.py +83 -0
  549. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  550. solace_agent_mesh/gateway/http_sse/routers/visualization.py +1220 -0
  551. solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
  552. solace_agent_mesh/gateway/http_sse/services/agent_card_service.py +71 -0
  553. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  554. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  555. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +273 -0
  556. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +250 -0
  557. solace_agent_mesh/gateway/http_sse/services/people_service.py +78 -0
  558. solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
  559. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  560. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +303 -0
  561. solace_agent_mesh/gateway/http_sse/services/session_service.py +702 -0
  562. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +593 -0
  563. solace_agent_mesh/gateway/http_sse/services/task_service.py +119 -0
  564. solace_agent_mesh/gateway/http_sse/session_manager.py +219 -0
  565. solace_agent_mesh/gateway/http_sse/shared/__init__.py +146 -0
  566. solace_agent_mesh/gateway/http_sse/shared/auth_utils.py +29 -0
  567. solace_agent_mesh/gateway/http_sse/shared/base_repository.py +252 -0
  568. solace_agent_mesh/gateway/http_sse/shared/database_exceptions.py +274 -0
  569. solace_agent_mesh/gateway/http_sse/shared/database_helpers.py +43 -0
  570. solace_agent_mesh/gateway/http_sse/shared/enums.py +40 -0
  571. solace_agent_mesh/gateway/http_sse/shared/error_dto.py +107 -0
  572. solace_agent_mesh/gateway/http_sse/shared/exception_handlers.py +217 -0
  573. solace_agent_mesh/gateway/http_sse/shared/exceptions.py +192 -0
  574. solace_agent_mesh/gateway/http_sse/shared/pagination.py +138 -0
  575. solace_agent_mesh/gateway/http_sse/shared/response_utils.py +134 -0
  576. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +319 -0
  577. solace_agent_mesh/gateway/http_sse/shared/timestamp_utils.py +97 -0
  578. solace_agent_mesh/gateway/http_sse/shared/types.py +50 -0
  579. solace_agent_mesh/gateway/http_sse/shared/utils.py +22 -0
  580. solace_agent_mesh/gateway/http_sse/sse_event_buffer.py +88 -0
  581. solace_agent_mesh/gateway/http_sse/sse_manager.py +491 -0
  582. solace_agent_mesh/gateway/http_sse/utils/__init__.py +1 -0
  583. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  584. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +72 -0
  585. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +47 -0
  586. solace_agent_mesh/llm.txt +228 -0
  587. solace_agent_mesh/llm_detail.txt +2835 -0
  588. solace_agent_mesh/services/__init__.py +0 -0
  589. solace_agent_mesh/services/platform/__init__.py +18 -0
  590. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  591. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  592. solace_agent_mesh/services/platform/alembic.ini +109 -0
  593. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  594. solace_agent_mesh/services/platform/api/dependencies.py +147 -0
  595. solace_agent_mesh/services/platform/api/main.py +280 -0
  596. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  597. solace_agent_mesh/services/platform/api/routers/__init__.py +24 -0
  598. solace_agent_mesh/services/platform/app.py +114 -0
  599. solace_agent_mesh/services/platform/component.py +235 -0
  600. solace_agent_mesh/solace_agent_mesh_llm.txt +362 -0
  601. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +8599 -0
  602. solace_agent_mesh/templates/agent_template.yaml +53 -0
  603. solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
  604. solace_agent_mesh/templates/gateway_app_template.py +75 -0
  605. solace_agent_mesh/templates/gateway_component_template.py +484 -0
  606. solace_agent_mesh/templates/gateway_config_template.yaml +38 -0
  607. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  608. solace_agent_mesh/templates/main_orchestrator.yaml +66 -0
  609. solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
  610. solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
  611. solace_agent_mesh/templates/plugin_custom_template.py +10 -0
  612. solace_agent_mesh/templates/plugin_gateway_config_template.yaml +60 -0
  613. solace_agent_mesh/templates/plugin_pyproject_template.toml +32 -0
  614. solace_agent_mesh/templates/plugin_readme_template.md +12 -0
  615. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  616. solace_agent_mesh/templates/plugin_tools_template.py +224 -0
  617. solace_agent_mesh/templates/shared_config.yaml +112 -0
  618. solace_agent_mesh/templates/templates_llm.txt +147 -0
  619. solace_agent_mesh/templates/webui.yaml +177 -0
  620. solace_agent_mesh-1.11.2.dist-info/METADATA +504 -0
  621. solace_agent_mesh-1.11.2.dist-info/RECORD +624 -0
  622. solace_agent_mesh-1.11.2.dist-info/WHEEL +4 -0
  623. solace_agent_mesh-1.11.2.dist-info/entry_points.txt +3 -0
  624. solace_agent_mesh-1.11.2.dist-info/licenses/LICENSE +201 -0
@@ -0,0 +1,789 @@
1
+ import logging
2
+ import os
3
+ from pathlib import Path
4
+
5
+ import httpx
6
+ import sqlalchemy as sa
7
+ from fastapi import FastAPI, HTTPException
8
+ from fastapi import Request as FastAPIRequest
9
+ from fastapi import status
10
+ from typing import TYPE_CHECKING
11
+
12
+ import sqlalchemy as sa
13
+ from a2a.types import InternalError, JSONRPCError
14
+ from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
15
+ from alembic import command
16
+ from alembic.config import Config
17
+ from fastapi import FastAPI, HTTPException
18
+ from fastapi import Request as FastAPIRequest
19
+ from fastapi import status
20
+ from fastapi.exceptions import RequestValidationError
21
+ from fastapi.middleware.cors import CORSMiddleware
22
+ from fastapi.responses import JSONResponse
23
+ from starlette.middleware.sessions import SessionMiddleware
24
+ from starlette.staticfiles import StaticFiles
25
+
26
+ from .routers.sessions import router as session_router
27
+ from .routers.tasks import router as task_router
28
+ from .routers.users import router as user_router
29
+ from ...common import a2a
30
+ from ...gateway.http_sse import dependencies
31
+ from .routers import (
32
+ agent_cards,
33
+ artifacts,
34
+ auth,
35
+ config,
36
+ feedback,
37
+ people,
38
+ sse,
39
+ speech,
40
+ version,
41
+ visualization,
42
+ projects,
43
+ prompts,
44
+ )
45
+ from .routers.sessions import router as session_router
46
+ from .routers.tasks import router as task_router
47
+ from .routers.users import router as user_router
48
+
49
+ from alembic import command
50
+ from alembic.config import Config
51
+
52
+ from a2a.types import InternalError, InvalidRequestError, JSONRPCError
53
+ from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
54
+ from ...common import a2a
55
+ from ...gateway.http_sse import dependencies
56
+
57
+
58
+ if TYPE_CHECKING:
59
+ from gateway.http_sse.component import WebUIBackendComponent
60
+
61
+ log = logging.getLogger(__name__)
62
+
63
+ app = FastAPI(
64
+ title="A2A Web UI Backend",
65
+ version="1.0.0", # Updated to reflect simplified architecture
66
+ description="Backend API and SSE server for the A2A Web UI, hosted by Solace AI Connector.",
67
+ )
68
+
69
+ # Global flag to track if dependencies have been initialized
70
+ _dependencies_initialized = False
71
+
72
+
73
+ def _extract_access_token(request: FastAPIRequest) -> str:
74
+ auth_header = request.headers.get("Authorization")
75
+ if auth_header and auth_header.startswith("Bearer "):
76
+ return auth_header[7:]
77
+
78
+ try:
79
+ if "access_token" in request.session:
80
+ log.debug("AuthMiddleware: Found token in session.")
81
+ return request.session["access_token"]
82
+ except AssertionError:
83
+ log.debug("AuthMiddleware: Could not access request.session.")
84
+
85
+ if "token" in request.query_params:
86
+ return request.query_params["token"]
87
+
88
+ return None
89
+
90
+
91
+ async def _validate_token(
92
+ auth_service_url: str, auth_provider: str, access_token: str
93
+ ) -> bool:
94
+ async with httpx.AsyncClient() as client:
95
+ validation_response = await client.post(
96
+ f"{auth_service_url}/is_token_valid",
97
+ json={"provider": auth_provider},
98
+ headers={"Authorization": f"Bearer {access_token}"},
99
+ )
100
+ return validation_response.status_code == 200
101
+
102
+
103
+ async def _get_user_info(
104
+ auth_service_url: str, auth_provider: str, access_token: str
105
+ ) -> dict:
106
+ async with httpx.AsyncClient() as client:
107
+ userinfo_response = await client.get(
108
+ f"{auth_service_url}/user_info?provider={auth_provider}",
109
+ headers={"Authorization": f"Bearer {access_token}"},
110
+ )
111
+
112
+ if userinfo_response.status_code != 200:
113
+ return None
114
+
115
+ return userinfo_response.json()
116
+
117
+
118
+ def _extract_user_identifier(user_info: dict) -> str:
119
+ user_identifier = (
120
+ user_info.get("sub")
121
+ or user_info.get("client_id")
122
+ or user_info.get("username")
123
+ or user_info.get("oid")
124
+ or user_info.get("preferred_username")
125
+ or user_info.get("upn")
126
+ or user_info.get("unique_name")
127
+ or user_info.get("email")
128
+ or user_info.get("name")
129
+ or user_info.get("azp")
130
+ or user_info.get("user_id") # internal /user_info endpoint format maps identifier to user_id
131
+ )
132
+
133
+ if user_identifier and user_identifier.lower() == "unknown":
134
+ log.warning(
135
+ "AuthMiddleware: IDP returned 'Unknown' as user identifier. Using fallback."
136
+ )
137
+ return "sam_dev_user"
138
+
139
+ return user_identifier
140
+
141
+
142
+ def _extract_user_details(user_info: dict, user_identifier: str) -> tuple:
143
+ email_from_auth = (
144
+ user_info.get("email")
145
+ or user_info.get("preferred_username")
146
+ or user_info.get("upn")
147
+ or user_identifier
148
+ )
149
+
150
+ display_name = (
151
+ user_info.get("name")
152
+ or user_info.get("given_name", "") + " " + user_info.get("family_name", "")
153
+ or user_info.get("preferred_username")
154
+ or user_identifier
155
+ ).strip()
156
+
157
+ return email_from_auth, display_name
158
+
159
+
160
+ async def _create_user_state_without_identity_service(
161
+ user_identifier: str, email_from_auth: str, display_name: str
162
+ ) -> dict:
163
+ final_user_id = user_identifier or email_from_auth or "sam_dev_user"
164
+ if not final_user_id or final_user_id.lower() in ["unknown", "null", "none", ""]:
165
+ final_user_id = "sam_dev_user"
166
+ log.warning(
167
+ "AuthMiddleware: Had to use fallback user ID due to invalid identifier: %s",
168
+ user_identifier,
169
+ )
170
+
171
+ log.debug(
172
+ "AuthMiddleware: Internal IdentityService not configured on component. Using user ID: %s",
173
+ final_user_id,
174
+ )
175
+ return {
176
+ "id": final_user_id,
177
+ "email": email_from_auth or final_user_id,
178
+ "name": display_name or final_user_id,
179
+ "authenticated": True,
180
+ "auth_method": "oidc",
181
+ }
182
+
183
+
184
+ async def _create_user_state_with_identity_service(
185
+ identity_service,
186
+ user_identifier: str,
187
+ email_from_auth: str,
188
+ display_name: str,
189
+ user_info: dict,
190
+ ) -> dict:
191
+ lookup_value = email_from_auth if "@" in email_from_auth else user_identifier
192
+ user_profile = await identity_service.get_user_profile(
193
+ {identity_service.lookup_key: lookup_value, "user_info": user_info}
194
+ )
195
+
196
+ if not user_profile:
197
+ return None
198
+
199
+ user_state = user_profile.copy()
200
+ if not user_state.get("id"):
201
+ user_state["id"] = user_identifier
202
+ if not user_state.get("email"):
203
+ user_state["email"] = email_from_auth
204
+ if not user_state.get("name"):
205
+ user_state["name"] = display_name
206
+ user_state["authenticated"] = True
207
+ user_state["auth_method"] = "oidc"
208
+
209
+ return user_state
210
+
211
+
212
+ def _create_auth_middleware(component):
213
+ class AuthMiddleware:
214
+ def __init__(self, app, component):
215
+ self.app = app
216
+ self.component = component
217
+
218
+ async def __call__(self, scope, receive, send):
219
+ if scope["type"] != "http":
220
+ await self.app(scope, receive, send)
221
+ return
222
+
223
+ request = FastAPIRequest(scope, receive)
224
+
225
+ if not request.url.path.startswith("/api"):
226
+ await self.app(scope, receive, send)
227
+ return
228
+
229
+ skip_paths = [
230
+ "/api/v1/config",
231
+ "/api/v1/auth/callback",
232
+ "/api/v1/auth/tool/callback",
233
+ "/api/v1/auth/login",
234
+ "/api/v1/auth/refresh",
235
+ "/api/v1/csrf-token",
236
+ "/health",
237
+ ]
238
+
239
+ if any(request.url.path.startswith(path) for path in skip_paths):
240
+ await self.app(scope, receive, send)
241
+ return
242
+
243
+ use_auth = dependencies.api_config and dependencies.api_config.get(
244
+ "frontend_use_authorization"
245
+ )
246
+
247
+ if use_auth:
248
+ await self._handle_authenticated_request(request, scope, receive, send)
249
+ else:
250
+ request.state.user = {
251
+ "id": "sam_dev_user",
252
+ "name": "Sam Dev User",
253
+ "email": "sam@dev.local",
254
+ "authenticated": True,
255
+ "auth_method": "development",
256
+ }
257
+ log.debug(
258
+ "AuthMiddleware: Set development user state with id: sam_dev_user"
259
+ )
260
+
261
+ await self.app(scope, receive, send)
262
+
263
+ async def _handle_authenticated_request(self, request, scope, receive, send):
264
+ access_token = _extract_access_token(request)
265
+
266
+ if not access_token:
267
+ log.warning("AuthMiddleware: No access token found. Returning 401.")
268
+ response = JSONResponse(
269
+ status_code=status.HTTP_401_UNAUTHORIZED,
270
+ content={
271
+ "detail": "Not authenticated",
272
+ "error_type": "authentication_required",
273
+ },
274
+ )
275
+ await response(scope, receive, send)
276
+ return
277
+
278
+ try:
279
+ auth_service_url = dependencies.api_config.get(
280
+ "external_auth_service_url"
281
+ )
282
+ auth_provider = dependencies.api_config.get("external_auth_provider")
283
+
284
+ if not auth_service_url:
285
+ log.error("Auth service URL not configured.")
286
+ response = JSONResponse(
287
+ status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
288
+ content={"detail": "Auth service not configured"},
289
+ )
290
+ await response(scope, receive, send)
291
+ return
292
+
293
+ if not await _validate_token(
294
+ auth_service_url, auth_provider, access_token
295
+ ):
296
+ log.warning("AuthMiddleware: Token validation failed")
297
+ response = JSONResponse(
298
+ status_code=status.HTTP_401_UNAUTHORIZED,
299
+ content={
300
+ "detail": "Invalid token",
301
+ "error_type": "invalid_token",
302
+ },
303
+ )
304
+ await response(scope, receive, send)
305
+ return
306
+
307
+ user_info = await _get_user_info(
308
+ auth_service_url, auth_provider, access_token
309
+ )
310
+ if not user_info:
311
+ log.warning(
312
+ "AuthMiddleware: Failed to get user info from external auth service"
313
+ )
314
+ response = JSONResponse(
315
+ status_code=status.HTTP_401_UNAUTHORIZED,
316
+ content={
317
+ "detail": "Could not retrieve user info from auth provider",
318
+ "error_type": "user_info_failed",
319
+ },
320
+ )
321
+ await response(scope, receive, send)
322
+ return
323
+
324
+ user_identifier = _extract_user_identifier(user_info)
325
+ if not user_identifier or user_identifier.lower() in [
326
+ "null",
327
+ "none",
328
+ "",
329
+ ]:
330
+ log.error(
331
+ "AuthMiddleware: No valid user identifier from OAuth provider"
332
+ )
333
+ response = JSONResponse(
334
+ status_code=status.HTTP_401_UNAUTHORIZED,
335
+ content={
336
+ "detail": "OAuth provider returned no valid user identifier",
337
+ "error_type": "invalid_user_identifier_from_provider",
338
+ },
339
+ )
340
+ await response(scope, receive, send)
341
+ return
342
+
343
+ email_from_auth, display_name = _extract_user_details(
344
+ user_info, user_identifier
345
+ )
346
+
347
+ identity_service = self.component.identity_service
348
+ if not identity_service:
349
+ request.state.user = (
350
+ await _create_user_state_without_identity_service(
351
+ user_identifier, email_from_auth, display_name
352
+ )
353
+ )
354
+ else:
355
+ user_state = await _create_user_state_with_identity_service(
356
+ identity_service,
357
+ user_identifier,
358
+ email_from_auth,
359
+ display_name,
360
+ user_info,
361
+ )
362
+ if not user_state:
363
+ log.error(
364
+ "AuthMiddleware: User authenticated but not found in internal IdentityService"
365
+ )
366
+ response = JSONResponse(
367
+ status_code=status.HTTP_403_FORBIDDEN,
368
+ content={
369
+ "detail": "User not authorized for this application",
370
+ "error_type": "not_authorized",
371
+ },
372
+ )
373
+ await response(scope, receive, send)
374
+ return
375
+ request.state.user = user_state
376
+
377
+ except httpx.RequestError as exc:
378
+ log.error("Error calling auth service: %s", exc)
379
+ response = JSONResponse(
380
+ status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
381
+ content={"detail": "Auth service is unavailable"},
382
+ )
383
+ await response(scope, receive, send)
384
+ return
385
+ except Exception as exc:
386
+ log.error(
387
+ "An unexpected error occurred during token validation: %s", exc
388
+ )
389
+ response = JSONResponse(
390
+ status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
391
+ content={
392
+ "detail": "An internal error occurred during authentication"
393
+ },
394
+ )
395
+ await response(scope, receive, send)
396
+ return
397
+
398
+ return AuthMiddleware
399
+
400
+
401
+ def _setup_alembic_config(database_url: str) -> Config:
402
+ alembic_cfg = Config()
403
+ alembic_cfg.set_main_option(
404
+ "script_location",
405
+ os.path.join(os.path.dirname(__file__), "alembic"),
406
+ )
407
+ alembic_cfg.set_main_option("sqlalchemy.url", database_url)
408
+ return alembic_cfg
409
+
410
+
411
+ def _run_community_migrations(database_url: str) -> None:
412
+ """
413
+ Run Alembic migrations for the community database schema.
414
+ This includes sessions, chat_messages tables and their indexes.
415
+ """
416
+ try:
417
+ from sqlalchemy import create_engine
418
+
419
+ log.info("Starting community migrations...")
420
+ engine = create_engine(database_url)
421
+ inspector = sa.inspect(engine)
422
+ existing_tables = inspector.get_table_names()
423
+
424
+ if not existing_tables or "sessions" not in existing_tables:
425
+ log.info("Running initial community database setup")
426
+ alembic_cfg = _setup_alembic_config(database_url)
427
+ command.upgrade(alembic_cfg, "head")
428
+ log.info("Community database migrations completed")
429
+ else:
430
+ log.info("Checking for community schema updates")
431
+ alembic_cfg = _setup_alembic_config(database_url)
432
+ command.upgrade(alembic_cfg, "head")
433
+ log.info("Community database schema is current")
434
+ except Exception as e:
435
+ log.warning(
436
+ "Community migration check failed: %s - attempting to run migrations",
437
+ e,
438
+ )
439
+ try:
440
+ alembic_cfg = _setup_alembic_config(database_url)
441
+ command.upgrade(alembic_cfg, "head")
442
+ log.info("Community database migrations completed")
443
+ except Exception as migration_error:
444
+ log.error("Community migration failed: %s", migration_error)
445
+ log.error("Check database connectivity and permissions")
446
+ raise RuntimeError(
447
+ f"Community database migration failed: {migration_error}"
448
+ ) from migration_error
449
+
450
+
451
+ def _run_enterprise_migrations(
452
+ component: "WebUIBackendComponent", database_url: str
453
+ ) -> None:
454
+ """
455
+ Run migrations for enterprise features like advanced analytics, audit logs, etc.
456
+ This is optional and only runs if the enterprise package is available.
457
+ """
458
+ try:
459
+ from solace_agent_mesh_enterprise.webui_backend.migration_runner import (
460
+ run_migrations,
461
+ )
462
+
463
+ webui_app = component.get_app()
464
+ app_config = getattr(webui_app, "app_config", {}) if webui_app else {}
465
+ log.info("Starting enterprise migrations...")
466
+ run_migrations(database_url, app_config)
467
+ log.info("Enterprise migrations completed")
468
+ except (ImportError, ModuleNotFoundError):
469
+ log.debug("Enterprise module not found - skipping enterprise migrations")
470
+ except Exception as e:
471
+ log.error("Enterprise migration failed: %s", e)
472
+ log.error("Advanced features may be unavailable")
473
+ raise RuntimeError(f"Enterprise database migration failed: {e}") from e
474
+
475
+
476
+ def _setup_database(
477
+ component: "WebUIBackendComponent",
478
+ database_url: str,
479
+ platform_database_url: str = None
480
+ ) -> None:
481
+ """
482
+ Initialize database connections and run all required migrations.
483
+ Sets up both runtime and platform database schemas.
484
+
485
+ Args:
486
+ component: WebUIBackendComponent instance
487
+ database_url: Runtime database URL (sessions, tasks, chat) - REQUIRED
488
+ platform_database_url: Platform database URL (agents, connectors, deployments).
489
+ If None, platform features will be unavailable.
490
+ """
491
+ dependencies.init_database(database_url)
492
+ log.info("Persistence enabled - sessions will be stored in database")
493
+ log.info("Running database migrations...")
494
+
495
+ _run_community_migrations(database_url)
496
+
497
+ if platform_database_url:
498
+ log.info("Platform database configured - running migrations")
499
+ _run_enterprise_migrations(component, platform_database_url)
500
+ else:
501
+ log.info("No platform database configured - skipping platform migrations")
502
+
503
+
504
+ def _get_app_config(component: "WebUIBackendComponent") -> dict:
505
+ webui_app = component.get_app()
506
+ app_config = {}
507
+ if webui_app:
508
+ app_config = getattr(webui_app, "app_config", {})
509
+ if app_config is None:
510
+ log.warning("webui_app.app_config is None, using empty dict.")
511
+ app_config = {}
512
+ else:
513
+ log.warning("Could not get webui_app from component. Using empty app_config.")
514
+ return app_config
515
+
516
+
517
+ def _create_api_config(app_config: dict, database_url: str) -> dict:
518
+ return {
519
+ "external_auth_service_url": app_config.get(
520
+ "external_auth_service_url", "http://localhost:8080"
521
+ ),
522
+ "external_auth_callback_uri": app_config.get(
523
+ "external_auth_callback_uri", "http://localhost:8000/api/v1/auth/callback"
524
+ ),
525
+ "external_auth_provider": app_config.get("external_auth_provider", "azure"),
526
+ "frontend_use_authorization": app_config.get(
527
+ "frontend_use_authorization", False
528
+ ),
529
+ "frontend_redirect_url": app_config.get(
530
+ "frontend_redirect_url", "http://localhost:3000"
531
+ ),
532
+ "persistence_enabled": database_url is not None,
533
+ }
534
+
535
+
536
+ def setup_dependencies(
537
+ component: "WebUIBackendComponent",
538
+ database_url: str = None,
539
+ platform_database_url: str = None
540
+ ):
541
+ """
542
+ Initialize dependencies for both runtime and platform databases.
543
+
544
+ Args:
545
+ component: WebUIBackendComponent instance
546
+ database_url: Runtime database URL (sessions, tasks, chat).
547
+ If None, runs in compatibility mode with in-memory sessions.
548
+ platform_database_url: Platform database URL (agents, connectors, deployments).
549
+ If None, platform features will be unavailable (returns 501).
550
+
551
+ This function is idempotent and safe to call multiple times.
552
+ """
553
+ global _dependencies_initialized
554
+
555
+ if _dependencies_initialized:
556
+ log.debug("[setup_dependencies] Dependencies already initialized, skipping")
557
+ return
558
+
559
+ dependencies.set_component_instance(component)
560
+
561
+ if database_url:
562
+ _setup_database(component, database_url, platform_database_url)
563
+ else:
564
+ log.warning(
565
+ "No database URL provided - using in-memory session storage (data not persisted across restarts)"
566
+ )
567
+ log.info("This maintains backward compatibility for existing SAM installations")
568
+
569
+ app_config = _get_app_config(component)
570
+ api_config_dict = _create_api_config(app_config, database_url)
571
+
572
+ dependencies.set_api_config(api_config_dict)
573
+ log.debug("API configuration extracted and stored.")
574
+
575
+ _setup_middleware(component)
576
+ _setup_routers()
577
+ _setup_static_files()
578
+
579
+ _dependencies_initialized = True
580
+ log.debug("[setup_dependencies] Dependencies initialization complete")
581
+
582
+
583
+ def _setup_middleware(component: "WebUIBackendComponent") -> None:
584
+ allowed_origins = component.get_cors_origins()
585
+ app.add_middleware(
586
+ CORSMiddleware,
587
+ allow_origins=allowed_origins,
588
+ allow_credentials=True,
589
+ allow_methods=["*"],
590
+ allow_headers=["*"],
591
+ )
592
+ log.info("CORSMiddleware added with origins: %s", allowed_origins)
593
+
594
+ session_manager = component.get_session_manager()
595
+ app.add_middleware(SessionMiddleware, secret_key=session_manager.secret_key)
596
+ log.info("SessionMiddleware added.")
597
+
598
+ auth_middleware_class = _create_auth_middleware(component)
599
+ app.add_middleware(auth_middleware_class, component=component)
600
+ log.info("AuthMiddleware added.")
601
+
602
+
603
+ def _setup_routers() -> None:
604
+ api_prefix = "/api/v1"
605
+
606
+ app.include_router(session_router, prefix=api_prefix, tags=["Sessions"])
607
+ app.include_router(user_router, prefix=f"{api_prefix}/users", tags=["Users"])
608
+ app.include_router(config.router, prefix=api_prefix, tags=["Config"])
609
+ app.include_router(version.router, prefix=api_prefix, tags=["Version"])
610
+ app.include_router(agent_cards.router, prefix=api_prefix, tags=["Agent Cards"])
611
+ app.include_router(task_router, prefix=api_prefix, tags=["Tasks"])
612
+ app.include_router(sse.router, prefix=f"{api_prefix}/sse", tags=["SSE"])
613
+ app.include_router(
614
+ artifacts.router, prefix=f"{api_prefix}/artifacts", tags=["Artifacts"]
615
+ )
616
+ app.include_router(
617
+ visualization.router,
618
+ prefix=f"{api_prefix}/visualization",
619
+ tags=["Visualization"],
620
+ )
621
+ app.include_router(people.router, prefix=api_prefix, tags=["People"])
622
+ app.include_router(auth.router, prefix=api_prefix, tags=["Auth"])
623
+ app.include_router(projects.router, prefix=api_prefix, tags=["Projects"])
624
+ app.include_router(feedback.router, prefix=api_prefix, tags=["Feedback"])
625
+ app.include_router(prompts.router, prefix=f"{api_prefix}/prompts", tags=["Prompts"])
626
+ app.include_router(speech.router, prefix=f"{api_prefix}/speech", tags=["Speech"])
627
+ log.info("Legacy routers mounted for endpoints not yet migrated")
628
+
629
+ # Register shared exception handlers from community repo
630
+ from .shared.exception_handlers import register_exception_handlers
631
+
632
+ register_exception_handlers(app)
633
+ log.info("Registered shared exception handlers from community repo")
634
+
635
+ # Mount enterprise routers if available
636
+ try:
637
+ from solace_agent_mesh_enterprise.webui_backend.routers import (
638
+ get_enterprise_routers,
639
+ )
640
+
641
+ enterprise_routers = get_enterprise_routers()
642
+ for router_config in enterprise_routers:
643
+ app.include_router(
644
+ router_config["router"],
645
+ prefix=router_config["prefix"],
646
+ tags=router_config["tags"],
647
+ )
648
+ log.info("Mounted %d enterprise routers", len(enterprise_routers))
649
+
650
+ except ImportError:
651
+ log.debug("No enterprise package detected - skipping enterprise routers")
652
+ except ModuleNotFoundError:
653
+ log.debug(
654
+ "Enterprise module not found - skipping enterprise routers and exception handlers"
655
+ )
656
+ except Exception as e:
657
+ log.warning("Failed to load enterprise routers and exception handlers: %s", e)
658
+
659
+
660
+ def _setup_static_files() -> None:
661
+ current_dir = os.path.dirname(os.path.abspath(__file__))
662
+ root_dir = Path(os.path.normpath(os.path.join(current_dir, "..", "..")))
663
+ static_files_dir = Path.joinpath(root_dir, "client", "webui", "frontend", "static")
664
+
665
+ if not os.path.isdir(static_files_dir):
666
+ log.warning(
667
+ "Static files directory '%s' not found. Frontend may not be served.",
668
+ static_files_dir,
669
+ )
670
+ # try to mount static files directory anyways, might work for enterprise
671
+ try:
672
+ app.mount(
673
+ "/", StaticFiles(directory=static_files_dir, html=True), name="static"
674
+ )
675
+ log.info("Mounted static files directory '%s' at '/'", static_files_dir)
676
+ except Exception as static_mount_err:
677
+ log.error(
678
+ "Failed to mount static files directory '%s': %s",
679
+ static_files_dir,
680
+ static_mount_err,
681
+ )
682
+
683
+
684
+ @app.exception_handler(HTTPException)
685
+ async def http_exception_handler(request: FastAPIRequest, exc: HTTPException):
686
+ """
687
+ HTTP exception handler with automatic format detection.
688
+ Returns JSON-RPC format for tasks/SSE endpoints, REST format for others.
689
+ """
690
+ log.warning(
691
+ "HTTP Exception Handler triggered: Status=%s, Detail=%s, Request: %s %s",
692
+ exc.status_code,
693
+ exc.detail,
694
+ request.method,
695
+ request.url,
696
+ )
697
+
698
+ # Check if this is a JSON-RPC endpoint (tasks and SSE endpoints use JSON-RPC)
699
+ is_jsonrpc_endpoint = request.url.path.startswith(
700
+ "/api/v1/tasks"
701
+ ) or request.url.path.startswith("/api/v1/sse")
702
+
703
+ if is_jsonrpc_endpoint:
704
+ # Use JSON-RPC format for tasks and SSE endpoints
705
+ error_data = None
706
+ error_code = InternalError().code
707
+ error_message = str(exc.detail)
708
+
709
+ if isinstance(exc.detail, dict):
710
+ if "code" in exc.detail and "message" in exc.detail:
711
+ error_code = exc.detail["code"]
712
+ error_message = exc.detail["message"]
713
+ error_data = exc.detail.get("data")
714
+ else:
715
+ error_data = exc.detail
716
+ elif isinstance(exc.detail, str):
717
+ if exc.status_code == status.HTTP_400_BAD_REQUEST:
718
+ error_code = -32600
719
+ elif exc.status_code == status.HTTP_404_NOT_FOUND:
720
+ error_code = -32601
721
+ error_message = "Resource not found"
722
+
723
+ error_obj = JSONRPCError(
724
+ code=error_code, message=error_message, data=error_data
725
+ )
726
+ response = A2AJSONRPCResponse(error=error_obj)
727
+ return JSONResponse(
728
+ status_code=exc.status_code, content=response.model_dump(exclude_none=True)
729
+ )
730
+ else:
731
+ # Use standard REST format for sessions and other REST endpoints
732
+ if isinstance(exc.detail, dict):
733
+ error_response = exc.detail
734
+ elif isinstance(exc.detail, str):
735
+ error_response = {"detail": exc.detail}
736
+ else:
737
+ error_response = {"detail": str(exc.detail)}
738
+
739
+ return JSONResponse(status_code=exc.status_code, content=error_response)
740
+
741
+
742
+ @app.exception_handler(RequestValidationError)
743
+ async def validation_exception_handler(
744
+ request: FastAPIRequest, exc: RequestValidationError
745
+ ):
746
+ """
747
+ Handles Pydantic validation errors with format detection.
748
+ """
749
+ log.warning(
750
+ "Validation Exception Handler triggered: %s, Request: %s %s",
751
+ exc.errors(),
752
+ request.method,
753
+ request.url,
754
+ )
755
+ response = a2a.create_invalid_request_error_response(
756
+ message="Invalid request parameters", data=exc.errors(), request_id=None
757
+ )
758
+ return JSONResponse(
759
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
760
+ content=response.model_dump(exclude_none=True),
761
+ )
762
+
763
+
764
+ @app.exception_handler(Exception)
765
+ async def generic_exception_handler(request: FastAPIRequest, exc: Exception):
766
+ """
767
+ Handles any other unexpected exceptions with format detection.
768
+ """
769
+ log.exception(
770
+ "Generic Exception Handler triggered: %s, Request: %s %s",
771
+ exc,
772
+ request.method,
773
+ request.url,
774
+ )
775
+ error_obj = a2a.create_internal_error(
776
+ message="An unexpected server error occurred: %s" % type(exc).__name__
777
+ )
778
+ response = a2a.create_error_response(error=error_obj, request_id=None)
779
+ return JSONResponse(
780
+ status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
781
+ content=response.model_dump(exclude_none=True),
782
+ )
783
+
784
+
785
+ @app.get("/health", tags=["Health"])
786
+ async def read_root():
787
+ """Basic health check endpoint."""
788
+ log.debug("Health check endpoint '/health' called")
789
+ return {"status": "A2A Web UI Backend is running"}