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

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

Potentially problematic release.


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

Files changed (447) hide show
  1. solace_agent_mesh/agent/adk/alembic/README +74 -0
  2. solace_agent_mesh/agent/adk/alembic/env.py +77 -0
  3. solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
  4. solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
  5. solace_agent_mesh/agent/adk/alembic.ini +112 -0
  6. solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +164 -0
  7. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
  8. solace_agent_mesh/agent/adk/callbacks.py +752 -127
  9. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +99 -7
  10. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
  11. solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
  12. solace_agent_mesh/agent/adk/models/lite_llm.py +34 -16
  13. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
  14. solace_agent_mesh/agent/adk/runner.py +66 -8
  15. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  16. solace_agent_mesh/agent/adk/services.py +41 -1
  17. solace_agent_mesh/agent/adk/setup.py +220 -32
  18. solace_agent_mesh/agent/adk/stream_parser.py +229 -40
  19. solace_agent_mesh/agent/protocol/event_handlers.py +219 -33
  20. solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
  21. solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
  22. solace_agent_mesh/agent/proxies/base/component.py +188 -22
  23. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
  24. solace_agent_mesh/agent/sac/app.py +37 -12
  25. solace_agent_mesh/agent/sac/component.py +322 -52
  26. solace_agent_mesh/agent/sac/patch_adk.py +8 -16
  27. solace_agent_mesh/agent/sac/task_execution_context.py +90 -0
  28. solace_agent_mesh/agent/tools/__init__.py +3 -0
  29. solace_agent_mesh/agent/tools/audio_tools.py +3 -3
  30. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +698 -24
  31. solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
  32. solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
  33. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  34. solace_agent_mesh/agent/tools/tool_config_types.py +54 -2
  35. solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
  36. solace_agent_mesh/agent/tools/web_tools.py +125 -17
  37. solace_agent_mesh/agent/utils/artifact_helpers.py +243 -5
  38. solace_agent_mesh/agent/utils/context_helpers.py +17 -0
  39. solace_agent_mesh/assets/docs/404.html +6 -6
  40. solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
  41. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  42. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  43. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  44. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  45. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  46. solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
  47. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
  56. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
  87. solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
  88. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
  89. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
  90. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
  91. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
  92. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +75 -75
  93. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  94. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
  95. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
  96. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
  97. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
  98. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
  99. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
  100. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  101. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
  102. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +98 -112
  103. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  104. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
  105. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  106. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -28
  107. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -29
  108. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
  109. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
  110. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  111. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +67 -53
  112. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -17
  113. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  114. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
  115. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +87 -87
  116. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
  117. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
  118. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
  119. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
  120. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
  121. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
  122. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
  123. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
  124. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
  125. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
  126. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
  127. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
  128. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
  129. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
  130. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  131. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +50 -23
  132. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +29 -24
  133. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +21 -21
  134. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
  135. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  136. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +96 -66
  137. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +181 -181
  138. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +75 -75
  139. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +27 -27
  140. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
  141. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -38
  142. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
  143. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
  144. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  145. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +135 -114
  146. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +37 -37
  147. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
  148. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
  149. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
  150. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
  151. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +112 -112
  152. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +28 -28
  153. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
  154. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
  155. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  156. solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
  157. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  158. solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
  159. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  160. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  161. solace_agent_mesh/cli/__init__.py +1 -1
  162. solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
  163. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
  164. solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
  165. solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
  166. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  167. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  168. solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
  169. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
  170. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  171. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
  172. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
  173. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  174. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
  175. solace_agent_mesh/cli/commands/run_cmd.py +64 -49
  176. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  177. solace_agent_mesh/cli/main.py +15 -0
  178. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-tcIFZLis.js → authCallback-KnKMP_vb.js} +1 -1
  179. solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
  180. solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
  181. solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
  182. solace_agent_mesh/client/webui/frontend/static/assets/{vendor-CINwxvwV.js → vendor-CGk8Suyh.js} +189 -94
  183. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  184. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  185. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  186. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  187. solace_agent_mesh/common/a2a/types.py +1 -1
  188. solace_agent_mesh/common/agent_registry.py +38 -11
  189. solace_agent_mesh/common/data_parts.py +124 -0
  190. solace_agent_mesh/common/error_handlers.py +83 -0
  191. solace_agent_mesh/common/exceptions.py +24 -0
  192. solace_agent_mesh/common/oauth/__init__.py +17 -0
  193. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  194. solace_agent_mesh/common/oauth/utils.py +50 -0
  195. solace_agent_mesh/common/rag_dto.py +156 -0
  196. solace_agent_mesh/common/sac/sam_component_base.py +73 -1
  197. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  198. solace_agent_mesh/common/utils/embeds/converter.py +1 -8
  199. solace_agent_mesh/common/utils/embeds/modifiers.py +2 -27
  200. solace_agent_mesh/common/utils/embeds/resolver.py +94 -25
  201. solace_agent_mesh/common/utils/embeds/types.py +1 -0
  202. solace_agent_mesh/common/utils/log_formatters.py +20 -0
  203. solace_agent_mesh/common/utils/mime_helpers.py +12 -5
  204. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  205. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  206. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  207. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  208. solace_agent_mesh/config_portal/backend/common.py +12 -0
  209. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
  210. solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
  211. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
  212. solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
  213. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
  214. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
  215. solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
  216. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  217. solace_agent_mesh/core_a2a/service.py +3 -2
  218. solace_agent_mesh/gateway/adapter/base.py +28 -1
  219. solace_agent_mesh/gateway/adapter/types.py +9 -0
  220. solace_agent_mesh/gateway/base/app.py +10 -0
  221. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  222. solace_agent_mesh/gateway/base/component.py +451 -10
  223. solace_agent_mesh/gateway/generic/component.py +274 -30
  224. solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
  225. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +2 -43
  226. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +2 -2
  227. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  228. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  229. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  230. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  231. solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
  232. solace_agent_mesh/gateway/http_sse/app.py +23 -6
  233. solace_agent_mesh/gateway/http_sse/component.py +158 -73
  234. solace_agent_mesh/gateway/http_sse/dependencies.py +50 -57
  235. solace_agent_mesh/gateway/http_sse/main.py +58 -482
  236. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  237. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +1 -1
  238. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +1 -1
  239. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +3 -2
  240. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
  241. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +2 -2
  242. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +2 -2
  243. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +5 -0
  244. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  245. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +1 -1
  246. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
  247. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +1 -1
  248. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +1 -1
  249. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +12 -107
  250. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
  251. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
  252. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +113 -7
  253. solace_agent_mesh/gateway/http_sse/routers/auth.py +69 -132
  254. solace_agent_mesh/gateway/http_sse/routers/config.py +235 -10
  255. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  256. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  257. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +1 -1
  258. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  259. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +1 -0
  260. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +3 -2
  261. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  262. solace_agent_mesh/gateway/http_sse/routers/feedback.py +2 -2
  263. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  264. solace_agent_mesh/gateway/http_sse/routers/projects.py +250 -24
  265. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
  266. solace_agent_mesh/gateway/http_sse/routers/sessions.py +14 -5
  267. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  268. solace_agent_mesh/gateway/http_sse/routers/sse.py +117 -4
  269. solace_agent_mesh/gateway/http_sse/routers/tasks.py +509 -149
  270. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  271. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  272. solace_agent_mesh/gateway/http_sse/routers/visualization.py +2 -1
  273. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  274. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  275. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  276. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  277. solace_agent_mesh/gateway/http_sse/services/project_service.py +539 -12
  278. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  279. solace_agent_mesh/gateway/http_sse/services/session_service.py +198 -21
  280. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
  281. solace_agent_mesh/gateway/http_sse/sse_manager.py +280 -169
  282. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  283. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
  284. solace_agent_mesh/services/__init__.py +0 -0
  285. solace_agent_mesh/services/platform/__init__.py +29 -0
  286. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  287. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  288. solace_agent_mesh/services/platform/alembic.ini +109 -0
  289. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  290. solace_agent_mesh/services/platform/api/dependencies.py +154 -0
  291. solace_agent_mesh/services/platform/api/main.py +314 -0
  292. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  293. solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
  294. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  295. solace_agent_mesh/services/platform/app.py +215 -0
  296. solace_agent_mesh/services/platform/component.py +777 -0
  297. solace_agent_mesh/shared/__init__.py +14 -0
  298. solace_agent_mesh/shared/api/__init__.py +42 -0
  299. solace_agent_mesh/shared/auth/__init__.py +26 -0
  300. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  301. solace_agent_mesh/shared/auth/middleware.py +347 -0
  302. solace_agent_mesh/shared/database/__init__.py +20 -0
  303. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  304. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  305. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  306. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  307. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +1 -1
  308. solace_agent_mesh/shared/utils/__init__.py +21 -0
  309. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  310. solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
  311. solace_agent_mesh/templates/platform.yaml +49 -0
  312. solace_agent_mesh/templates/plugin_readme_template.md +3 -25
  313. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  314. solace_agent_mesh/templates/proxy_template.yaml +62 -0
  315. solace_agent_mesh/templates/webui.yaml +148 -6
  316. solace_agent_mesh/tools/web_search/__init__.py +18 -0
  317. solace_agent_mesh/tools/web_search/base.py +84 -0
  318. solace_agent_mesh/tools/web_search/google_search.py +247 -0
  319. solace_agent_mesh/tools/web_search/models.py +99 -0
  320. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +29 -8
  321. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/RECORD +334 -313
  322. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
  323. solace_agent_mesh/agent/adk/adk_llm.txt +0 -226
  324. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  325. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  326. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -189
  327. solace_agent_mesh/agent/agent_llm.txt +0 -369
  328. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  329. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  330. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  331. solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +0 -190
  332. solace_agent_mesh/agent/proxies/base/base_llm.txt +0 -148
  333. solace_agent_mesh/agent/proxies/proxies_llm.txt +0 -283
  334. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  335. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  336. solace_agent_mesh/agent/testing/testing_llm.txt +0 -58
  337. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  338. solace_agent_mesh/agent/tools/tools_llm.txt +0 -276
  339. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -275
  340. solace_agent_mesh/agent/utils/utils_llm.txt +0 -152
  341. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  342. solace_agent_mesh/assets/docs/assets/js/05749d90.c70b2be9.js +0 -1
  343. solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +0 -1
  344. solace_agent_mesh/assets/docs/assets/js/15e40e79.36003774.js +0 -1
  345. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
  346. solace_agent_mesh/assets/docs/assets/js/240a0364.c39f8388.js +0 -1
  347. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  348. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  349. solace_agent_mesh/assets/docs/assets/js/3ac1795d.e4870a49.js +0 -1
  350. solace_agent_mesh/assets/docs/assets/js/3ff0015d.b63ee53a.js +0 -1
  351. solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +0 -1
  352. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
  353. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.45b32c2b.js +0 -1
  354. solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +0 -1
  355. solace_agent_mesh/assets/docs/assets/js/66d4869e.830d443f.js +0 -1
  356. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
  357. solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +0 -1
  358. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
  359. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
  360. solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
  361. solace_agent_mesh/assets/docs/assets/js/94e8668d.09ed9234.js +0 -1
  362. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
  363. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
  364. solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +0 -1
  365. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
  366. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.f902fad8.js +0 -1
  367. solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +0 -1
  368. solace_agent_mesh/assets/docs/assets/js/e04b235d.c9c50c7b.js +0 -1
  369. solace_agent_mesh/assets/docs/assets/js/e3d9abda.d11c67a7.js +0 -1
  370. solace_agent_mesh/assets/docs/assets/js/e6f9706b.045d0fa1.js +0 -1
  371. solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +0 -1
  372. solace_agent_mesh/assets/docs/assets/js/f284c35a.5099c51e.js +0 -1
  373. solace_agent_mesh/assets/docs/assets/js/main.f213fe0c.js +0 -2
  374. solace_agent_mesh/assets/docs/assets/js/runtime~main.d9606d6a.js +0 -1
  375. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +0 -47
  376. solace_agent_mesh/assets/docs/lunr-index-1762283454666.json +0 -1
  377. solace_agent_mesh/assets/docs/search-doc-1762283454666.json +0 -1
  378. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  379. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  380. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  381. solace_agent_mesh/client/webui/frontend/static/assets/client-CRYdKo2Q.js +0 -25
  382. solace_agent_mesh/client/webui/frontend/static/assets/main-CojeY_1w.css +0 -1
  383. solace_agent_mesh/client/webui/frontend/static/assets/main-ILja9MCG.js +0 -353
  384. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -175
  385. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  386. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -445
  387. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  388. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -330
  389. solace_agent_mesh/common/common_llm.txt +0 -230
  390. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  391. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  392. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  393. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  394. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  395. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  396. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  397. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -81
  398. solace_agent_mesh/common/services/services_llm.txt +0 -368
  399. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  400. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  401. solace_agent_mesh/common/utils/utils_llm.txt +0 -335
  402. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  403. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
  404. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
  405. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
  406. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
  407. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  408. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  409. solace_agent_mesh/gateway/base/base_llm.txt +0 -226
  410. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  411. solace_agent_mesh/gateway/gateway_llm.txt +0 -369
  412. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  413. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -345
  414. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_fulltext_search_indexes.py +0 -92
  415. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -161
  416. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  417. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  418. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  419. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -221
  420. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -257
  421. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -308
  422. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -450
  423. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -133
  424. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -123
  425. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -312
  426. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -303
  427. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  428. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -319
  429. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  430. solace_agent_mesh/llm.txt +0 -228
  431. solace_agent_mesh/llm_detail.txt +0 -2835
  432. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  433. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  434. solace_agent_mesh/templates/logging_config_template.ini +0 -45
  435. solace_agent_mesh/templates/templates_llm.txt +0 -147
  436. /solace_agent_mesh/assets/docs/assets/js/{main.f213fe0c.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
  437. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  438. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  439. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  440. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  441. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  442. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  443. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  444. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  445. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  446. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
  447. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,47 @@
1
+ """Add background task execution fields
2
+
3
+ Revision ID: 20251126_background_tasks
4
+ Revises: 20251202_versioned_prompt_fields
5
+ Create Date: 2025-11-26 17:30:00.000000
6
+
7
+ """
8
+ from alembic import op
9
+ import sqlalchemy as sa
10
+
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = '20251126_background_tasks'
14
+ down_revision = '20251202_versioned_prompt_fields'
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade():
20
+ """Add fields to support background task execution."""
21
+ # Add execution_mode column (foreground | background)
22
+ op.add_column('tasks', sa.Column('execution_mode', sa.String(20), nullable=True, server_default='foreground'))
23
+
24
+ # Add last_activity_time for timeout detection
25
+ op.add_column('tasks', sa.Column('last_activity_time', sa.BigInteger, nullable=True))
26
+
27
+ # Add background_execution_enabled flag
28
+ op.add_column('tasks', sa.Column('background_execution_enabled', sa.Boolean, nullable=True, server_default='false'))
29
+
30
+ # Add max_execution_time_ms for timeout configuration
31
+ op.add_column('tasks', sa.Column('max_execution_time_ms', sa.BigInteger, nullable=True))
32
+
33
+ # Create index on execution_mode for efficient queries
34
+ op.create_index('idx_tasks_execution_mode', 'tasks', ['execution_mode'])
35
+
36
+ # Create index on last_activity_time for timeout monitoring
37
+ op.create_index('idx_tasks_last_activity', 'tasks', ['last_activity_time'])
38
+
39
+
40
+ def downgrade():
41
+ """Remove background task execution fields."""
42
+ op.drop_index('idx_tasks_last_activity', table_name='tasks')
43
+ op.drop_index('idx_tasks_execution_mode', table_name='tasks')
44
+ op.drop_column('tasks', 'max_execution_time_ms')
45
+ op.drop_column('tasks', 'background_execution_enabled')
46
+ op.drop_column('tasks', 'last_activity_time')
47
+ op.drop_column('tasks', 'execution_mode')
@@ -0,0 +1,52 @@
1
+ """Add versioned metadata fields to prompts table
2
+
3
+ Revision ID: 20251202_versioned_prompt_fields
4
+ Revises: 20251115_add_parent_task_id
5
+ Create Date: 2025-12-02
6
+
7
+ This migration adds name, description, category, and command fields to the prompts table
8
+ to enable full versioning of all prompt metadata, not just the prompt_text content.
9
+ """
10
+
11
+ from collections.abc import Sequence
12
+ import sqlalchemy as sa
13
+ from alembic import op
14
+
15
+ revision: str = "20251202_versioned_prompt_fields"
16
+ down_revision: str | Sequence[str] | None = "20251115_add_parent_task_id"
17
+ branch_labels: str | Sequence[str] | None = None
18
+ depends_on: str | Sequence[str] | None = None
19
+
20
+
21
+ def upgrade() -> None:
22
+ """Add versioned metadata fields to prompts table."""
23
+
24
+ # Add new columns to prompts table
25
+ with op.batch_alter_table('prompts', schema=None) as batch_op:
26
+ batch_op.add_column(sa.Column('name', sa.String(length=255), nullable=True))
27
+ batch_op.add_column(sa.Column('description', sa.Text(), nullable=True))
28
+ batch_op.add_column(sa.Column('category', sa.String(length=100), nullable=True))
29
+ batch_op.add_column(sa.Column('command', sa.String(length=50), nullable=True))
30
+
31
+ # Migrate existing data: copy metadata from prompt_groups to prompts
32
+ # This ensures existing prompt versions have the metadata from their group
33
+ connection = op.get_bind()
34
+ connection.execute(sa.text("""
35
+ UPDATE prompts
36
+ SET name = pg.name,
37
+ description = pg.description,
38
+ category = pg.category,
39
+ command = pg.command
40
+ FROM prompt_groups pg
41
+ WHERE prompts.group_id = pg.id
42
+ """))
43
+
44
+
45
+ def downgrade() -> None:
46
+ """Remove versioned metadata fields from prompts table."""
47
+
48
+ with op.batch_alter_table('prompts', schema=None) as batch_op:
49
+ batch_op.drop_column('command')
50
+ batch_op.drop_column('category')
51
+ batch_op.drop_column('description')
52
+ batch_op.drop_column('name')
@@ -107,39 +107,3 @@ path_separator = os
107
107
  # ruff.type = exec
108
108
  # ruff.executable = ruff
109
109
  # ruff.options = check --fix REVISION_SCRIPT_FILENAME
110
-
111
- # Logging configuration. This is also consumed by the user-maintained
112
- # env.py script only.
113
- [loggers]
114
- keys = root,sqlalchemy,alembic
115
-
116
- [handlers]
117
- keys = console
118
-
119
- [formatters]
120
- keys = generic
121
-
122
- [logger_root]
123
- level = WARNING
124
- handlers = console
125
- qualname =
126
-
127
- [logger_sqlalchemy]
128
- level = WARNING
129
- handlers =
130
- qualname = sqlalchemy.engine
131
-
132
- [logger_alembic]
133
- level = INFO
134
- handlers =
135
- qualname = alembic
136
-
137
- [handler_console]
138
- class = StreamHandler
139
- args = (sys.stderr,)
140
- level = NOTSET
141
- formatter = generic
142
-
143
- [formatter_generic]
144
- format = %(levelname)-5.5s [%(name)s] %(message)s
145
- datefmt = %H:%M:%S
@@ -166,6 +166,20 @@ class WebUIBackendApp(BaseGatewayApp):
166
166
  "default": "",
167
167
  "description": "The passphrase for the SSL private key.",
168
168
  },
169
+ {
170
+ "name": "frontend_server_url",
171
+ "required": False,
172
+ "type": "string",
173
+ "default": "",
174
+ "description": (
175
+ "The WebUI Gateway's public URL for frontend API requests. "
176
+ "If empty (default), the frontend uses relative URLs for same-origin requests. "
177
+ "Only set this if the frontend is served from a different origin than the WebUI Gateway. "
178
+ "Examples: "
179
+ " - Same-origin (default): '' (empty, uses relative URLs like /api/v1/...) "
180
+ " - Cross-origin: https://webui-gateway.example.com"
181
+ ),
182
+ },
169
183
  {
170
184
  "name": "session_service",
171
185
  "required": False,
@@ -193,16 +207,19 @@ class WebUIBackendApp(BaseGatewayApp):
193
207
  "required": False,
194
208
  "type": "dict",
195
209
  "default": {},
196
- "description": "Configuration for the Platform Service (enterprise features: agents, connectors, deployments).",
210
+ "description": "Configuration for connecting to the Platform Service (runs separately on port 8001).",
197
211
  "dict_schema": {
198
- "database_url": {
212
+ "url": {
199
213
  "type": "string",
200
214
  "required": False,
201
- "default": None,
215
+ "default": "",
202
216
  "description": (
203
- "Database URL for platform data (agents, connectors, deployments). "
204
- "REQUIRED for platform features to be available. "
205
- "Example: postgresql://user:pass@host:5432/platform_db"
217
+ "Platform Service URL for frontend API routing to enterprise endpoints. "
218
+ "Frontend will call this URL for /api/v1/platform/* requests. "
219
+ "Examples: "
220
+ " - Docker: http://platform-service:8001 "
221
+ " - K8s: http://platform-service:8001 "
222
+ " - Local: http://localhost:8001"
206
223
  ),
207
224
  },
208
225
  },
@@ -124,6 +124,13 @@ class WebUIBackendComponent(BaseGatewayComponent):
124
124
  self.ssl_keyfile_password = self.get_config("ssl_keyfile_password", "")
125
125
  self.model_config = self.get_config("model", None)
126
126
 
127
+ # OAuth2 configuration (enterprise feature - defaults to community mode)
128
+ self.external_auth_service_url = self.get_config("external_auth_service_url", "")
129
+ self.external_auth_provider = self.get_config("external_auth_provider", "generic")
130
+
131
+ # frontend_server_url is optional - empty string means frontend uses relative URLs
132
+ self.frontend_server_url = self.get_config("frontend_server_url", "")
133
+
127
134
  log.info(
128
135
  "%s WebUI-specific configuration retrieved (Host: %s, Port: %d).",
129
136
  self.log_identifier,
@@ -134,16 +141,15 @@ class WebUIBackendComponent(BaseGatewayComponent):
134
141
  log.error("%s Failed to retrieve configuration: %s", self.log_identifier, e)
135
142
  raise ValueError(f"Configuration retrieval error: {e}") from e
136
143
 
137
- sse_max_queue_size = self.get_config("sse_max_queue_size", 200)
144
+ self.sse_max_queue_size = self.get_config("sse_max_queue_size", 200)
138
145
  sse_buffer_max_age_seconds = self.get_config("sse_buffer_max_age_seconds", 600)
139
146
 
140
147
  self.sse_event_buffer = SSEEventBuffer(
141
- max_queue_size=sse_max_queue_size,
148
+ max_queue_size=self.sse_max_queue_size,
142
149
  max_age_seconds=sse_buffer_max_age_seconds,
143
150
  )
144
- self.sse_manager = SSEManager(
145
- max_queue_size=sse_max_queue_size, event_buffer=self.sse_event_buffer
146
- )
151
+ # SSE manager will be initialized after database setup
152
+ self.sse_manager = None
147
153
 
148
154
  self._sse_cleanup_timer_id = f"sse_cleanup_{self.gateway_id}"
149
155
  cleanup_interval_sec = self.get_config(
@@ -212,7 +218,7 @@ class WebUIBackendComponent(BaseGatewayComponent):
212
218
  )
213
219
 
214
220
  platform_config = self.get_config("platform_service", {})
215
- self.platform_database_url = platform_config.get("database_url")
221
+ self.platform_service_url = platform_config.get("url", "")
216
222
  component_config = self.get_config("component_config", {})
217
223
  app_config = component_config.get("app_config", {})
218
224
 
@@ -240,6 +246,10 @@ class WebUIBackendComponent(BaseGatewayComponent):
240
246
  self._task_logger_broker_input: BrokerInput | None = None
241
247
  self._task_logger_processor_task: asyncio.Task | None = None
242
248
  self.task_logger_service: TaskLoggerService | None = None
249
+
250
+ # Background task monitor
251
+ self.background_task_monitor = None
252
+ self._background_task_monitor_timer_id = None
243
253
 
244
254
  # Initialize SAM Events service for system events
245
255
  from ...common.sam_events import SamEventService
@@ -298,8 +308,27 @@ class WebUIBackendComponent(BaseGatewayComponent):
298
308
  "%s Data retention is disabled via configuration.", self.log_identifier
299
309
  )
300
310
 
311
+ if self.database_url:
312
+ log.info("%s Running database migrations...", self.log_identifier)
313
+ self._run_database_migrations()
314
+ log.info("%s Database migrations completed", self.log_identifier)
315
+
301
316
  log.info("%s Web UI Backend Component initialized.", self.log_identifier)
302
317
 
318
+ def _run_database_migrations(self):
319
+ """Run database migrations synchronously during __init__."""
320
+ try:
321
+ from ...gateway.http_sse.main import _setup_database
322
+ _setup_database(self.database_url)
323
+ except Exception as e:
324
+ log.error(
325
+ "%s Failed to run database migrations: %s",
326
+ self.log_identifier,
327
+ e,
328
+ exc_info=True
329
+ )
330
+ raise RuntimeError(f"Database migration failed during component initialization: {e}") from e
331
+
303
332
  def process_event(self, event: Event):
304
333
  if event.event_type == EventType.TIMER:
305
334
  timer_id = event.data.get("timer_id")
@@ -333,6 +362,27 @@ class WebUIBackendComponent(BaseGatewayComponent):
333
362
  self.log_identifier,
334
363
  )
335
364
  return
365
+
366
+ if timer_id == self._background_task_monitor_timer_id:
367
+ log.debug("%s Background task monitor timer triggered.", self.log_identifier)
368
+ if self.background_task_monitor:
369
+ loop = self.get_async_loop()
370
+ if loop and loop.is_running():
371
+ asyncio.run_coroutine_threadsafe(
372
+ self.background_task_monitor.check_timeouts(),
373
+ loop
374
+ )
375
+ else:
376
+ log.warning(
377
+ "%s Async loop not available for background task monitor.",
378
+ self.log_identifier
379
+ )
380
+ else:
381
+ log.warning(
382
+ "%s Background task monitor timer fired but service is not initialized.",
383
+ self.log_identifier,
384
+ )
385
+ return
336
386
 
337
387
  super().process_event(event)
338
388
 
@@ -388,7 +438,7 @@ class WebUIBackendComponent(BaseGatewayComponent):
388
438
  broker_input_cfg = {
389
439
  "component_module": "broker_input",
390
440
  "component_name": f"{self.gateway_id}_viz_broker_input",
391
- "broker_queue_name": f"{self.namespace.strip('/')}/q/gdk/viz/{self.gateway_id}/{uuid.uuid4().hex}",
441
+ "broker_queue_name": f"{self.namespace.strip('/')}/q/gdk/viz/{self.gateway_id}",
392
442
  "create_queue_on_start": True,
393
443
  "component_config": {
394
444
  "broker_url": main_broker_config.get("broker_url"),
@@ -522,7 +572,7 @@ class WebUIBackendComponent(BaseGatewayComponent):
522
572
  broker_input_cfg = {
523
573
  "component_module": "broker_input",
524
574
  "component_name": f"{self.gateway_id}_task_log_broker_input",
525
- "broker_queue_name": f"{self.namespace.strip('/')}/q/gdk/task_log/{self.gateway_id}/{uuid.uuid4().hex}",
575
+ "broker_queue_name": f"{self.namespace.strip('/')}/q/gdk/task_log/{self.gateway_id}",
526
576
  "create_queue_on_start": True,
527
577
  "component_config": {
528
578
  "broker_url": main_broker_config.get("broker_url"),
@@ -812,11 +862,34 @@ class WebUIBackendComponent(BaseGatewayComponent):
812
862
  event_details["direction"],
813
863
  )
814
864
  except asyncio.QueueFull:
815
- log.warning(
816
- "%s SSE queue full for stream %s. Visualization message dropped.",
817
- log_id_prefix,
818
- stream_id,
819
- )
865
+ # Check if this is a background task
866
+ is_background = False
867
+ if task_id_for_context and self.database_url:
868
+ try:
869
+ from .repository.task_repository import TaskRepository
870
+ db = dependencies.SessionLocal()
871
+ try:
872
+ repo = TaskRepository()
873
+ task = repo.find_by_id(db, task_id_for_context)
874
+ is_background = task and task.background_execution_enabled
875
+ finally:
876
+ db.close()
877
+ except Exception:
878
+ pass
879
+
880
+ if is_background:
881
+ log.debug(
882
+ "%s SSE queue full for stream %s. Dropping visualization message for background task %s.",
883
+ log_id_prefix,
884
+ stream_id,
885
+ task_id_for_context,
886
+ )
887
+ else:
888
+ log.warning(
889
+ "%s SSE queue full for stream %s. Visualization message dropped.",
890
+ log_id_prefix,
891
+ stream_id,
892
+ )
820
893
  except Exception as send_err:
821
894
  log.error(
822
895
  "%s Error sending formatted message to SSE queue for stream %s: %s",
@@ -1229,11 +1302,22 @@ class WebUIBackendComponent(BaseGatewayComponent):
1229
1302
 
1230
1303
  self.fastapi_app = fastapi_app_instance
1231
1304
 
1232
- setup_dependencies(self, self.database_url, self.platform_database_url)
1305
+ setup_dependencies(self)
1233
1306
 
1234
1307
  # Instantiate services that depend on the database session factory.
1235
1308
  # This must be done *after* setup_dependencies has run.
1236
1309
  session_factory = dependencies.SessionLocal if self.database_url else None
1310
+
1311
+ # Initialize SSE manager with session factory for background task detection
1312
+ self.sse_manager = SSEManager(
1313
+ max_queue_size=self.sse_max_queue_size,
1314
+ event_buffer=self.sse_event_buffer,
1315
+ session_factory=session_factory
1316
+ )
1317
+ log.debug(
1318
+ "%s SSE manager initialized with database session factory.",
1319
+ self.log_identifier,
1320
+ )
1237
1321
  task_logging_config = self.get_config("task_logging", {})
1238
1322
  self.task_logger_service = TaskLoggerService(
1239
1323
  session_factory=session_factory, config=task_logging_config
@@ -1242,6 +1326,55 @@ class WebUIBackendComponent(BaseGatewayComponent):
1242
1326
  "%s Services dependent on database session factory have been initialized.",
1243
1327
  self.log_identifier,
1244
1328
  )
1329
+
1330
+ # Initialize background task monitor if task logging is enabled
1331
+ if self.database_url and task_logging_config.get("enabled", False):
1332
+ from .services.background_task_monitor import BackgroundTaskMonitor
1333
+ from .services.task_service import TaskService
1334
+
1335
+ # Create task service for cancellation operations
1336
+ task_service = TaskService(
1337
+ core_a2a_service=self.core_a2a_service,
1338
+ publish_func=self.publish_a2a,
1339
+ namespace=self.namespace,
1340
+ gateway_id=self.gateway_id,
1341
+ sse_manager=self.sse_manager,
1342
+ task_context_map=self.task_context_manager._contexts,
1343
+ task_context_lock=self.task_context_manager._lock,
1344
+ app_name=self.name,
1345
+ )
1346
+
1347
+ # Get timeout configuration
1348
+ background_config = self.get_config("background_tasks", {})
1349
+ default_timeout_ms = background_config.get("default_timeout_ms", 3600000) # 1 hour
1350
+
1351
+ self.background_task_monitor = BackgroundTaskMonitor(
1352
+ session_factory=session_factory,
1353
+ task_service=task_service,
1354
+ default_timeout_ms=default_timeout_ms,
1355
+ )
1356
+
1357
+ # Create timer for periodic timeout checks
1358
+ monitor_interval_ms = background_config.get("monitor_interval_ms", 300000) # 5 minutes
1359
+ self._background_task_monitor_timer_id = f"background_task_monitor_{self.gateway_id}"
1360
+
1361
+ self.add_timer(
1362
+ delay_ms=monitor_interval_ms,
1363
+ timer_id=self._background_task_monitor_timer_id,
1364
+ interval_ms=monitor_interval_ms,
1365
+ )
1366
+
1367
+ log.info(
1368
+ "%s Background task monitor initialized with %dms check interval and %dms default timeout",
1369
+ self.log_identifier,
1370
+ monitor_interval_ms,
1371
+ default_timeout_ms
1372
+ )
1373
+ else:
1374
+ log.info(
1375
+ "%s Background task monitor not initialized (task logging disabled or no database)",
1376
+ self.log_identifier
1377
+ )
1245
1378
 
1246
1379
  port = (
1247
1380
  self.fastapi_https_port
@@ -1258,6 +1391,7 @@ class WebUIBackendComponent(BaseGatewayComponent):
1258
1391
  ssl_keyfile=self.ssl_keyfile,
1259
1392
  ssl_certfile=self.ssl_certfile,
1260
1393
  ssl_keyfile_password=self.ssl_keyfile_password,
1394
+ log_config=None
1261
1395
  )
1262
1396
  self.uvicorn_server = uvicorn.Server(config)
1263
1397
 
@@ -1345,39 +1479,6 @@ class WebUIBackendComponent(BaseGatewayComponent):
1345
1479
  )
1346
1480
  self.stop_signal.set()
1347
1481
 
1348
- try:
1349
- from solace_agent_mesh_enterprise.init_enterprise import (
1350
- start_enterprise_background_tasks,
1351
- )
1352
-
1353
- log.info(
1354
- "%s Starting enterprise background tasks...",
1355
- self.log_identifier,
1356
- )
1357
- await start_enterprise_background_tasks(self)
1358
- log.info(
1359
- "%s Enterprise background tasks started successfully",
1360
- self.log_identifier,
1361
- )
1362
- except ImportError:
1363
- log.debug(
1364
- "%s Enterprise package not available - skipping background tasks",
1365
- self.log_identifier,
1366
- )
1367
- except RuntimeError as enterprise_err:
1368
- log.warning(
1369
- "%s Enterprise background tasks disabled: %s - Community features will continue normally",
1370
- self.log_identifier,
1371
- enterprise_err,
1372
- )
1373
- except Exception as enterprise_err:
1374
- log.error(
1375
- "%s Failed to start enterprise background tasks: %s - Community features will continue normally",
1376
- self.log_identifier,
1377
- enterprise_err,
1378
- exc_info=True,
1379
- )
1380
-
1381
1482
  @self.fastapi_app.on_event("shutdown")
1382
1483
  async def shutdown_event():
1383
1484
  log.info(
@@ -1385,32 +1486,6 @@ class WebUIBackendComponent(BaseGatewayComponent):
1385
1486
  self.log_identifier,
1386
1487
  )
1387
1488
 
1388
- try:
1389
- from solace_agent_mesh_enterprise.init_enterprise import (
1390
- stop_enterprise_background_tasks,
1391
- )
1392
-
1393
- log.info(
1394
- "%s Stopping enterprise background tasks...",
1395
- self.log_identifier,
1396
- )
1397
- await stop_enterprise_background_tasks()
1398
- log.info(
1399
- "%s Enterprise background tasks stopped", self.log_identifier
1400
- )
1401
- except ImportError:
1402
- log.debug(
1403
- "%s Enterprise package not available - no background tasks to stop",
1404
- self.log_identifier,
1405
- )
1406
- except Exception as enterprise_err:
1407
- log.error(
1408
- "%s Failed to stop enterprise background tasks: %s",
1409
- self.log_identifier,
1410
- enterprise_err,
1411
- exc_info=True,
1412
- )
1413
-
1414
1489
  self.fastapi_thread = threading.Thread(
1415
1490
  target=self.uvicorn_server.run, daemon=True, name="FastAPI_Thread"
1416
1491
  )
@@ -1479,11 +1554,20 @@ class WebUIBackendComponent(BaseGatewayComponent):
1479
1554
  if self._data_retention_timer_id:
1480
1555
  self.cancel_timer(self._data_retention_timer_id)
1481
1556
  log.info("%s Cancelled data retention cleanup timer.", self.log_identifier)
1557
+
1558
+ if self._background_task_monitor_timer_id:
1559
+ self.cancel_timer(self._background_task_monitor_timer_id)
1560
+ log.info("%s Cancelled background task monitor timer.", self.log_identifier)
1482
1561
 
1483
1562
  # Clean up data retention service
1484
1563
  if self.data_retention_service:
1485
1564
  self.data_retention_service = None
1486
1565
  log.info("%s Data retention service cleaned up.", self.log_identifier)
1566
+
1567
+ # Clean up background task monitor
1568
+ if self.background_task_monitor:
1569
+ self.background_task_monitor = None
1570
+ log.info("%s Background task monitor cleaned up.", self.log_identifier)
1487
1571
 
1488
1572
  self.cancel_timer(self.health_check_timer_id)
1489
1573
  log.info("%s Cleaning up visualization resources...", self.log_identifier)
@@ -2187,6 +2271,7 @@ class WebUIBackendComponent(BaseGatewayComponent):
2187
2271
  log_id_prefix,
2188
2272
  sse_task_id,
2189
2273
  )
2274
+
2190
2275
 
2191
2276
  async def _send_error_to_external(
2192
2277
  self, external_request_context: dict[str, Any], error_data: JSONRPCError