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

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

Potentially problematic release.


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

Files changed (481) hide show
  1. solace_agent_mesh/agent/adk/alembic/README +74 -0
  2. solace_agent_mesh/agent/adk/alembic/env.py +77 -0
  3. solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
  4. solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
  5. solace_agent_mesh/agent/adk/alembic.ini +112 -0
  6. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  7. solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
  8. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
  9. solace_agent_mesh/agent/adk/callbacks.py +852 -109
  10. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
  11. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
  12. solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
  13. solace_agent_mesh/agent/adk/models/lite_llm.py +77 -21
  14. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
  15. solace_agent_mesh/agent/adk/runner.py +85 -20
  16. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  17. solace_agent_mesh/agent/adk/services.py +94 -18
  18. solace_agent_mesh/agent/adk/setup.py +281 -65
  19. solace_agent_mesh/agent/adk/stream_parser.py +231 -37
  20. solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
  21. solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
  22. solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
  23. solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
  24. solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
  25. solace_agent_mesh/agent/proxies/base/app.py +3 -2
  26. solace_agent_mesh/agent/proxies/base/component.py +188 -22
  27. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
  28. solace_agent_mesh/agent/sac/app.py +91 -3
  29. solace_agent_mesh/agent/sac/component.py +591 -157
  30. solace_agent_mesh/agent/sac/patch_adk.py +8 -16
  31. solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
  32. solace_agent_mesh/agent/tools/__init__.py +3 -0
  33. solace_agent_mesh/agent/tools/audio_tools.py +3 -3
  34. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +710 -171
  35. solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
  36. solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
  37. solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
  38. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  39. solace_agent_mesh/agent/tools/tool_config_types.py +57 -2
  40. solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
  41. solace_agent_mesh/agent/tools/web_tools.py +125 -17
  42. solace_agent_mesh/agent/utils/artifact_helpers.py +248 -6
  43. solace_agent_mesh/agent/utils/context_helpers.py +17 -0
  44. solace_agent_mesh/assets/docs/404.html +6 -6
  45. solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
  46. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  51. solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
  52. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
  62. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
  104. solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
  105. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
  106. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
  107. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
  108. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
  109. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +82 -68
  110. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  111. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
  112. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
  113. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
  114. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
  115. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
  116. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
  117. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  118. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
  119. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
  120. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  121. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
  122. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  123. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -49
  124. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
  125. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
  126. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
  127. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  128. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +90 -0
  129. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
  130. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  131. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
  132. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +162 -171
  133. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
  134. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
  135. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
  136. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
  137. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
  138. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
  139. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
  140. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
  141. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
  142. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
  143. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
  144. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
  145. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
  146. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
  147. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +23 -19
  151. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
  152. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +112 -87
  154. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +87 -64
  156. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
  158. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
  159. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
  160. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
  161. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +311 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
  164. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
  165. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
  166. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
  167. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
  168. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
  169. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
  170. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
  171. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
  172. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  173. solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
  174. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  175. solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
  176. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  177. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  178. solace_agent_mesh/cli/__init__.py +1 -1
  179. solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
  180. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
  181. solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
  182. solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
  183. solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
  184. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  185. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  186. solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
  187. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
  188. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  189. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
  190. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
  191. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  192. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
  193. solace_agent_mesh/cli/commands/run_cmd.py +64 -49
  194. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  195. solace_agent_mesh/cli/main.py +15 -0
  196. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-BTf6dqwp.js → authCallback-KnKMP_vb.js} +1 -1
  197. solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
  198. solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
  199. solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
  200. solace_agent_mesh/client/webui/frontend/static/assets/vendor-CGk8Suyh.js +565 -0
  201. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  202. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  203. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  204. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  205. solace_agent_mesh/common/a2a/events.py +2 -1
  206. solace_agent_mesh/common/a2a/protocol.py +5 -0
  207. solace_agent_mesh/common/a2a/types.py +2 -1
  208. solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
  209. solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
  210. solace_agent_mesh/common/agent_registry.py +38 -11
  211. solace_agent_mesh/common/data_parts.py +144 -4
  212. solace_agent_mesh/common/error_handlers.py +83 -0
  213. solace_agent_mesh/common/exceptions.py +24 -0
  214. solace_agent_mesh/common/oauth/__init__.py +17 -0
  215. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  216. solace_agent_mesh/common/oauth/utils.py +50 -0
  217. solace_agent_mesh/common/rag_dto.py +156 -0
  218. solace_agent_mesh/common/sac/sam_component_base.py +97 -19
  219. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  220. solace_agent_mesh/common/services/employee_service.py +1 -1
  221. solace_agent_mesh/common/utils/embeds/constants.py +1 -0
  222. solace_agent_mesh/common/utils/embeds/converter.py +1 -8
  223. solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
  224. solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
  225. solace_agent_mesh/common/utils/embeds/types.py +9 -0
  226. solace_agent_mesh/common/utils/log_formatters.py +20 -0
  227. solace_agent_mesh/common/utils/mime_helpers.py +12 -5
  228. solace_agent_mesh/common/utils/pydantic_utils.py +90 -3
  229. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  230. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  231. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  232. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  233. solace_agent_mesh/config_portal/backend/common.py +12 -0
  234. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
  235. solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
  236. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
  237. solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
  238. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
  239. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
  240. solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
  241. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  242. solace_agent_mesh/core_a2a/service.py +3 -2
  243. solace_agent_mesh/gateway/adapter/__init__.py +1 -0
  244. solace_agent_mesh/gateway/adapter/base.py +170 -0
  245. solace_agent_mesh/gateway/adapter/types.py +230 -0
  246. solace_agent_mesh/gateway/base/app.py +39 -2
  247. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  248. solace_agent_mesh/gateway/base/component.py +1027 -151
  249. solace_agent_mesh/gateway/generic/__init__.py +1 -0
  250. solace_agent_mesh/gateway/generic/app.py +50 -0
  251. solace_agent_mesh/gateway/generic/component.py +894 -0
  252. solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
  253. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
  254. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
  255. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
  256. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
  257. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  258. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  259. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  260. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  261. solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
  262. solace_agent_mesh/gateway/http_sse/app.py +40 -11
  263. solace_agent_mesh/gateway/http_sse/component.py +285 -160
  264. solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
  265. solace_agent_mesh/gateway/http_sse/main.py +68 -450
  266. solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
  267. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  268. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
  269. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
  270. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +26 -3
  271. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
  272. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
  273. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
  274. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -0
  275. solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
  276. solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
  277. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  278. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +8 -2
  279. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
  280. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
  281. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
  282. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +177 -11
  283. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
  284. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
  285. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +256 -58
  286. solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
  287. solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
  288. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  289. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  290. solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
  291. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -1
  292. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  293. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
  294. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
  295. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  296. solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
  297. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  298. solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
  299. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
  300. solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
  301. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  302. solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
  303. solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
  304. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  305. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  306. solace_agent_mesh/gateway/http_sse/routers/visualization.py +92 -9
  307. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  308. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  309. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  310. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  311. solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
  312. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  313. solace_agent_mesh/gateway/http_sse/services/session_service.py +361 -12
  314. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
  315. solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
  316. solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
  317. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  318. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
  319. solace_agent_mesh/services/__init__.py +0 -0
  320. solace_agent_mesh/services/platform/__init__.py +29 -0
  321. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  322. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  323. solace_agent_mesh/services/platform/alembic.ini +109 -0
  324. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  325. solace_agent_mesh/services/platform/api/dependencies.py +154 -0
  326. solace_agent_mesh/services/platform/api/main.py +314 -0
  327. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  328. solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
  329. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  330. solace_agent_mesh/services/platform/app.py +215 -0
  331. solace_agent_mesh/services/platform/component.py +777 -0
  332. solace_agent_mesh/shared/__init__.py +14 -0
  333. solace_agent_mesh/shared/api/__init__.py +42 -0
  334. solace_agent_mesh/shared/auth/__init__.py +26 -0
  335. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  336. solace_agent_mesh/shared/auth/middleware.py +347 -0
  337. solace_agent_mesh/shared/database/__init__.py +20 -0
  338. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  339. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  340. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  341. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  342. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +19 -5
  343. solace_agent_mesh/shared/utils/__init__.py +21 -0
  344. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  345. solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
  346. solace_agent_mesh/templates/platform.yaml +49 -0
  347. solace_agent_mesh/templates/plugin_readme_template.md +3 -25
  348. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  349. solace_agent_mesh/templates/proxy_template.yaml +62 -0
  350. solace_agent_mesh/templates/webui.yaml +148 -6
  351. solace_agent_mesh/tools/web_search/__init__.py +18 -0
  352. solace_agent_mesh/tools/web_search/base.py +84 -0
  353. solace_agent_mesh/tools/web_search/google_search.py +247 -0
  354. solace_agent_mesh/tools/web_search/models.py +99 -0
  355. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
  356. solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
  357. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
  358. solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
  359. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  360. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  361. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -142
  362. solace_agent_mesh/agent/agent_llm.txt +0 -378
  363. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  364. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  365. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  366. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  367. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  368. solace_agent_mesh/agent/testing/testing_llm.txt +0 -57
  369. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  370. solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
  371. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
  372. solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
  373. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  374. solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
  375. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
  376. solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +0 -1
  377. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  378. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  379. solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
  380. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
  381. solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
  382. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
  383. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
  384. solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
  385. solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
  386. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
  387. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
  388. solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
  389. solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
  390. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
  391. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
  392. solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
  393. solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
  394. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
  395. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
  396. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +0 -1
  397. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
  398. solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
  399. solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
  400. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
  401. solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
  402. solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
  403. solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
  404. solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
  405. solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
  406. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
  407. solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
  408. solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
  409. solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
  410. solace_agent_mesh/assets/docs/search-doc-1761248203150.json +0 -1
  411. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  412. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  413. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  414. solace_agent_mesh/client/webui/frontend/static/assets/client-CaY59VuC.js +0 -25
  415. solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
  416. solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
  417. solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
  418. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
  419. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  420. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
  421. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  422. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
  423. solace_agent_mesh/common/common_llm.txt +0 -251
  424. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  425. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  426. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  427. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  428. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  429. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  430. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  431. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -80
  432. solace_agent_mesh/common/services/services_llm.txt +0 -363
  433. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  434. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  435. solace_agent_mesh/common/utils/utils_llm.txt +0 -336
  436. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  437. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
  438. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
  439. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
  440. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
  441. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  442. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  443. solace_agent_mesh/gateway/base/base_llm.txt +0 -224
  444. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  445. solace_agent_mesh/gateway/gateway_llm.txt +0 -373
  446. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  447. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
  448. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
  449. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  450. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  451. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  452. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -263
  453. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
  454. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
  455. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
  456. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
  457. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
  458. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
  459. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
  460. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  461. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
  462. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  463. solace_agent_mesh/llm.txt +0 -228
  464. solace_agent_mesh/llm_detail.txt +0 -2835
  465. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  466. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  467. solace_agent_mesh/templates/logging_config_template.ini +0 -45
  468. solace_agent_mesh/templates/templates_llm.txt +0 -147
  469. solace_agent_mesh-1.6.1.dist-info/RECORD +0 -525
  470. /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
  471. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  472. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  473. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  474. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  475. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  476. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  477. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  478. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  479. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  480. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
  481. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,22 +1,145 @@
1
1
  """
2
2
  API Router for providing frontend configuration.
3
3
  """
4
+ from __future__ import annotations
4
5
 
5
6
  import logging
6
- from fastapi import APIRouter, Depends, HTTPException, status
7
7
  from typing import Dict, Any
8
+ from typing import TYPE_CHECKING
8
9
 
10
+ from fastapi import APIRouter, Depends, HTTPException, status
11
+
12
+ from ..routers.dto.requests.project_requests import CreateProjectRequest
9
13
  from ....gateway.http_sse.dependencies import get_sac_component, get_api_config
10
- from typing import TYPE_CHECKING
11
14
 
12
15
  if TYPE_CHECKING:
13
- from gateway.http_sse.component import WebUIBackendComponent
16
+ from ..component import WebUIBackendComponent
14
17
 
15
18
  log = logging.getLogger(__name__)
16
19
 
17
20
  router = APIRouter()
18
21
 
19
22
 
23
+ # Default max upload size (50MB) - matches gateway_max_upload_size_bytes default
24
+ DEFAULT_MAX_UPLOAD_SIZE_BYTES = 52428800
25
+ # Default max ZIP upload size (100MB) - for project import ZIP files
26
+ DEFAULT_MAX_ZIP_UPLOAD_SIZE_BYTES = 104857600
27
+
28
+
29
+ def _get_validation_limits(component: "WebUIBackendComponent" = None) -> Dict[str, Any]:
30
+ """
31
+ Extract validation limits from Pydantic models to expose to frontend.
32
+ This ensures frontend and backend validation limits stay in sync.
33
+ """
34
+ # Extract limits from CreateProjectRequest model
35
+ create_fields = CreateProjectRequest.model_fields
36
+
37
+ # Get max upload size from component config, with fallback to default
38
+ max_upload_size_bytes = (
39
+ component.get_config("gateway_max_upload_size_bytes", DEFAULT_MAX_UPLOAD_SIZE_BYTES)
40
+ if component else DEFAULT_MAX_UPLOAD_SIZE_BYTES
41
+ )
42
+
43
+ # Get max ZIP upload size from component config, with fallback to default (100MB)
44
+ max_zip_upload_size_bytes = (
45
+ component.get_config("gateway_max_zip_upload_size_bytes", DEFAULT_MAX_ZIP_UPLOAD_SIZE_BYTES)
46
+ if component else DEFAULT_MAX_ZIP_UPLOAD_SIZE_BYTES
47
+ )
48
+
49
+ return {
50
+ "projectNameMax": create_fields["name"].metadata[1].max_length if create_fields["name"].metadata else 255,
51
+ "projectDescriptionMax": create_fields["description"].metadata[0].max_length if create_fields["description"].metadata else 1000,
52
+ "projectInstructionsMax": create_fields["system_prompt"].metadata[0].max_length if create_fields["system_prompt"].metadata else 4000,
53
+ "maxUploadSizeBytes": max_upload_size_bytes,
54
+ "maxZipUploadSizeBytes": max_zip_upload_size_bytes,
55
+ }
56
+
57
+
58
+ def _get_background_tasks_config(
59
+ component: "WebUIBackendComponent",
60
+ log_prefix: str
61
+ ) -> Dict[str, Any]:
62
+ """
63
+ Extracts background tasks configuration for the frontend.
64
+
65
+ Returns:
66
+ Dict with background tasks non-boolean settings:
67
+ - default_timeout_ms: Default timeout for background tasks
68
+
69
+ Note: The 'enabled' flag is now in frontend_feature_enablement.background_tasks
70
+ """
71
+ background_config = component.get_config("background_tasks", {})
72
+ default_timeout_ms = background_config.get("default_timeout_ms", 3600000) # 1 hour default
73
+
74
+ return {
75
+ "default_timeout_ms": default_timeout_ms,
76
+ }
77
+
78
+
79
+ def _determine_background_tasks_enabled(
80
+ component: "WebUIBackendComponent",
81
+ log_prefix: str
82
+ ) -> bool:
83
+ """
84
+ Determines if background tasks feature should be enabled.
85
+
86
+ Returns:
87
+ bool: True if background tasks should be enabled
88
+ """
89
+ feature_flags = component.get_config("frontend_feature_enablement", {})
90
+ enabled = feature_flags.get("background_tasks", False)
91
+
92
+ if enabled:
93
+ log.debug("%s Background tasks enabled globally for all agents", log_prefix)
94
+ else:
95
+ log.debug("%s Background tasks disabled", log_prefix)
96
+
97
+ return enabled
98
+
99
+
100
+ def _determine_projects_enabled(
101
+ component: "WebUIBackendComponent",
102
+ api_config: Dict[str, Any],
103
+ log_prefix: str
104
+ ) -> bool:
105
+ """
106
+ Determines if projects feature should be enabled.
107
+
108
+ Logic:
109
+ 1. Check if persistence is enabled (required for projects)
110
+ 2. Check explicit projects.enabled config
111
+ 3. Check frontend_feature_enablement.projects override
112
+
113
+ Returns:
114
+ bool: True if projects should be enabled
115
+ """
116
+ # Projects require persistence
117
+ persistence_enabled = api_config.get("persistence_enabled", False)
118
+ if not persistence_enabled:
119
+ log.debug("%s Projects disabled: persistence is not enabled", log_prefix)
120
+ return False
121
+
122
+ # Check explicit projects config
123
+ projects_config = component.get_config("projects", {})
124
+ if isinstance(projects_config, dict):
125
+ projects_explicitly_enabled = projects_config.get("enabled", True)
126
+ if not projects_explicitly_enabled:
127
+ log.debug("%s Projects disabled: explicitly disabled in config", log_prefix)
128
+ return False
129
+
130
+ # Check frontend_feature_enablement override
131
+ feature_flags = component.get_config("frontend_feature_enablement", {})
132
+ if "projects" in feature_flags:
133
+ projects_flag = feature_flags.get("projects", True)
134
+ if not projects_flag:
135
+ log.debug("%s Projects disabled: disabled in frontend_feature_enablement", log_prefix)
136
+ return False
137
+
138
+ # All checks passed
139
+ log.debug("%s Projects enabled: persistence enabled and no explicit disable", log_prefix)
140
+ return True
141
+
142
+
20
143
  @router.get("/config", response_model=Dict[str, Any])
21
144
  async def get_app_config(
22
145
  component: "WebUIBackendComponent" = Depends(get_sac_component),
@@ -37,6 +160,80 @@ async def get_app_config(
37
160
  feature_enablement["taskLogging"] = True
38
161
  log.debug("%s taskLogging feature flag is enabled.", log_prefix)
39
162
 
163
+ # Determine if prompt library should be enabled
164
+ # Prompts require SQL session storage for persistence
165
+ prompt_library_config = component.get_config("prompt_library", {})
166
+ prompt_library_explicitly_enabled = prompt_library_config.get("enabled", True)
167
+
168
+ if prompt_library_explicitly_enabled:
169
+ # Check if SQL persistence is available (REQUIRED for prompts)
170
+ session_config = component.get_config("session_service", {})
171
+ session_type = session_config.get("type", "memory")
172
+
173
+ if session_type != "sql":
174
+ log.warning(
175
+ "%s Prompt library is configured but session_service type is '%s' (not 'sql'). "
176
+ "Disabling prompt library for frontend.",
177
+ log_prefix,
178
+ session_type
179
+ )
180
+ prompt_library_enabled = False
181
+ else:
182
+ prompt_library_enabled = True
183
+ feature_enablement["promptLibrary"] = True
184
+ log.debug("%s promptLibrary feature flag is enabled.", log_prefix)
185
+
186
+ # Check AI-assisted sub-feature (only if parent is enabled)
187
+ ai_assisted_config = prompt_library_config.get("ai_assisted", {})
188
+ ai_assisted_enabled = ai_assisted_config.get("enabled", True)
189
+
190
+ if ai_assisted_enabled:
191
+ # Verify LLM is configured through the model config
192
+ model_config = component.get_config("model", {})
193
+
194
+ llm_model = None
195
+ if isinstance(model_config, dict):
196
+ llm_model = model_config.get("model")
197
+
198
+ if llm_model:
199
+ feature_enablement["promptAIAssisted"] = True
200
+ log.debug("%s promptAIAssisted feature flag is enabled.", log_prefix)
201
+ else:
202
+ feature_enablement["promptAIAssisted"] = False
203
+ log.warning(
204
+ "%s AI-assisted prompts disabled: model not configured",
205
+ log_prefix
206
+ )
207
+ else:
208
+ feature_enablement["promptAIAssisted"] = False
209
+
210
+ # Check version history sub-feature (only if parent is enabled)
211
+ version_history_config = prompt_library_config.get("version_history", {})
212
+ version_history_enabled = version_history_config.get("enabled", True)
213
+
214
+ if version_history_enabled:
215
+ feature_enablement["promptVersionHistory"] = True
216
+ log.debug("%s promptVersionHistory feature flag is enabled.", log_prefix)
217
+ else:
218
+ feature_enablement["promptVersionHistory"] = False
219
+
220
+ # Check prompt sharing sub-feature (only if parent is enabled)
221
+ sharing_config = prompt_library_config.get("sharing", {})
222
+ sharing_enabled = sharing_config.get("enabled", False)
223
+
224
+ if sharing_enabled:
225
+ feature_enablement["promptSharing"] = True
226
+ log.debug("%s promptSharing feature flag is enabled.", log_prefix)
227
+ else:
228
+ feature_enablement["promptSharing"] = False
229
+ else:
230
+ # Explicitly set to false when disabled
231
+ feature_enablement["promptLibrary"] = False
232
+ feature_enablement["promptAIAssisted"] = False
233
+ feature_enablement["promptVersionHistory"] = False
234
+ feature_enablement["promptSharing"] = False
235
+ log.info("%s Prompt library feature is explicitly disabled.", log_prefix)
236
+
40
237
  # Determine if feedback should be enabled
41
238
  # Feedback requires SQL session storage for persistence
42
239
  feedback_enabled = component.get_config("frontend_collect_feedback", False)
@@ -51,25 +248,122 @@ async def get_app_config(
51
248
  session_type
52
249
  )
53
250
  feedback_enabled = False
251
+
252
+ # Determine if projects should be enabled
253
+ # Projects require SQL session storage for persistence
254
+ projects_enabled = _determine_projects_enabled(component, api_config, log_prefix)
255
+ feature_enablement["projects"] = projects_enabled
256
+ if projects_enabled:
257
+ log.debug("%s Projects feature flag is enabled.", log_prefix)
258
+ else:
259
+ log.debug("%s Projects feature flag is disabled.", log_prefix)
260
+
261
+
262
+ # Determine if background tasks should be enabled
263
+ background_tasks_enabled = _determine_background_tasks_enabled(component, log_prefix)
264
+ feature_enablement["background_tasks"] = background_tasks_enabled
265
+ if background_tasks_enabled:
266
+ log.debug("%s Background tasks feature flag is enabled.", log_prefix)
267
+ else:
268
+ log.debug("%s Background tasks feature flag is disabled.", log_prefix)
269
+
270
+ # Check tool configuration status
271
+ tool_config_status = {}
272
+
273
+ # Check TTS configuration from component config (not environment variables)
274
+ speech_config = component.get_config("speech", {})
275
+ tts_config = speech_config.get("tts", {})
276
+
277
+ # Check if speech/TTS section is defined in config
278
+ # If not defined, disable TTS even if keys might be present elsewhere
279
+ if not speech_config or not tts_config:
280
+ log.debug("%s TTS disabled: speech.tts section not configured", log_prefix)
281
+ tts_configured = False
282
+ tts_provider = "gemini" # Default fallback
283
+ else:
284
+ # Get provider from config (with fallback to default)
285
+ preferred_provider = tts_config.get("provider", "gemini").lower()
286
+
287
+ # Check which providers are configured
288
+ gemini_config = tts_config.get("gemini", {})
289
+ azure_config = tts_config.get("azure", {})
290
+ polly_config = tts_config.get("polly", {})
291
+
292
+ gemini_key = gemini_config.get("api_key")
293
+ azure_speech_key = azure_config.get("api_key")
294
+ azure_speech_region = azure_config.get("region")
295
+ aws_access_key = polly_config.get("aws_access_key_id")
296
+ aws_secret_key = polly_config.get("aws_secret_access_key")
297
+
298
+ # Determine which providers are available
299
+ gemini_available = bool(gemini_key)
300
+ azure_available = bool(azure_speech_key and azure_speech_region)
301
+ polly_available = bool(aws_access_key and aws_secret_key)
302
+ tts_configured = gemini_available or azure_available or polly_available
303
+ tool_config_status["text_to_speech"] = tts_configured
304
+
305
+ # Determine TTS provider based on preference and availability
306
+ if preferred_provider == "azure" and azure_available:
307
+ tts_provider = "azure"
308
+ elif preferred_provider == "gemini" and gemini_available:
309
+ tts_provider = "gemini"
310
+ elif preferred_provider == "polly" and polly_available:
311
+ tts_provider = "polly"
312
+ elif gemini_available:
313
+ # Default to Gemini if available
314
+ tts_provider = "gemini"
315
+ elif azure_available:
316
+ # Fall back to Azure if Gemini not available
317
+ tts_provider = "azure"
318
+ elif polly_available:
319
+ # Fall back to Polly if others not available
320
+ tts_provider = "polly"
321
+ else:
322
+ # No provider available, default to gemini (will use browser fallback)
323
+ tts_provider = "gemini"
324
+
325
+ if tts_configured:
326
+ log.debug("%s TTS is configured (API keys present, provider: %s)", log_prefix, tts_provider)
327
+ if preferred_provider and preferred_provider != tts_provider:
328
+ log.warning(
329
+ "%s TTS_PROVIDER set to '%s' but using '%s' (preferred provider not available)",
330
+ log_prefix, preferred_provider, tts_provider
331
+ )
332
+ else:
333
+ log.debug("%s TTS not configured (no API keys found)", log_prefix)
334
+
335
+ # TTS settings - enable if API keys are present
336
+ tts_settings = {
337
+ "textToSpeech": tts_configured,
338
+ "engineTTS": "external" if tts_configured else "browser",
339
+ "ttsProvider": tts_provider,
340
+ }
341
+
342
+ platform_config = component.get_config("platform_service", {})
343
+ platform_service_url = platform_config.get("url", "")
54
344
 
55
345
  config_data = {
56
- "frontend_server_url": "",
346
+ "frontend_server_url": component.frontend_server_url,
347
+ "frontend_platform_server_url": platform_service_url,
57
348
  "frontend_auth_login_url": component.get_config(
58
349
  "frontend_auth_login_url", ""
59
350
  ),
60
- "frontend_use_authorization": component.get_config(
61
- "frontend_use_authorization", False
62
- ),
351
+ "frontend_use_authorization": component.get_config("frontend_use_authorization", False),
63
352
  "frontend_welcome_message": component.get_config(
64
353
  "frontend_welcome_message", ""
65
354
  ),
66
355
  "frontend_redirect_url": component.get_config("frontend_redirect_url", ""),
67
356
  "frontend_collect_feedback": feedback_enabled,
68
357
  "frontend_bot_name": component.get_config("frontend_bot_name", "A2A Agent"),
358
+ "frontend_logo_url": component.get_config("frontend_logo_url", ""),
69
359
  "frontend_feature_enablement": feature_enablement,
70
360
  "persistence_enabled": api_config.get("persistence_enabled", False),
361
+ "validation_limits": _get_validation_limits(component),
362
+ "tool_config_status": tool_config_status,
363
+ "tts_settings": tts_settings,
364
+ "background_tasks_config": _get_background_tasks_config(component, log_prefix),
71
365
  }
72
- log.info("%sReturning frontend configuration.", log_prefix)
366
+ log.debug("%sReturning frontend configuration.", log_prefix)
73
367
  return config_data
74
368
  except Exception as e:
75
369
  log.exception(
@@ -0,0 +1,69 @@
1
+ """
2
+ Project export/import DTOs.
3
+ """
4
+
5
+ from typing import Optional, List, Dict, Any
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class ArtifactMetadata(BaseModel):
10
+ """Metadata for an artifact in export"""
11
+ filename: str
12
+ mime_type: str = Field(alias="mimeType")
13
+ size: int
14
+ metadata: Dict[str, Any] = {}
15
+
16
+ model_config = {"populate_by_name": True}
17
+
18
+
19
+ class ProjectExportMetadata(BaseModel):
20
+ """Metadata for exported project"""
21
+ original_created_at: int = Field(alias="originalCreatedAt")
22
+ artifact_count: int = Field(alias="artifactCount")
23
+ total_size_bytes: int = Field(alias="totalSizeBytes")
24
+
25
+ model_config = {"populate_by_name": True}
26
+
27
+
28
+ class ProjectExportData(BaseModel):
29
+ """Project data in export format"""
30
+ name: str
31
+ description: Optional[str] = None
32
+ system_prompt: Optional[str] = Field(default=None, alias="systemPrompt")
33
+ default_agent_id: Optional[str] = Field(default=None, alias="defaultAgentId")
34
+ metadata: ProjectExportMetadata
35
+
36
+ model_config = {"populate_by_name": True}
37
+
38
+
39
+ class ProjectExportFormat(BaseModel):
40
+ """Complete export format"""
41
+ version: str = "1.0"
42
+ exported_at: int = Field(alias="exportedAt")
43
+ project: ProjectExportData
44
+ artifacts: List[ArtifactMetadata] = []
45
+
46
+ model_config = {"populate_by_name": True}
47
+
48
+
49
+ class ProjectImportOptions(BaseModel):
50
+ """Options for project import"""
51
+ preserve_name: bool = Field(default=False, alias="preserveName")
52
+ custom_name: Optional[str] = Field(default=None, alias="customName")
53
+
54
+ model_config = {"populate_by_name": True}
55
+
56
+
57
+ class ProjectImportRequest(BaseModel):
58
+ """Request for importing project"""
59
+ options: ProjectImportOptions
60
+
61
+
62
+ class ProjectImportResponse(BaseModel):
63
+ """Response after importing project"""
64
+ project_id: str = Field(alias="projectId")
65
+ name: str
66
+ artifacts_imported: int = Field(alias="artifactsImported")
67
+ warnings: List[str] = []
68
+
69
+ model_config = {"populate_by_name": True}
@@ -0,0 +1,255 @@
1
+ """
2
+ Pydantic models for prompt library API.
3
+ """
4
+
5
+ from typing import Any, Dict, List, Optional
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class PromptBase(BaseModel):
10
+ """Base schema for Prompt"""
11
+ prompt_text: str = Field(
12
+ ...,
13
+ min_length=1,
14
+ max_length=10000,
15
+ description="The prompt text content",
16
+ alias="promptText"
17
+ )
18
+
19
+ class Config:
20
+ populate_by_name = True
21
+
22
+
23
+ class PromptCreate(PromptBase):
24
+ """Schema for creating a new prompt version"""
25
+ pass
26
+
27
+
28
+ class PromptResponse(PromptBase):
29
+ """Schema for prompt response"""
30
+ id: str
31
+ group_id: str = Field(alias="groupId")
32
+ user_id: str = Field(alias="userId")
33
+ version: int
34
+ # Versioned metadata fields
35
+ name: Optional[str] = Field(None, description="Prompt name at this version")
36
+ description: Optional[str] = Field(None, description="Prompt description at this version")
37
+ category: Optional[str] = Field(None, description="Prompt category at this version")
38
+ command: Optional[str] = Field(None, description="Prompt command at this version")
39
+ created_at: int = Field(alias="createdAt") # epoch milliseconds
40
+ updated_at: int = Field(alias="updatedAt") # epoch milliseconds
41
+
42
+ class Config:
43
+ from_attributes = True
44
+ populate_by_name = True
45
+
46
+
47
+ class PromptGroupBase(BaseModel):
48
+ """Base schema for PromptGroup"""
49
+ name: str = Field(
50
+ ...,
51
+ min_length=1,
52
+ max_length=255,
53
+ description="Name of the prompt group"
54
+ )
55
+ description: Optional[str] = Field(
56
+ None,
57
+ max_length=1000,
58
+ description="Short description"
59
+ )
60
+ category: Optional[str] = Field(
61
+ None,
62
+ max_length=100,
63
+ description="Category for organization"
64
+ )
65
+ command: Optional[str] = Field(
66
+ None,
67
+ min_length=1,
68
+ max_length=50,
69
+ pattern="^[a-zA-Z0-9_-]+$",
70
+ description="Shorthand command (alphanumeric, dash, underscore only)"
71
+ )
72
+
73
+
74
+ class PromptGroupCreate(PromptGroupBase):
75
+ """Schema for creating a new prompt group"""
76
+ initial_prompt: str = Field(
77
+ ...,
78
+ min_length=1,
79
+ max_length=10000,
80
+ description="Initial prompt text"
81
+ )
82
+
83
+
84
+ class PromptGroupUpdate(BaseModel):
85
+ """Schema for updating a prompt group"""
86
+ name: Optional[str] = Field(None, min_length=1, max_length=255)
87
+ description: Optional[str] = Field(None, max_length=1000)
88
+ category: Optional[str] = Field(None, max_length=100)
89
+ command: Optional[str] = Field(
90
+ None,
91
+ min_length=1,
92
+ max_length=50,
93
+ pattern="^[a-zA-Z0-9_-]+$"
94
+ )
95
+ initial_prompt: Optional[str] = Field(
96
+ None,
97
+ min_length=1,
98
+ max_length=10000,
99
+ description="Updated prompt text (creates new version if changed)"
100
+ )
101
+
102
+
103
+ class PromptGroupResponse(PromptGroupBase):
104
+ """Schema for prompt group response"""
105
+ id: str
106
+ user_id: str = Field(alias="userId")
107
+ author_name: Optional[str] = Field(None, alias="authorName")
108
+ production_prompt_id: Optional[str] = Field(None, alias="productionPromptId")
109
+ is_shared: bool = Field(alias="isShared")
110
+ is_pinned: bool = Field(alias="isPinned")
111
+ created_at: int = Field(alias="createdAt") # epoch milliseconds
112
+ updated_at: int = Field(alias="updatedAt") # epoch milliseconds
113
+
114
+ # Include production prompt if available
115
+ production_prompt: Optional[PromptResponse] = Field(None, alias="productionPrompt")
116
+
117
+ class Config:
118
+ from_attributes = True
119
+ populate_by_name = True
120
+
121
+
122
+ class PromptGroupListResponse(BaseModel):
123
+ """Schema for paginated prompt group list"""
124
+ groups: List[PromptGroupResponse]
125
+ total: int
126
+ skip: int
127
+ limit: int
128
+
129
+
130
+ # AI-Assisted Prompt Builder Models
131
+
132
+ class ChatMessage(BaseModel):
133
+ """Schema for a chat message"""
134
+ role: str = Field(
135
+ ...,
136
+ pattern="^(user|assistant)$",
137
+ description="Message role"
138
+ )
139
+ content: str = Field(..., min_length=1, description="Message content")
140
+
141
+
142
+ class PromptBuilderChatRequest(BaseModel):
143
+ """Schema for prompt builder chat request"""
144
+ message: str = Field(
145
+ ...,
146
+ min_length=1,
147
+ max_length=200000,
148
+ description="User message (supports long conversation histories for template creation)"
149
+ )
150
+ conversation_history: List[ChatMessage] = Field(
151
+ default_factory=list,
152
+ description="Previous messages"
153
+ )
154
+ current_template: Optional[Dict[str, Any]] = Field(
155
+ None,
156
+ description="Current template state"
157
+ )
158
+
159
+
160
+ class PromptBuilderChatResponse(BaseModel):
161
+ """Schema for prompt builder chat response"""
162
+ message: str = Field(..., description="Assistant's response message")
163
+ template_updates: Dict[str, Any] = Field(
164
+ default_factory=dict,
165
+ description="Updates to template config"
166
+ )
167
+ confidence: float = Field(
168
+ 0.0,
169
+ ge=0.0,
170
+ le=1.0,
171
+ description="Confidence score"
172
+ )
173
+ ready_to_save: bool = Field(
174
+ False,
175
+ description="Whether template is ready to save"
176
+ )
177
+
178
+
179
+ # Export/Import Models
180
+
181
+ class PromptExportMetadata(BaseModel):
182
+ """Metadata for exported prompt"""
183
+ author_name: Optional[str] = Field(None, alias="authorName")
184
+ original_version: int = Field(alias="originalVersion")
185
+ original_created_at: int = Field(alias="originalCreatedAt")
186
+
187
+ class Config:
188
+ populate_by_name = True
189
+
190
+
191
+ class PromptExportData(BaseModel):
192
+ """Data structure for exported prompt"""
193
+ name: str
194
+ description: Optional[str] = None
195
+ category: Optional[str] = None
196
+ command: Optional[str] = None
197
+ prompt_text: str = Field(alias="promptText")
198
+ metadata: PromptExportMetadata
199
+
200
+ class Config:
201
+ populate_by_name = True
202
+
203
+
204
+ class PromptExportResponse(BaseModel):
205
+ """Schema for exported prompt file"""
206
+ version: str = "1.0"
207
+ exported_at: int = Field(alias="exportedAt")
208
+ prompt: PromptExportData
209
+
210
+ class Config:
211
+ populate_by_name = True
212
+ by_alias = True
213
+
214
+
215
+ class PromptImportOptions(BaseModel):
216
+ """Options for importing a prompt"""
217
+ preserve_command: bool = Field(
218
+ False,
219
+ alias="preserveCommand",
220
+ description="If true, attempt to keep original command (may be modified if conflict exists)"
221
+ )
222
+ preserve_category: bool = Field(
223
+ True,
224
+ alias="preserveCategory",
225
+ description="If true, keep the original category"
226
+ )
227
+
228
+ class Config:
229
+ populate_by_name = True
230
+
231
+
232
+ class PromptImportRequest(BaseModel):
233
+ """Schema for importing a prompt"""
234
+ prompt_data: Dict[str, Any] = Field(
235
+ ...,
236
+ description="The exported prompt JSON data"
237
+ )
238
+ options: Optional[PromptImportOptions] = Field(
239
+ default_factory=PromptImportOptions,
240
+ description="Import options"
241
+ )
242
+
243
+
244
+ class PromptImportResponse(BaseModel):
245
+ """Schema for import response"""
246
+ success: bool
247
+ prompt_group_id: str = Field(alias="promptGroupId")
248
+ warnings: List[str] = Field(
249
+ default_factory=list,
250
+ description="Any warnings generated during import (e.g., command conflicts)"
251
+ )
252
+
253
+ class Config:
254
+ populate_by_name = True
255
+ by_alias = True